From 662afb099e8bb65b4617a770f0c615647eb4848e Mon Sep 17 00:00:00 2001 From: Romain Boman <r.boman@uliege.be> Date: Fri, 28 Oct 2022 17:18:29 +0200 Subject: [PATCH] remove all files --- .clang-format | 11 - .editorconfig | 8 - .gitattributes | 6 - .gitignore | 66 - .gitlab-ci.yml | 116 - .gitmodules | 3 - CMake/FindMPI4PY.cmake | 42 - CMake/disable-trilinos.cmake | 17 - CMake/fabulous.cmake | 16 - CMake/maclam.cmake | 19 - CMake/mingw32-msys.cmake | 26 - CMake/mingw32.cmake | 28 - CMake/msys2.cmake | 24 - CMakeLists.txt | 181 - CODEOWNERS | 16 - Doxyfile.in | 2493 -------- LICENSE | 201 - README.md | 42 +- dox/flow.png | Bin 2240929 -> 0 bytes dox/img.png | Bin 681759 -> 0 bytes dox/logo.jpg | Bin 10837 -> 0 bytes ext/CMakeLists.txt | 1 - ext/amfe | 1 - heat/CMakeLists.txt | 20 - heat/__init__.py | 22 - heat/_src/CMakeLists.txt | 52 - heat/_src/heatw.i | 102 - heat/broken/heat_multiscale.py | 111 - heat/broken/honeycomb_jalil.geo | 71 - heat/broken/honeycomb_jalil.py | 55 - heat/broken/jalil1.py | 247 - heat/broken/jalil1_corner.geo | 23 - heat/broken/jalil1_micro.geo | 60 - heat/broken/jalil1_micro.py | 34 - heat/broken/jalil2.py | 270 - heat/broken/jalil2_honey.geo | 71 - heat/broken/jalil2_honey.py | 54 - heat/broken/jalil2_taskpull.py | 82 - heat/broken/rve.geo | 60 - heat/broken/rve.py | 32 - heat/fe2.py | 305 - heat/matlab/rotK.m | 26 - heat/models/__init__.py | 0 heat/models/honeycomb.geo | 93 - heat/models/rect.geo | 33 - heat/models/rect.py | 71 - heat/models/rect_stru.geo | 44 - heat/src/CMakeLists.txt | 27 - heat/src/heat.h | 57 - heat/src/wBoundary.cpp | 35 - heat/src/wBoundary.h | 50 - heat/src/wCompiledFct.cpp | 18 - heat/src/wCompiledFct.h | 104 - heat/src/wDirichlet.cpp | 66 - heat/src/wDirichlet.h | 55 - heat/src/wDisplayHook.cpp | 32 - heat/src/wDisplayHook.h | 41 - heat/src/wExtractor.cpp | 51 - heat/src/wExtractor.h | 50 - heat/src/wHeatTerm.cpp | 148 - heat/src/wHeatTerm.h | 45 - heat/src/wMedium.cpp | 41 - heat/src/wMedium.h | 51 - heat/src/wPeriodic.cpp | 233 - heat/src/wPeriodic.h | 82 - heat/src/wProblem.cpp | 58 - heat/src/wProblem.h | 67 - heat/src/wSolver.cpp | 712 --- heat/src/wSolver.h | 79 - heat/src/wSource.cpp | 35 - heat/src/wSource.h | 52 - heat/tests/basics/anisotropy.py | 56 - heat/tests/basics/dirichletx.py | 35 - heat/tests/basics/dirichletx_stru.py | 34 - heat/tests/basics/dirichlety.py | 35 - heat/tests/basics/mat2hole.geo | 79 - heat/tests/basics/mat2hole.py | 61 - heat/tests/basics/source.py | 35 - heat/tests/directors/material.py | 99 - heat/tests/directors/neumann.py | 73 - heat/tests/directors/source.py | 74 - heat/tests/fe2/Lmacro.geo | 37 - heat/tests/fe2/Lmicro.geo | 33 - heat/tests/fe2/Lmpi.py | 92 - heat/tests/fe2/heat_mpi.py | 94 - heat/tests/fe2/heat_mpi.sge.sh | 35 - heat/tests/fe2/heat_mpi.slurm.sh | 25 - heat/tests/fe2/macro.geo | 50 - heat/tests/fe2/micro.geo | 63 - heat/tests/fe2/micro.py | 50 - heat/tests/nonlinear/mat2.geo | 72 - heat/tests/nonlinear/mat2vark.py | 67 - heat/tests/periodic/honeycomb.py | 72 - heat/tests/periodic/lincomb.py | 137 - heat/tests/periodic/lincomb_fast.py | 114 - heat/utils.py | 77 - heat/viewer.py | 49 - katoptron/CMAME/MG/beam.geo | 81 - katoptron/CMAME/MG/beam.py | 240 - katoptron/CMAME/MG/post.py | 141 - katoptron/CMAME/__init__.py | 1 - katoptron/CMAME/mesh/plate.geo | 86 - katoptron/CMAME/mesh/plate_1.geo | 81 - katoptron/CMAME/mesh/plate_2.geo | 86 - katoptron/CMAME/mesh/plate_2_extended.geo | 174 - katoptron/CMAME/model.py | 369 -- .../CMAME/old_slurm/blake_GS_omega.slurm.sh | 14 - .../CMAME/old_slurm/blake_MC_GS.slurm.sh | 20 - .../old_slurm/blake_MC_GS_direct.slurm.sh | 22 - .../old_slurm/blake_MC_GS_fused.slurm.sh | 20 - .../old_slurm/blake_MC_GS_fused_prec.slurm.sh | 20 - .../CMAME/old_slurm/blake_MC_MG.slurm.sh | 22 - .../CMAME/old_slurm/blake_MC_MG_2.slurm.sh | 22 - .../CMAME/old_slurm/blake_MC_direct.slurm.sh | 23 - .../CMAME/old_slurm/blake_NO_EP.slurm.sh | 17 - .../blake_convergence_direct.slurm.sh | 14 - .../old_slurm/blake_correlation.slurm.sh | 20 - .../blake_eigenvalues_direct.slurm.sh | 14 - .../old_slurm/blake_eigenvalues_gs.slurm.sh | 14 - .../CMAME/old_slurm/blake_gamma.slurm.sh | 20 - katoptron/CMAME/old_slurm/blake_prec.slurm.sh | 20 - .../old_slurm/blake_prec_GS_direct.slurm.sh | 20 - .../blake_prec_GS_direct_lvl.slurm.sh | 20 - katoptron/CMAME/old_slurm/bowman.slurm.sh | 21 - katoptron/CMAME/old_tests/2_cubes_patch_GS.py | 153 - .../CMAME/old_tests/2_cubes_patch_GS_klu.py | 169 - .../CMAME/old_tests/2_cubes_patch_direct.py | 153 - katoptron/CMAME/old_tests/clean_A_B.py | 87 - katoptron/CMAME/old_tests/compare_GB.py | 181 - .../CMAME/old_tests/cube_deltas_omegas_GS.py | 132 - .../old_tests/fused_plate_MC_GS_all_cases.py | 273 - .../old_tests/fused_plate_mean_prec_GS.py | 248 - .../old_tests/fused_plate_mean_prec_GS_2.py | 248 - .../old_tests/fused_plate_mean_prec_GS_3.py | 248 - .../old_tests/fused_plate_mean_prec_GS_4.py | 248 - katoptron/CMAME/old_tests/plate.py | 69 - .../CMAME/old_tests/plate_MC_GS_all_cases.py | 136 - .../CMAME/old_tests/plate_MC_GS_case_1.py | 95 - .../CMAME/old_tests/plate_MC_GS_case_2.py | 96 - .../CMAME/old_tests/plate_MC_GS_case_3.py | 99 - .../CMAME/old_tests/plate_MC_GS_case_4.py | 100 - .../old_tests/plate_MC_GS_direct_all_cases.py | 145 - .../CMAME/old_tests/plate_MC_MG_all_cases.py | 156 - .../old_tests/plate_MC_MG_all_cases_2.py | 162 - .../CMAME/old_tests/plate_MC_NO_EP_case_1.py | 98 - .../old_tests/plate_MC_NO_EP_case_1_sp.py | 95 - .../CMAME/old_tests/plate_MC_NO_EP_case_2.py | 100 - .../CMAME/old_tests/plate_MC_NO_EP_case_3.py | 103 - .../CMAME/old_tests/plate_MC_NO_EP_case_4.py | 104 - .../CMAME/old_tests/plate_MC_direct_case_1.py | 98 - .../CMAME/old_tests/plate_MC_direct_case_2.py | 100 - .../CMAME/old_tests/plate_MC_direct_case_3.py | 103 - .../CMAME/old_tests/plate_MC_direct_case_4.py | 104 - .../old_tests/plate_convergence_direct.py | 85 - .../CMAME/old_tests/plate_correlation.py | 107 - .../CMAME/old_tests/plate_deltas_omegas_GS.py | 120 - .../old_tests/plate_deltas_omegas_direct.py | 111 - .../CMAME/old_tests/plate_eigenvalues.py | 64 - .../old_tests/plate_eigenvalues_gamma.py | 67 - katoptron/CMAME/old_tests/plate_extended.py | 67 - katoptron/CMAME/old_tests/plate_mean_gamma.py | 106 - katoptron/CMAME/old_tests/plate_mean_prec.py | 151 - .../old_tests/plate_mean_prec_GS_direct.py | 196 - .../plate_mean_prec_GS_direct_lvl.py | 197 - .../plate_mean_prec_GS_direct_opti.py | 119 - .../CMAME/old_tests/plate_vd_Direct_200.py | 104 - .../CMAME/old_tests/plate_vd_Direct_3.py | 104 - katoptron/CMAME/old_tests/plate_vd_GS_200.py | 108 - .../old_tests/plate_vd_GS_200_with_gamma.py | 107 - katoptron/CMAME/old_tests/plate_vd_GS_3.py | 110 - .../old_tests/plate_vd_GS_3_with_gamma.py | 100 - katoptron/CMAME/old_tests/plate_vd_conf.py | 106 - katoptron/CMAME/plate_SPD/blake.slurm.sh | 20 - katoptron/CMAME/plate_SPD/plate.geo | 43 - katoptron/CMAME/plate_SPD/plate.py | 288 - .../CMAME/plate_SPD/plate_convergence.py | 345 - katoptron/CMAME/post_process/2_cube.py | 36 - katoptron/CMAME/post_process/grouping.py | 73 - .../CMAME/post_process/juelich_speedup.py | 68 - katoptron/CMAME/post_process/plate_G.py | 212 - .../CMAME/post_process/plate_GS_direct.py | 318 - .../post_process/plate_GS_direct_fused.py | 278 - katoptron/CMAME/post_process/plate_MC.py | 357 -- .../CMAME/post_process/plate_MC_MG_speedup.py | 73 - .../plate_MC_MG_speedup_200_ER.py | 74 - .../post_process/plate_MC_MG_speedup_ER.py | 74 - .../post_process/plate_MC_MG_speedup_NER.py | 75 - .../CMAME/post_process/plate_MC_MG_total.py | 73 - .../CMAME/post_process/plate_MC_MG_total_2.py | 76 - .../plate_MC_MG_total_2_analysis.py | 72 - katoptron/CMAME/post_process/plate_MC_QoI.py | 47 - .../post_process/plate_MC_QoI_analysis.py | 67 - .../post_process/plate_MC_convergence.py | 90 - .../post_process/plate_MC_convergence_2.py | 573 -- .../post_process/plate_MC_convergence_3.py | 159 - .../CMAME/post_process/plate_MC_speedup.py | 68 - .../CMAME/post_process/plate_convergence.py | 31 - katoptron/CMAME/post_process/plate_cor_R.py | 92 - .../CMAME/post_process/plate_deltas_omegas.py | 207 - .../plate_deltas_omegas_direct_analysis.py | 168 - .../plate_deltas_omegas_gs_analysis.py | 170 - katoptron/CMAME/post_process/plate_gamma.py | 40 - katoptron/CMAME/post_process/plate_gamma_R.py | 82 - katoptron/CMAME/post_process/plate_mean.py | 196 - katoptron/CMAME/post_process/plate_mean_GS.py | 292 - .../CMAME/post_process/plate_mean_GS_omega.py | 65 - .../post_process/plate_mean_convergence.py | 223 - katoptron/CMAME/slurm/blake_MC_MG.slurm.sh | 53 - .../CMAME/tests/plate_MC_MG_all_cases.py | 110 - katoptron/CMakeLists.txt | 12 - katoptron/Juelich/UQ/GS.py | 290 - katoptron/Juelich/UQ/GS_2.py | 198 - katoptron/Juelich/UQ/__init__.py | 2 - katoptron/Juelich/UQ/copulas.py | 12 - katoptron/Juelich/UQ/halton.py | 392 -- katoptron/Juelich/UQ/kde.py | 70 - katoptron/Juelich/UQ/mirror.py | 605 -- katoptron/Juelich/UQ/mirror_2.py | 73 - katoptron/Juelich/UQ/mirror_PCE.py | 235 - .../Juelich/UQ/mirror_PCE_convergence.py | 353 -- katoptron/Juelich/UQ/preload.py | 159 - katoptron/Juelich/UQ/speedup.py | 409 -- katoptron/Juelich/UQ/test_halton.py | 67 - katoptron/Juelich/UQ/test_kde.py | 49 - katoptron/Juelich/__init__.py | 2 - katoptron/Juelich/broken/M1.py | 315 - katoptron/Juelich/broken/M1_assembly.py | 236 - .../Juelich/broken/M1_assembly_fused_all.py | 354 -- .../Juelich/broken/M1_assembly_fused_mm.py | 355 -- katoptron/Juelich/broken/M1_assembly_mm.py | 454 -- katoptron/Juelich/broken/M1_mirror_optic.py | 91 - katoptron/Juelich/broken/M1_optic_test.py | 148 - katoptron/Juelich/broken/M1_run.sh | 4 - .../mesh/contact_mirror_assembly_mm.brep | 3 - .../mesh/contact_mirror_assembly_mm.geo | 367 -- .../mesh/fused_mirror_assembly_all_mm.brep | 3 - .../mesh/fused_mirror_assembly_all_mm.geo | 694 -- .../mesh/fused_mirror_assembly_mm.brep | 3 - .../Juelich/mesh/fused_mirror_assembly_mm.geo | 324 - katoptron/Juelich/post_process/AB.py | 111 - katoptron/Juelich/post_process/__init__.py | 2 - .../Juelich/post_process/vtk_post_process.py | 328 - .../post_process/vtk_post_process_2.py | 961 --- katoptron/Juelich/samples_files/Xiao_1.npz | Bin 372 -> 0 bytes katoptron/Juelich/samples_files/Xiao_10.npz | Bin 682 -> 0 bytes katoptron/Juelich/samples_files/Xiao_11.npz | Bin 720 -> 0 bytes katoptron/Juelich/samples_files/Xiao_12.npz | Bin 779 -> 0 bytes katoptron/Juelich/samples_files/Xiao_13.npz | Bin 833 -> 0 bytes katoptron/Juelich/samples_files/Xiao_14.npz | Bin 898 -> 0 bytes katoptron/Juelich/samples_files/Xiao_15.npz | Bin 964 -> 0 bytes katoptron/Juelich/samples_files/Xiao_16.npz | Bin 1044 -> 0 bytes katoptron/Juelich/samples_files/Xiao_17.npz | Bin 1094 -> 0 bytes katoptron/Juelich/samples_files/Xiao_18.npz | Bin 1188 -> 0 bytes katoptron/Juelich/samples_files/Xiao_19.npz | Bin 1248 -> 0 bytes katoptron/Juelich/samples_files/Xiao_2.npz | Bin 381 -> 0 bytes katoptron/Juelich/samples_files/Xiao_20.npz | Bin 1332 -> 0 bytes katoptron/Juelich/samples_files/Xiao_21.npz | Bin 1409 -> 0 bytes katoptron/Juelich/samples_files/Xiao_22.npz | Bin 1497 -> 0 bytes katoptron/Juelich/samples_files/Xiao_23.npz | Bin 1590 -> 0 bytes katoptron/Juelich/samples_files/Xiao_24.npz | Bin 1681 -> 0 bytes katoptron/Juelich/samples_files/Xiao_25.npz | Bin 1768 -> 0 bytes katoptron/Juelich/samples_files/Xiao_26.npz | Bin 1873 -> 0 bytes katoptron/Juelich/samples_files/Xiao_27.npz | Bin 1984 -> 0 bytes katoptron/Juelich/samples_files/Xiao_28.npz | Bin 2076 -> 0 bytes katoptron/Juelich/samples_files/Xiao_29.npz | Bin 2191 -> 0 bytes katoptron/Juelich/samples_files/Xiao_3.npz | Bin 445 -> 0 bytes katoptron/Juelich/samples_files/Xiao_30.npz | Bin 2310 -> 0 bytes katoptron/Juelich/samples_files/Xiao_31.npz | Bin 2427 -> 0 bytes katoptron/Juelich/samples_files/Xiao_32.npz | Bin 2559 -> 0 bytes katoptron/Juelich/samples_files/Xiao_33.npz | Bin 2684 -> 0 bytes katoptron/Juelich/samples_files/Xiao_34.npz | Bin 2807 -> 0 bytes katoptron/Juelich/samples_files/Xiao_35.npz | Bin 2956 -> 0 bytes katoptron/Juelich/samples_files/Xiao_36.npz | Bin 3081 -> 0 bytes katoptron/Juelich/samples_files/Xiao_37.npz | Bin 3191 -> 0 bytes katoptron/Juelich/samples_files/Xiao_38.npz | Bin 3318 -> 0 bytes katoptron/Juelich/samples_files/Xiao_39.npz | Bin 3497 -> 0 bytes katoptron/Juelich/samples_files/Xiao_4.npz | Bin 445 -> 0 bytes katoptron/Juelich/samples_files/Xiao_40.npz | Bin 3656 -> 0 bytes katoptron/Juelich/samples_files/Xiao_41.npz | Bin 3770 -> 0 bytes katoptron/Juelich/samples_files/Xiao_42.npz | Bin 3964 -> 0 bytes katoptron/Juelich/samples_files/Xiao_43.npz | Bin 4111 -> 0 bytes katoptron/Juelich/samples_files/Xiao_44.npz | Bin 4245 -> 0 bytes katoptron/Juelich/samples_files/Xiao_45.npz | Bin 4433 -> 0 bytes katoptron/Juelich/samples_files/Xiao_46.npz | Bin 4598 -> 0 bytes katoptron/Juelich/samples_files/Xiao_47.npz | Bin 4719 -> 0 bytes katoptron/Juelich/samples_files/Xiao_48.npz | Bin 4955 -> 0 bytes katoptron/Juelich/samples_files/Xiao_49.npz | Bin 5130 -> 0 bytes katoptron/Juelich/samples_files/Xiao_5.npz | Bin 461 -> 0 bytes katoptron/Juelich/samples_files/Xiao_50.npz | Bin 5305 -> 0 bytes katoptron/Juelich/samples_files/Xiao_6.npz | Bin 517 -> 0 bytes katoptron/Juelich/samples_files/Xiao_7.npz | Bin 559 -> 0 bytes katoptron/Juelich/samples_files/Xiao_8.npz | Bin 575 -> 0 bytes katoptron/Juelich/samples_files/Xiao_9.npz | Bin 611 -> 0 bytes katoptron/Juelich/slurm/blake.slurm.sh | 43 - katoptron/Juelich/slurm/blake_ER_NER.slurm.sh | 101 - katoptron/Juelich/slurm/blake_all.slurm.sh | 47 - katoptron/Juelich/slurm/blake_order.slurm.sh | 43 - .../Juelich/slurm/blake_preload.slurm.sh | 43 - katoptron/Juelich/smoothers/AMG_BGS_gs_gs.xml | 226 - .../Juelich/smoothers/AMG_BGS_gs_gs_old.xml | 294 - .../Juelich/smoothers/AMG_BGS_gs_gs_rep.xml | 380 -- .../Juelich/smoothers/heat_no_contact.xml | 19 - .../smoothers/heat_no_contact_mtgs.xml | 20 - katoptron/Juelich/smoothers/mySIM1.xml | 190 - katoptron/Juelich/smoothers/mySIM1_old.xml | 190 - .../Juelich/tests/M1_assembly_contact.py | 241 - katoptron/Juelich/tests/M1_assembly_fused.py | 559 -- .../Juelich/tests/M1_assembly_fused_MC_k.py | 545 -- .../tests/M1_assembly_fused_MC_k_order.py | 554 -- .../Juelich/tests/M1_assembly_fused_all.py | 475 -- .../Juelich/tests/M1_assembly_fused_old.py | 568 -- .../tests/M1_assembly_fused_preload.py | 544 -- katoptron/__init__.py | 10 - katoptron/_src/CMakeLists.txt | 117 - katoptron/_src/katoptronw.i | 134 - katoptron/convergence.py | 335 - katoptron/eigenvalues.py | 637 -- katoptron/exe/CMakeLists.txt | 90 - katoptron/exe/main.cpp | 260 - katoptron/matlab/Belos/read_belos.m | 40 - katoptron/matlab/Belos/test_belos.m | 10 - katoptron/matlab/Belos/test_belos2.m | 41 - katoptron/matlab/Belos/test_belos3.m | 41 - katoptron/matlab/Belos/test_belos4.m | 84 - katoptron/matlab/Belos/test_belos5.m | 43 - katoptron/matlab/Belos/test_belos6.m | 76 - katoptron/matlab/Belos/test_belos7.m | 204 - katoptron/matlab/Belos/test_belos8.m | 25 - .../matlab/CPU statistic/amesos2_klu2.mat | Bin 694 -> 0 bytes .../matlab/CPU statistic/amesos_belos.mat | Bin 745 -> 0 bytes katoptron/matlab/CPU statistic/cube_.tex | 238 - .../cube_test_nic4_distributed.m | 182 - .../cube_test_nic4_distributed_mean.m | 188 - .../CPU statistic/cube_test_nic4_shared.m | 283 - .../matlab/CPU statistic/read_workspace.m | 5 - katoptron/matlab/Krylov/createVandermond.m | 64 - .../matlab/Multigrid/eigenvaluesOneDTest.m | 113 - .../Multigrid/oneDLaplacianEigenvalues.m | 17 - .../matlab/Multigrid/oneDLaplacianMatrix.m | 9 - katoptron/matlab/Multigrid/oneDProlongation.m | 10 - katoptron/matlab/Multigrid/oneDRestriction.m | 10 - katoptron/matlab/Multigrid/read_agregate.m | 20 - .../matlab/Multigrid/richardsonSmoother.m | 14 - .../matlab/Multigrid/testOneDProlongation.m | 96 - .../matlab/Multigrid/testOneDRestriction.m | 98 - .../matlab/Multigrid/testOneDTwoGridCycle.m | 148 - .../matlab/Multigrid/testRichardsonSmoother.m | 33 - katoptron/matlab/Multigrid/twoGridCycle.m | 101 - katoptron/matlab/Richardson/oneDLaplacian.m | 117 - .../.gitattributes | 2 - .../LICENSE.TXT | 176 - .../DrosteEffect-BrewerMap-c64a384/README.md | 85 - .../brewermap.m | 518 -- .../brewermap_view.m | 323 - .../matlab2tikz-matlab2tikz-722609f/AUTHORS | 1 - .../matlab2tikz-matlab2tikz-722609f/COPYING | 24 - .../matlab2tikz-matlab2tikz-722609f/ChangeLog | 388 -- .../matlab2tikz-matlab2tikz-722609f/Makefile | 21 - .../matlab2tikz-matlab2tikz-722609f/README.md | 69 - .../matlab2tikz-matlab2tikz-722609f/THANKS | 47 - .../logos/matlab2tikz.svg | 94 - .../src/cleanfigure.m | 524 -- .../src/cond_2 | 38 - .../src/cond_2.tex | 38 - .../src/figure2dot.m | 155 - .../src/m2tInputParser.m | 256 - .../src/matlab2tikz.m | 5555 ----------------- .../src/myfile | 43 - .../src/private/m2tUpdater.m | 142 - .../src/test.text | 322 - .../test/ACID.m | 2378 ------- .../test/README | 27 - .../test/codeReport.m | 268 - .../test/data/converted/Makefile | 23 - .../test/data/reference/Makefile | 19 - .../test/herrorbar.m | 152 - .../test/issues.m | 43 - .../test/matlab2tikz_acidtest.m | 609 -- .../test/myCount.dat | 24 - .../test/pointReductionTest.m | 34 - .../test/runtests | 56 - .../test/testPatches.m | 121 - .../test/testSurfshader.m | 103 - .../test/tex/Makefile | 33 - .../version-0.6.0 | 6 - katoptron/matlab/TPL/matlab2tikz2.m | 29 - katoptron/matlab/TPL/test.tex | 130 - katoptron/matlab/TPL/test.tex_tmp | 130 - katoptron/matlab/ensemble/eric_data.m | 571 -- katoptron/matlab/ensemble/eric_paper.mat | Bin 4953 -> 0 bytes katoptron/matlab/ensemble/timers.mat | Bin 689 -> 0 bytes katoptron/matlab/gmsh/distancePointPlane.m | 13 - katoptron/matlab/gmsh/readMshFile.m | 68 - katoptron/matlab/gmsh/showMsh.m | 129 - katoptron/matlab/gmsh/test_readMshFile.m | 80 - katoptron/matlab/gmsh/test_showMsh.m | 12 - .../matlab/matrix graph/load_crs_matrix.m | 42 - katoptron/matlab/matrix graph/show_graph.m | 52 - .../matlab/matrix graph/show_trilinos_graph.m | 31 - katoptron/matlab/matrix graph/testSchur.m | 70 - .../matlab/matrix graph/test_show_graph.m | 42 - katoptron/preconditioners/AMG_BGS_gs_gs.xml | 232 - .../preconditioners/BraessSarazin_cheby.xml | 243 - .../preconditioners/BraessSarazin_direct.xml | 237 - .../preconditioners/BraessSarazin_gs.xml | 249 - .../preconditioners/BraessSarazin_jacobi.xml | 249 - .../preconditioners/BraessSarazin_mtgs.xml | 251 - .../IndefiniteBlockDiagonal_cheby.xml | 250 - .../IndefiniteBlockDiagonal_direct.xml | 244 - .../IndefiniteBlockDiagonal_gs.xml | 256 - .../IndefiniteBlockDiagonal_jacobi.xml | 256 - .../IndefiniteBlockDiagonal_mtgs.xml | 258 - katoptron/preconditioners/SIMPLEC_cheby.xml | 251 - katoptron/preconditioners/SIMPLEC_direct.xml | 245 - katoptron/preconditioners/SIMPLEC_gs.xml | 257 - katoptron/preconditioners/SIMPLEC_jacobi.xml | 257 - katoptron/preconditioners/SIMPLEC_mtgs.xml | 259 - katoptron/preconditioners/SIMPLE_cheby.xml | 251 - katoptron/preconditioners/SIMPLE_direct.xml | 245 - .../preconditioners/SIMPLE_direct_2_lvls.xml | 245 - katoptron/preconditioners/SIMPLE_gs.xml | 257 - katoptron/preconditioners/SIMPLE_gs.xml.in | 257 - .../preconditioners/SIMPLE_gs_2_lvls.xml | 257 - .../preconditioners/SIMPLE_gs_3_sweeps.xml | 257 - .../preconditioners/SIMPLE_gs_direct.xml.in | 250 - .../SIMPLE_gs_direct_lvl.xml.in | 276 - .../SIMPLE_gs_direct_lvl_MT.xml.in | 276 - katoptron/preconditioners/SIMPLE_jacobi.xml | 257 - katoptron/preconditioners/SIMPLE_mtgs.xml | 257 - katoptron/preconditioners/Uzawa_cheby.xml | 250 - katoptron/preconditioners/Uzawa_direct.xml | 244 - katoptron/preconditioners/Uzawa_gs.xml | 256 - katoptron/preconditioners/Uzawa_jacobi.xml | 256 - katoptron/preconditioners/Uzawa_mtgs.xml | 258 - katoptron/preconditioners/blockdirect.xml | 30 - katoptron/preconditioners/gs_lvl.xml.in | 95 - katoptron/readers.py | 124 - katoptron/speedup.py | 172 - katoptron/src/Algebraic.h | 48 - katoptron/src/Algebraic.hpp | 79 - katoptron/src/AlgebraicETI.cpp | 10 - ...StatusTestWeightedGenResNorm_MP_Vector.hpp | 769 --- ...petraStatusTestGenResSubNorm_MP_Vector.hpp | 1537 ----- katoptron/src/CMakeLists.txt | 97 - katoptron/src/ContactsList.cpp | 284 - katoptron/src/ContactsList.h | 500 -- katoptron/src/DirichletList.h | 112 - katoptron/src/DirichletList.hpp | 93 - katoptron/src/DirichletListETI.cpp | 10 - katoptron/src/DiscreteProblem.h | 99 - katoptron/src/DiscreteProblem.hpp | 1424 ----- katoptron/src/DiscreteProblemETI.cpp | 10 - katoptron/src/Domain.h | 74 - katoptron/src/ElementComputation.cpp | 27 - katoptron/src/ElementComputation.h | 46 - katoptron/src/ElementComputation.hpp | 142 - katoptron/src/ElementMatrices.h | 69 - katoptron/src/ElementMatrices.hpp | 300 - katoptron/src/ElementMatricesETI.cpp | 14 - katoptron/src/ElementVectors.h | 42 - katoptron/src/ElementVectors.hpp | 108 - katoptron/src/ElementVectorsETI.cpp | 43 - katoptron/src/ElementsList.cpp | 85 - katoptron/src/ElementsList.h | 112 - katoptron/src/EnsembleReduction.h | 14 - katoptron/src/EnsembleTraits.h | 30 - katoptron/src/Graph.cpp | 335 - katoptron/src/Graph.h | 36 - katoptron/src/IterativeSolver.cpp | 868 --- katoptron/src/IterativeSolver.h | 37 - katoptron/src/Kokkos_Init.h | 20 - katoptron/src/LinearSolver.h | 162 - katoptron/src/Loads.h | 58 - katoptron/src/Map.cpp | 328 - katoptron/src/Map.h | 73 - katoptron/src/Material.h | 77 - katoptron/src/MaterialsList.h | 170 - katoptron/src/Matrices.h | 126 - katoptron/src/Mortar.cpp | 1059 ---- katoptron/src/Mortar.h | 109 - katoptron/src/NeumannList.h | 196 - katoptron/src/NodesList.cpp | 28 - katoptron/src/NodesList.h | 31 - katoptron/src/PreloadList.h | 77 - katoptron/src/ResultsDecl.hpp | 62 - katoptron/src/ResultsDef.hpp | 366 -- katoptron/src/ResultsETI.cpp | 75 - katoptron/src/SourcesList.h | 164 - katoptron/src/StressComputation.h | 133 - katoptron/src/Vectors.h | 78 - katoptron/src/WeightsList.h | 200 - katoptron/src/katoptron.h | 37 - katoptron/src/tMatrix.h | 223 - katoptron/src/wContact.cpp | 443 -- katoptron/src/wContact.h | 84 - katoptron/src/wDirichlet.cpp | 200 - katoptron/src/wDirichlet.h | 70 - katoptron/src/wDisplayHook.cpp | 25 - katoptron/src/wDisplayHook.h | 22 - katoptron/src/wMedium.cpp | 150 - katoptron/src/wMedium.h | 67 - katoptron/src/wNeumann.cpp | 109 - katoptron/src/wNeumann.h | 50 - katoptron/src/wProblem.cpp | 49 - katoptron/src/wProblem.h | 45 - katoptron/src/wRandomField.h | 177 - katoptron/src/wRandomVariable.h | 25 - katoptron/src/wSource.cpp | 40 - katoptron/src/wSource.h | 33 - katoptron/src/wSpectralApproach.h | 115 - katoptron/src/wVtkExport_KIM2CLEAN.cpp | 400 -- katoptron/src/wVtkExport_KIM2CLEAN.h | 69 - katoptron/src/wWeight.cpp | 177 - katoptron/src/wWeight.h | 67 - katoptron/tests/1_cube.geo | 39 - katoptron/tests/1_cube.py | 118 - katoptron/tests/1_cube_conv.py | 123 - katoptron/tests/1_cube_k.py | 94 - katoptron/tests/1_cube_rf.py | 140 - katoptron/tests/1_cube_tet.geo | 38 - katoptron/tests/1_cube_tet.py | 117 - katoptron/tests/1_cube_tet_block.py | 127 - katoptron/tests/2_cubes.geo | 77 - katoptron/tests/2_cubes.py | 88 - katoptron/tests/2_cubes_fused.geo | 72 - katoptron/tests/2_cubes_heat.py | 114 - katoptron/tests/2_cubes_no_contact.py | 92 - katoptron/tests/2_cubes_patch.geo | 149 - katoptron/tests/2_cubes_patch.py | 105 - katoptron/tests/2_cubes_patch_2_lvls.py | 94 - .../tests/2_cubes_patch_BraessSarazin.py | 103 - .../tests/2_cubes_patch_IndefBlockDiagonal.py | 103 - katoptron/tests/2_cubes_patch_SIMPLE.py | 106 - katoptron/tests/2_cubes_patch_SIMPLEC.py | 103 - katoptron/tests/2_cubes_patch_Uzawa.py | 103 - katoptron/tests/2_cubes_sticking.geo | 72 - katoptron/tests/2_cubes_sticking.py | 88 - katoptron/tests/2_cubes_tet.geo | 75 - katoptron/tests/2_cubes_tet.py | 88 - katoptron/tests/3_cubes.geo | 107 - katoptron/tests/3_cubes_partial_sticking.py | 105 - katoptron/tests/L_shape.py | 91 - katoptron/tests/L_shape_1.geo | 95 - katoptron/tests/L_shape_2.geo | 167 - katoptron/tests/L_shape_curv_1.geo | 134 - katoptron/tests/L_shape_curv_2.geo | 163 - katoptron/tests/M1_optic_test.py | 124 - katoptron/tests/beam.geo | 114 - katoptron/tests/beam.py | 222 - katoptron/tests/direct_solver.xml | 116 - katoptron/tests/mirror_data.npz | Bin 327176 -> 0 bytes katoptron/tests/multigrid_2_lvls_3_1.xml | 257 - katoptron/tests/plate.py | 74 - katoptron/thesis/test_1/1_cube.geo | 39 - katoptron/thesis/test_1/1_cube.py | 198 - katoptron/thesis/test_1/blake.slurm.sh | 22 - katoptron/thesis/test_1/initial_guess.txt | 375 -- katoptron/thesis/test_1/post_process.py | 341 - katoptron/thesis/test_2/1_cube.geo | 42 - katoptron/thesis/test_2/1_cube.py | 159 - katoptron/thesis/test_2/blake.slurm.sh | 22 - katoptron/thesis/test_2/post_process.py | 136 - katoptron/thesis/test_2/prec.xml | 20 - katoptron/thesis/test_2/prec_1.xml | 16 - katoptron/thesis/test_3/beam.geo | 114 - katoptron/thesis/test_3/beam.py | 238 - katoptron/thesis/test_3/blake.slurm.sh | 22 - katoptron/thesis/test_3/ordering.txt | 640 -- katoptron/thesis/test_3/post_process.py | 485 -- katoptron/thesis/test_4/1_cube.geo | 42 - katoptron/thesis/test_4/1_cube.py | 148 - katoptron/thesis/test_4/blake.slurm.sh | 61 - katoptron/thesis/test_4/blake_N_1.slurm.sh | 61 - katoptron/thesis/test_4/blake_N_2.slurm.sh | 61 - katoptron/thesis/test_4/blake_N_4.slurm.sh | 61 - katoptron/thesis/test_4/blake_N_8.slurm.sh | 61 - katoptron/thesis/test_4/prec.xml | 20 - katoptron/thesis/test_4/prec_1.xml | 16 - katoptron/thesis/test_5/1_bar.py | 220 - katoptron/thesis/test_5/laplacian.py | 164 - katoptron/thesis/test_6/1_cube.geo | 42 - katoptron/thesis/test_6/1_cube.py | 151 - katoptron/thesis/test_6/blake.slurm.sh | 59 - katoptron/thesis/test_6/prec.xml | 20 - katoptron/thesis/test_6/prec_1.xml | 16 - katoptron/thesis/test_6/speedup.py | 170 - katoptron/utilities.py | 786 --- katoptron/viewer.py | 689 -- run.py | 36 - scripts/devenv-mingw.bat | 29 - scripts/devenv-vs2019.bat | 10 - tlnos/CMakeLists.txt | 8 - tlnos/__init__.py | 6 - tlnos/_src/CMakeLists.txt | 46 - tlnos/_src/tlnosw.i | 53 - tlnos/broken/example3.py | 15 - tlnos/broken/example5.py | 15 - tlnos/broken/example6.py | 15 - tlnos/broken/example7.py | 15 - tlnos/broken/example8.py | 15 - tlnos/broken/example9.py | 15 - tlnos/src/CMakeLists.txt | 80 - .../Example_BCStrategy_Dirichlet_Constant.hpp | 81 - ...ple_BCStrategy_Dirichlet_Constant_impl.hpp | 132 - tlnos/src/Example_BCStrategy_Factory.hpp | 90 - tlnos/src/Example_ClosureModel_Factory.hpp | 76 - ...e_ClosureModel_Factory_TemplateBuilder.hpp | 66 - .../src/Example_ClosureModel_Factory_impl.hpp | 144 - tlnos/src/Example_EquationSetFactory.hpp | 94 - tlnos/src/Example_PoissonEquationSet.hpp | 94 - tlnos/src/Example_PoissonEquationSet_impl.hpp | 213 - tlnos/src/ExodusInterface.h | 231 - tlnos/src/TOOLS/PDE_FEM.hpp | 1055 ---- tlnos/src/TOOLS/bfsc_dof_mesh.hpp | 554 -- tlnos/src/TOOLS/dofmanager.hpp | 419 -- tlnos/src/TOOLS/elasticity.hpp | 947 --- tlnos/src/TOOLS/elasticitySIMP.hpp | 296 - tlnos/src/TOOLS/materials.hpp | 252 - tlnos/src/TOOLS/meshmanager.hpp | 711 --- tlnos/src/constraint.hpp | 218 - tlnos/src/data.hpp | 843 --- tlnos/src/objective.hpp | 177 - tlnos/src/tlnos.h | 36 - tlnos/src/wExample1.cpp | 98 - tlnos/src/wExample1.h | 37 - tlnos/src/wExample10.cpp | 36 - tlnos/src/wExample10.h | 30 - tlnos/src/wExample2.cpp | 36 - tlnos/src/wExample2.h | 30 - tlnos/src/wExample3.cpp.disabled | 373 -- tlnos/src/wExample3.h.disabled | 30 - tlnos/src/wExample4.cpp | 266 - tlnos/src/wExample4.h | 30 - tlnos/src/wExample5.cpp | 535 -- tlnos/src/wExample5.h | 30 - tlnos/src/wExample6.cpp | 533 -- tlnos/src/wExample6.h | 30 - tlnos/src/wExample7.cpp.disabled | 509 -- tlnos/src/wExample7.h.disabled | 30 - tlnos/src/wExample8.cpp | 570 -- tlnos/src/wExample8.h | 30 - tlnos/src/wExample9.cpp | 466 -- tlnos/src/wExample9.h | 30 - tlnos/tests/example1.py | 17 - tlnos/tests/example10.py | 15 - tlnos/tests/example2.py | 15 - tlnos/tests/example4.py | 15 - tlnos/tests/input.xml | 7 - .../CMakeDirectoryInformation.cmake | 16 - waves/CMakeFiles/progress.marks | 1 - waves/CMakeLists.txt | 33 - waves/__init__.py | 22 - waves/_src/CMakeLists.txt | 52 - waves/_src/wavesw.i | 89 - waves/attic/export_xml.py | 6 - waves/attic/testSonarQ.cpp | 22 - waves/attic/wDof.cpp | 3 - waves/attic/wDof.h | 43 - waves/attic/wField.cpp | 32 - waves/attic/wField.h | 41 - waves/attic/wSolver1.cpp | 7 - waves/attic/wSolver1.h | 17 - waves/broken/cas1.geo | 60 - waves/broken/cas1.py | 44 - waves/broken/geuz/geophysique.geo | 72 - waves/broken/geuz/geophysique.pro | 149 - waves/broken/geuz/geophysique.py | 52 - waves/broken/geuz/geophysique_param.geo | 20 - waves/broken/waves01_onelab.py | 160 - waves/exe/CMakeLists.txt | 20 - waves/exe/main.cpp | 41 - waves/models/__init__.py | 0 waves/models/cube.geo | 50 - waves/models/cube2mat.geo | 73 - waves/models/plane1mat.py | 105 - waves/models/plane2mat.py | 120 - waves/src/CMakeLists.txt | 28 - waves/src/wBoundary.cpp | 35 - waves/src/wBoundary.h | 46 - waves/src/wDisplayHook.cpp | 33 - waves/src/wDisplayHook.h | 41 - waves/src/wForwardEuler.cpp | 116 - waves/src/wForwardEuler.h | 42 - waves/src/wMedium.cpp | 35 - waves/src/wMedium.h | 47 - waves/src/wNewmark.cpp | 107 - waves/src/wNewmark.h | 45 - waves/src/wProblem.cpp | 68 - waves/src/wProblem.h | 58 - waves/src/wRungeKutta.cpp | 142 - waves/src/wRungeKutta.h | 54 - waves/src/wSource.cpp | 55 - waves/src/wSource.h | 50 - waves/src/wTimeIntegration.cpp | 245 - waves/src/wTimeIntegration.h | 92 - waves/src/wWaveTerm.cpp | 67 - waves/src/wWaveTerm.h | 41 - waves/src/waves.h | 51 - waves/srcs.py | 86 - waves/tests/attic/bulthuis.geo | 78 - waves/tests/attic/strates.geo | 49 - waves/tests/mat1/interf1.py | 21 - waves/tests/mat1/interf2.py | 21 - waves/tests/mat1/planewave.py | 21 - waves/tests/mat1/pulse.py | 21 - waves/tests/mat1/sinsrc.py | 21 - waves/tests/mat2/interf1.py | 21 - waves/tests/mat2/pulse.py | 21 - waves/tests/mat2/reflex.py | 21 - waves/tests/mat2/sinsrc.py | 22 - waves/utils.py | 38 - waves/viewer.py | 456 -- 712 files changed, 5 insertions(+), 100012 deletions(-) delete mode 100644 .clang-format delete mode 100644 .editorconfig delete mode 100644 .gitattributes delete mode 100644 .gitignore delete mode 100644 .gitlab-ci.yml delete mode 100644 .gitmodules delete mode 100644 CMake/FindMPI4PY.cmake delete mode 100644 CMake/disable-trilinos.cmake delete mode 100644 CMake/fabulous.cmake delete mode 100644 CMake/maclam.cmake delete mode 100644 CMake/mingw32-msys.cmake delete mode 100644 CMake/mingw32.cmake delete mode 100644 CMake/msys2.cmake delete mode 100644 CMakeLists.txt delete mode 100644 CODEOWNERS delete mode 100644 Doxyfile.in delete mode 100644 LICENSE delete mode 100644 dox/flow.png delete mode 100644 dox/img.png delete mode 100644 dox/logo.jpg delete mode 100644 ext/CMakeLists.txt delete mode 160000 ext/amfe delete mode 100644 heat/CMakeLists.txt delete mode 100644 heat/__init__.py delete mode 100644 heat/_src/CMakeLists.txt delete mode 100644 heat/_src/heatw.i delete mode 100755 heat/broken/heat_multiscale.py delete mode 100644 heat/broken/honeycomb_jalil.geo delete mode 100755 heat/broken/honeycomb_jalil.py delete mode 100755 heat/broken/jalil1.py delete mode 100644 heat/broken/jalil1_corner.geo delete mode 100644 heat/broken/jalil1_micro.geo delete mode 100755 heat/broken/jalil1_micro.py delete mode 100755 heat/broken/jalil2.py delete mode 100644 heat/broken/jalil2_honey.geo delete mode 100755 heat/broken/jalil2_honey.py delete mode 100755 heat/broken/jalil2_taskpull.py delete mode 100644 heat/broken/rve.geo delete mode 100755 heat/broken/rve.py delete mode 100755 heat/fe2.py delete mode 100644 heat/matlab/rotK.m delete mode 100644 heat/models/__init__.py delete mode 100644 heat/models/honeycomb.geo delete mode 100644 heat/models/rect.geo delete mode 100755 heat/models/rect.py delete mode 100644 heat/models/rect_stru.geo delete mode 100644 heat/src/CMakeLists.txt delete mode 100644 heat/src/heat.h delete mode 100644 heat/src/wBoundary.cpp delete mode 100644 heat/src/wBoundary.h delete mode 100644 heat/src/wCompiledFct.cpp delete mode 100644 heat/src/wCompiledFct.h delete mode 100644 heat/src/wDirichlet.cpp delete mode 100644 heat/src/wDirichlet.h delete mode 100644 heat/src/wDisplayHook.cpp delete mode 100644 heat/src/wDisplayHook.h delete mode 100644 heat/src/wExtractor.cpp delete mode 100644 heat/src/wExtractor.h delete mode 100644 heat/src/wHeatTerm.cpp delete mode 100644 heat/src/wHeatTerm.h delete mode 100644 heat/src/wMedium.cpp delete mode 100644 heat/src/wMedium.h delete mode 100644 heat/src/wPeriodic.cpp delete mode 100644 heat/src/wPeriodic.h delete mode 100644 heat/src/wProblem.cpp delete mode 100644 heat/src/wProblem.h delete mode 100644 heat/src/wSolver.cpp delete mode 100644 heat/src/wSolver.h delete mode 100644 heat/src/wSource.cpp delete mode 100644 heat/src/wSource.h delete mode 100755 heat/tests/basics/anisotropy.py delete mode 100755 heat/tests/basics/dirichletx.py delete mode 100755 heat/tests/basics/dirichletx_stru.py delete mode 100755 heat/tests/basics/dirichlety.py delete mode 100644 heat/tests/basics/mat2hole.geo delete mode 100755 heat/tests/basics/mat2hole.py delete mode 100755 heat/tests/basics/source.py delete mode 100755 heat/tests/directors/material.py delete mode 100755 heat/tests/directors/neumann.py delete mode 100755 heat/tests/directors/source.py delete mode 100644 heat/tests/fe2/Lmacro.geo delete mode 100644 heat/tests/fe2/Lmicro.geo delete mode 100644 heat/tests/fe2/Lmpi.py delete mode 100755 heat/tests/fe2/heat_mpi.py delete mode 100755 heat/tests/fe2/heat_mpi.sge.sh delete mode 100755 heat/tests/fe2/heat_mpi.slurm.sh delete mode 100644 heat/tests/fe2/macro.geo delete mode 100644 heat/tests/fe2/micro.geo delete mode 100755 heat/tests/fe2/micro.py delete mode 100644 heat/tests/nonlinear/mat2.geo delete mode 100644 heat/tests/nonlinear/mat2vark.py delete mode 100755 heat/tests/periodic/honeycomb.py delete mode 100755 heat/tests/periodic/lincomb.py delete mode 100755 heat/tests/periodic/lincomb_fast.py delete mode 100644 heat/utils.py delete mode 100644 heat/viewer.py delete mode 100644 katoptron/CMAME/MG/beam.geo delete mode 100644 katoptron/CMAME/MG/beam.py delete mode 100644 katoptron/CMAME/MG/post.py delete mode 100644 katoptron/CMAME/__init__.py delete mode 100644 katoptron/CMAME/mesh/plate.geo delete mode 100644 katoptron/CMAME/mesh/plate_1.geo delete mode 100644 katoptron/CMAME/mesh/plate_2.geo delete mode 100644 katoptron/CMAME/mesh/plate_2_extended.geo delete mode 100644 katoptron/CMAME/model.py delete mode 100644 katoptron/CMAME/old_slurm/blake_GS_omega.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_MC_GS.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_MC_GS_direct.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_MC_GS_fused.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_MC_GS_fused_prec.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_MC_MG.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_MC_MG_2.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_MC_direct.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_NO_EP.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_convergence_direct.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_correlation.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_eigenvalues_direct.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_eigenvalues_gs.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_gamma.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_prec.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_prec_GS_direct.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/blake_prec_GS_direct_lvl.slurm.sh delete mode 100644 katoptron/CMAME/old_slurm/bowman.slurm.sh delete mode 100644 katoptron/CMAME/old_tests/2_cubes_patch_GS.py delete mode 100644 katoptron/CMAME/old_tests/2_cubes_patch_GS_klu.py delete mode 100644 katoptron/CMAME/old_tests/2_cubes_patch_direct.py delete mode 100644 katoptron/CMAME/old_tests/clean_A_B.py delete mode 100644 katoptron/CMAME/old_tests/compare_GB.py delete mode 100644 katoptron/CMAME/old_tests/cube_deltas_omegas_GS.py delete mode 100644 katoptron/CMAME/old_tests/fused_plate_MC_GS_all_cases.py delete mode 100644 katoptron/CMAME/old_tests/fused_plate_mean_prec_GS.py delete mode 100644 katoptron/CMAME/old_tests/fused_plate_mean_prec_GS_2.py delete mode 100644 katoptron/CMAME/old_tests/fused_plate_mean_prec_GS_3.py delete mode 100644 katoptron/CMAME/old_tests/fused_plate_mean_prec_GS_4.py delete mode 100644 katoptron/CMAME/old_tests/plate.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_GS_all_cases.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_GS_case_1.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_GS_case_2.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_GS_case_3.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_GS_case_4.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_GS_direct_all_cases.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_MG_all_cases.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_MG_all_cases_2.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_NO_EP_case_1.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_NO_EP_case_1_sp.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_NO_EP_case_2.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_NO_EP_case_3.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_NO_EP_case_4.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_direct_case_1.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_direct_case_2.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_direct_case_3.py delete mode 100644 katoptron/CMAME/old_tests/plate_MC_direct_case_4.py delete mode 100644 katoptron/CMAME/old_tests/plate_convergence_direct.py delete mode 100644 katoptron/CMAME/old_tests/plate_correlation.py delete mode 100644 katoptron/CMAME/old_tests/plate_deltas_omegas_GS.py delete mode 100644 katoptron/CMAME/old_tests/plate_deltas_omegas_direct.py delete mode 100644 katoptron/CMAME/old_tests/plate_eigenvalues.py delete mode 100644 katoptron/CMAME/old_tests/plate_eigenvalues_gamma.py delete mode 100644 katoptron/CMAME/old_tests/plate_extended.py delete mode 100644 katoptron/CMAME/old_tests/plate_mean_gamma.py delete mode 100644 katoptron/CMAME/old_tests/plate_mean_prec.py delete mode 100644 katoptron/CMAME/old_tests/plate_mean_prec_GS_direct.py delete mode 100644 katoptron/CMAME/old_tests/plate_mean_prec_GS_direct_lvl.py delete mode 100644 katoptron/CMAME/old_tests/plate_mean_prec_GS_direct_opti.py delete mode 100644 katoptron/CMAME/old_tests/plate_vd_Direct_200.py delete mode 100644 katoptron/CMAME/old_tests/plate_vd_Direct_3.py delete mode 100644 katoptron/CMAME/old_tests/plate_vd_GS_200.py delete mode 100644 katoptron/CMAME/old_tests/plate_vd_GS_200_with_gamma.py delete mode 100644 katoptron/CMAME/old_tests/plate_vd_GS_3.py delete mode 100644 katoptron/CMAME/old_tests/plate_vd_GS_3_with_gamma.py delete mode 100644 katoptron/CMAME/old_tests/plate_vd_conf.py delete mode 100644 katoptron/CMAME/plate_SPD/blake.slurm.sh delete mode 100644 katoptron/CMAME/plate_SPD/plate.geo delete mode 100644 katoptron/CMAME/plate_SPD/plate.py delete mode 100644 katoptron/CMAME/plate_SPD/plate_convergence.py delete mode 100644 katoptron/CMAME/post_process/2_cube.py delete mode 100644 katoptron/CMAME/post_process/grouping.py delete mode 100644 katoptron/CMAME/post_process/juelich_speedup.py delete mode 100644 katoptron/CMAME/post_process/plate_G.py delete mode 100644 katoptron/CMAME/post_process/plate_GS_direct.py delete mode 100644 katoptron/CMAME/post_process/plate_GS_direct_fused.py delete mode 100644 katoptron/CMAME/post_process/plate_MC.py delete mode 100644 katoptron/CMAME/post_process/plate_MC_MG_speedup.py delete mode 100644 katoptron/CMAME/post_process/plate_MC_MG_speedup_200_ER.py delete mode 100644 katoptron/CMAME/post_process/plate_MC_MG_speedup_ER.py delete mode 100644 katoptron/CMAME/post_process/plate_MC_MG_speedup_NER.py delete mode 100644 katoptron/CMAME/post_process/plate_MC_MG_total.py delete mode 100644 katoptron/CMAME/post_process/plate_MC_MG_total_2.py delete mode 100644 katoptron/CMAME/post_process/plate_MC_MG_total_2_analysis.py delete mode 100644 katoptron/CMAME/post_process/plate_MC_QoI.py delete mode 100644 katoptron/CMAME/post_process/plate_MC_QoI_analysis.py delete mode 100644 katoptron/CMAME/post_process/plate_MC_convergence.py delete mode 100644 katoptron/CMAME/post_process/plate_MC_convergence_2.py delete mode 100644 katoptron/CMAME/post_process/plate_MC_convergence_3.py delete mode 100644 katoptron/CMAME/post_process/plate_MC_speedup.py delete mode 100644 katoptron/CMAME/post_process/plate_convergence.py delete mode 100644 katoptron/CMAME/post_process/plate_cor_R.py delete mode 100644 katoptron/CMAME/post_process/plate_deltas_omegas.py delete mode 100644 katoptron/CMAME/post_process/plate_deltas_omegas_direct_analysis.py delete mode 100644 katoptron/CMAME/post_process/plate_deltas_omegas_gs_analysis.py delete mode 100644 katoptron/CMAME/post_process/plate_gamma.py delete mode 100644 katoptron/CMAME/post_process/plate_gamma_R.py delete mode 100644 katoptron/CMAME/post_process/plate_mean.py delete mode 100644 katoptron/CMAME/post_process/plate_mean_GS.py delete mode 100644 katoptron/CMAME/post_process/plate_mean_GS_omega.py delete mode 100644 katoptron/CMAME/post_process/plate_mean_convergence.py delete mode 100644 katoptron/CMAME/slurm/blake_MC_MG.slurm.sh delete mode 100644 katoptron/CMAME/tests/plate_MC_MG_all_cases.py delete mode 100644 katoptron/CMakeLists.txt delete mode 100644 katoptron/Juelich/UQ/GS.py delete mode 100644 katoptron/Juelich/UQ/GS_2.py delete mode 100644 katoptron/Juelich/UQ/__init__.py delete mode 100644 katoptron/Juelich/UQ/copulas.py delete mode 100644 katoptron/Juelich/UQ/halton.py delete mode 100644 katoptron/Juelich/UQ/kde.py delete mode 100644 katoptron/Juelich/UQ/mirror.py delete mode 100644 katoptron/Juelich/UQ/mirror_2.py delete mode 100644 katoptron/Juelich/UQ/mirror_PCE.py delete mode 100644 katoptron/Juelich/UQ/mirror_PCE_convergence.py delete mode 100644 katoptron/Juelich/UQ/preload.py delete mode 100644 katoptron/Juelich/UQ/speedup.py delete mode 100644 katoptron/Juelich/UQ/test_halton.py delete mode 100644 katoptron/Juelich/UQ/test_kde.py delete mode 100644 katoptron/Juelich/__init__.py delete mode 100644 katoptron/Juelich/broken/M1.py delete mode 100644 katoptron/Juelich/broken/M1_assembly.py delete mode 100644 katoptron/Juelich/broken/M1_assembly_fused_all.py delete mode 100644 katoptron/Juelich/broken/M1_assembly_fused_mm.py delete mode 100644 katoptron/Juelich/broken/M1_assembly_mm.py delete mode 100644 katoptron/Juelich/broken/M1_mirror_optic.py delete mode 100644 katoptron/Juelich/broken/M1_optic_test.py delete mode 100755 katoptron/Juelich/broken/M1_run.sh delete mode 100644 katoptron/Juelich/mesh/contact_mirror_assembly_mm.brep delete mode 100644 katoptron/Juelich/mesh/contact_mirror_assembly_mm.geo delete mode 100644 katoptron/Juelich/mesh/fused_mirror_assembly_all_mm.brep delete mode 100644 katoptron/Juelich/mesh/fused_mirror_assembly_all_mm.geo delete mode 100644 katoptron/Juelich/mesh/fused_mirror_assembly_mm.brep delete mode 100644 katoptron/Juelich/mesh/fused_mirror_assembly_mm.geo delete mode 100755 katoptron/Juelich/post_process/AB.py delete mode 100644 katoptron/Juelich/post_process/__init__.py delete mode 100644 katoptron/Juelich/post_process/vtk_post_process.py delete mode 100644 katoptron/Juelich/post_process/vtk_post_process_2.py delete mode 100644 katoptron/Juelich/samples_files/Xiao_1.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_10.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_11.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_12.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_13.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_14.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_15.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_16.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_17.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_18.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_19.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_2.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_20.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_21.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_22.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_23.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_24.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_25.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_26.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_27.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_28.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_29.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_3.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_30.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_31.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_32.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_33.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_34.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_35.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_36.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_37.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_38.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_39.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_4.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_40.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_41.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_42.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_43.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_44.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_45.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_46.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_47.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_48.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_49.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_5.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_50.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_6.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_7.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_8.npz delete mode 100644 katoptron/Juelich/samples_files/Xiao_9.npz delete mode 100644 katoptron/Juelich/slurm/blake.slurm.sh delete mode 100644 katoptron/Juelich/slurm/blake_ER_NER.slurm.sh delete mode 100644 katoptron/Juelich/slurm/blake_all.slurm.sh delete mode 100644 katoptron/Juelich/slurm/blake_order.slurm.sh delete mode 100644 katoptron/Juelich/slurm/blake_preload.slurm.sh delete mode 100644 katoptron/Juelich/smoothers/AMG_BGS_gs_gs.xml delete mode 100644 katoptron/Juelich/smoothers/AMG_BGS_gs_gs_old.xml delete mode 100644 katoptron/Juelich/smoothers/AMG_BGS_gs_gs_rep.xml delete mode 100644 katoptron/Juelich/smoothers/heat_no_contact.xml delete mode 100644 katoptron/Juelich/smoothers/heat_no_contact_mtgs.xml delete mode 100644 katoptron/Juelich/smoothers/mySIM1.xml delete mode 100644 katoptron/Juelich/smoothers/mySIM1_old.xml delete mode 100644 katoptron/Juelich/tests/M1_assembly_contact.py delete mode 100644 katoptron/Juelich/tests/M1_assembly_fused.py delete mode 100644 katoptron/Juelich/tests/M1_assembly_fused_MC_k.py delete mode 100644 katoptron/Juelich/tests/M1_assembly_fused_MC_k_order.py delete mode 100644 katoptron/Juelich/tests/M1_assembly_fused_all.py delete mode 100644 katoptron/Juelich/tests/M1_assembly_fused_old.py delete mode 100644 katoptron/Juelich/tests/M1_assembly_fused_preload.py delete mode 100644 katoptron/__init__.py delete mode 100644 katoptron/_src/CMakeLists.txt delete mode 100644 katoptron/_src/katoptronw.i delete mode 100644 katoptron/convergence.py delete mode 100644 katoptron/eigenvalues.py delete mode 100644 katoptron/exe/CMakeLists.txt delete mode 100644 katoptron/exe/main.cpp delete mode 100644 katoptron/matlab/Belos/read_belos.m delete mode 100644 katoptron/matlab/Belos/test_belos.m delete mode 100644 katoptron/matlab/Belos/test_belos2.m delete mode 100644 katoptron/matlab/Belos/test_belos3.m delete mode 100644 katoptron/matlab/Belos/test_belos4.m delete mode 100644 katoptron/matlab/Belos/test_belos5.m delete mode 100644 katoptron/matlab/Belos/test_belos6.m delete mode 100644 katoptron/matlab/Belos/test_belos7.m delete mode 100644 katoptron/matlab/Belos/test_belos8.m delete mode 100644 katoptron/matlab/CPU statistic/amesos2_klu2.mat delete mode 100644 katoptron/matlab/CPU statistic/amesos_belos.mat delete mode 100644 katoptron/matlab/CPU statistic/cube_.tex delete mode 100644 katoptron/matlab/CPU statistic/cube_test_nic4_distributed.m delete mode 100644 katoptron/matlab/CPU statistic/cube_test_nic4_distributed_mean.m delete mode 100644 katoptron/matlab/CPU statistic/cube_test_nic4_shared.m delete mode 100644 katoptron/matlab/CPU statistic/read_workspace.m delete mode 100644 katoptron/matlab/Krylov/createVandermond.m delete mode 100644 katoptron/matlab/Multigrid/eigenvaluesOneDTest.m delete mode 100644 katoptron/matlab/Multigrid/oneDLaplacianEigenvalues.m delete mode 100644 katoptron/matlab/Multigrid/oneDLaplacianMatrix.m delete mode 100644 katoptron/matlab/Multigrid/oneDProlongation.m delete mode 100644 katoptron/matlab/Multigrid/oneDRestriction.m delete mode 100644 katoptron/matlab/Multigrid/read_agregate.m delete mode 100644 katoptron/matlab/Multigrid/richardsonSmoother.m delete mode 100644 katoptron/matlab/Multigrid/testOneDProlongation.m delete mode 100644 katoptron/matlab/Multigrid/testOneDRestriction.m delete mode 100644 katoptron/matlab/Multigrid/testOneDTwoGridCycle.m delete mode 100644 katoptron/matlab/Multigrid/testRichardsonSmoother.m delete mode 100644 katoptron/matlab/Multigrid/twoGridCycle.m delete mode 100644 katoptron/matlab/Richardson/oneDLaplacian.m delete mode 100755 katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/.gitattributes delete mode 100755 katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/LICENSE.TXT delete mode 100755 katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/README.md delete mode 100755 katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/brewermap.m delete mode 100755 katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/brewermap_view.m delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/AUTHORS delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/COPYING delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/ChangeLog delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/Makefile delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/README.md delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/THANKS delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/logos/matlab2tikz.svg delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/cleanfigure.m delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/cond_2 delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/cond_2.tex delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/figure2dot.m delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/m2tInputParser.m delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/matlab2tikz.m delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/myfile delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/private/m2tUpdater.m delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/test.text delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/ACID.m delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/README delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/codeReport.m delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/data/converted/Makefile delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/data/reference/Makefile delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/herrorbar.m delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/issues.m delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/matlab2tikz_acidtest.m delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/myCount.dat delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/pointReductionTest.m delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/runtests delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/testPatches.m delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/testSurfshader.m delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/tex/Makefile delete mode 100644 katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/version-0.6.0 delete mode 100644 katoptron/matlab/TPL/matlab2tikz2.m delete mode 100644 katoptron/matlab/TPL/test.tex delete mode 100644 katoptron/matlab/TPL/test.tex_tmp delete mode 100644 katoptron/matlab/ensemble/eric_data.m delete mode 100644 katoptron/matlab/ensemble/eric_paper.mat delete mode 100644 katoptron/matlab/ensemble/timers.mat delete mode 100644 katoptron/matlab/gmsh/distancePointPlane.m delete mode 100644 katoptron/matlab/gmsh/readMshFile.m delete mode 100644 katoptron/matlab/gmsh/showMsh.m delete mode 100644 katoptron/matlab/gmsh/test_readMshFile.m delete mode 100644 katoptron/matlab/gmsh/test_showMsh.m delete mode 100644 katoptron/matlab/matrix graph/load_crs_matrix.m delete mode 100644 katoptron/matlab/matrix graph/show_graph.m delete mode 100644 katoptron/matlab/matrix graph/show_trilinos_graph.m delete mode 100644 katoptron/matlab/matrix graph/testSchur.m delete mode 100644 katoptron/matlab/matrix graph/test_show_graph.m delete mode 100644 katoptron/preconditioners/AMG_BGS_gs_gs.xml delete mode 100644 katoptron/preconditioners/BraessSarazin_cheby.xml delete mode 100644 katoptron/preconditioners/BraessSarazin_direct.xml delete mode 100644 katoptron/preconditioners/BraessSarazin_gs.xml delete mode 100644 katoptron/preconditioners/BraessSarazin_jacobi.xml delete mode 100644 katoptron/preconditioners/BraessSarazin_mtgs.xml delete mode 100644 katoptron/preconditioners/IndefiniteBlockDiagonal_cheby.xml delete mode 100644 katoptron/preconditioners/IndefiniteBlockDiagonal_direct.xml delete mode 100644 katoptron/preconditioners/IndefiniteBlockDiagonal_gs.xml delete mode 100644 katoptron/preconditioners/IndefiniteBlockDiagonal_jacobi.xml delete mode 100644 katoptron/preconditioners/IndefiniteBlockDiagonal_mtgs.xml delete mode 100644 katoptron/preconditioners/SIMPLEC_cheby.xml delete mode 100644 katoptron/preconditioners/SIMPLEC_direct.xml delete mode 100644 katoptron/preconditioners/SIMPLEC_gs.xml delete mode 100644 katoptron/preconditioners/SIMPLEC_jacobi.xml delete mode 100644 katoptron/preconditioners/SIMPLEC_mtgs.xml delete mode 100644 katoptron/preconditioners/SIMPLE_cheby.xml delete mode 100644 katoptron/preconditioners/SIMPLE_direct.xml delete mode 100644 katoptron/preconditioners/SIMPLE_direct_2_lvls.xml delete mode 100644 katoptron/preconditioners/SIMPLE_gs.xml delete mode 100644 katoptron/preconditioners/SIMPLE_gs.xml.in delete mode 100644 katoptron/preconditioners/SIMPLE_gs_2_lvls.xml delete mode 100644 katoptron/preconditioners/SIMPLE_gs_3_sweeps.xml delete mode 100644 katoptron/preconditioners/SIMPLE_gs_direct.xml.in delete mode 100644 katoptron/preconditioners/SIMPLE_gs_direct_lvl.xml.in delete mode 100644 katoptron/preconditioners/SIMPLE_gs_direct_lvl_MT.xml.in delete mode 100644 katoptron/preconditioners/SIMPLE_jacobi.xml delete mode 100644 katoptron/preconditioners/SIMPLE_mtgs.xml delete mode 100644 katoptron/preconditioners/Uzawa_cheby.xml delete mode 100644 katoptron/preconditioners/Uzawa_direct.xml delete mode 100644 katoptron/preconditioners/Uzawa_gs.xml delete mode 100644 katoptron/preconditioners/Uzawa_jacobi.xml delete mode 100644 katoptron/preconditioners/Uzawa_mtgs.xml delete mode 100644 katoptron/preconditioners/blockdirect.xml delete mode 100644 katoptron/preconditioners/gs_lvl.xml.in delete mode 100644 katoptron/readers.py delete mode 100644 katoptron/speedup.py delete mode 100644 katoptron/src/Algebraic.h delete mode 100644 katoptron/src/Algebraic.hpp delete mode 100644 katoptron/src/AlgebraicETI.cpp delete mode 100644 katoptron/src/BelosStatusTestWeightedGenResNorm_MP_Vector.hpp delete mode 100644 katoptron/src/BelosXpetraStatusTestGenResSubNorm_MP_Vector.hpp delete mode 100644 katoptron/src/CMakeLists.txt delete mode 100644 katoptron/src/ContactsList.cpp delete mode 100644 katoptron/src/ContactsList.h delete mode 100644 katoptron/src/DirichletList.h delete mode 100644 katoptron/src/DirichletList.hpp delete mode 100644 katoptron/src/DirichletListETI.cpp delete mode 100644 katoptron/src/DiscreteProblem.h delete mode 100644 katoptron/src/DiscreteProblem.hpp delete mode 100644 katoptron/src/DiscreteProblemETI.cpp delete mode 100644 katoptron/src/Domain.h delete mode 100644 katoptron/src/ElementComputation.cpp delete mode 100644 katoptron/src/ElementComputation.h delete mode 100644 katoptron/src/ElementComputation.hpp delete mode 100644 katoptron/src/ElementMatrices.h delete mode 100644 katoptron/src/ElementMatrices.hpp delete mode 100644 katoptron/src/ElementMatricesETI.cpp delete mode 100644 katoptron/src/ElementVectors.h delete mode 100644 katoptron/src/ElementVectors.hpp delete mode 100644 katoptron/src/ElementVectorsETI.cpp delete mode 100644 katoptron/src/ElementsList.cpp delete mode 100644 katoptron/src/ElementsList.h delete mode 100644 katoptron/src/EnsembleReduction.h delete mode 100644 katoptron/src/EnsembleTraits.h delete mode 100644 katoptron/src/Graph.cpp delete mode 100644 katoptron/src/Graph.h delete mode 100644 katoptron/src/IterativeSolver.cpp delete mode 100644 katoptron/src/IterativeSolver.h delete mode 100644 katoptron/src/Kokkos_Init.h delete mode 100644 katoptron/src/LinearSolver.h delete mode 100644 katoptron/src/Loads.h delete mode 100644 katoptron/src/Map.cpp delete mode 100644 katoptron/src/Map.h delete mode 100644 katoptron/src/Material.h delete mode 100644 katoptron/src/MaterialsList.h delete mode 100644 katoptron/src/Matrices.h delete mode 100644 katoptron/src/Mortar.cpp delete mode 100644 katoptron/src/Mortar.h delete mode 100644 katoptron/src/NeumannList.h delete mode 100644 katoptron/src/NodesList.cpp delete mode 100644 katoptron/src/NodesList.h delete mode 100644 katoptron/src/PreloadList.h delete mode 100644 katoptron/src/ResultsDecl.hpp delete mode 100644 katoptron/src/ResultsDef.hpp delete mode 100644 katoptron/src/ResultsETI.cpp delete mode 100644 katoptron/src/SourcesList.h delete mode 100644 katoptron/src/StressComputation.h delete mode 100644 katoptron/src/Vectors.h delete mode 100644 katoptron/src/WeightsList.h delete mode 100644 katoptron/src/katoptron.h delete mode 100644 katoptron/src/tMatrix.h delete mode 100644 katoptron/src/wContact.cpp delete mode 100644 katoptron/src/wContact.h delete mode 100644 katoptron/src/wDirichlet.cpp delete mode 100644 katoptron/src/wDirichlet.h delete mode 100644 katoptron/src/wDisplayHook.cpp delete mode 100644 katoptron/src/wDisplayHook.h delete mode 100644 katoptron/src/wMedium.cpp delete mode 100644 katoptron/src/wMedium.h delete mode 100644 katoptron/src/wNeumann.cpp delete mode 100644 katoptron/src/wNeumann.h delete mode 100644 katoptron/src/wProblem.cpp delete mode 100644 katoptron/src/wProblem.h delete mode 100644 katoptron/src/wRandomField.h delete mode 100644 katoptron/src/wRandomVariable.h delete mode 100644 katoptron/src/wSource.cpp delete mode 100644 katoptron/src/wSource.h delete mode 100644 katoptron/src/wSpectralApproach.h delete mode 100644 katoptron/src/wVtkExport_KIM2CLEAN.cpp delete mode 100644 katoptron/src/wVtkExport_KIM2CLEAN.h delete mode 100644 katoptron/src/wWeight.cpp delete mode 100644 katoptron/src/wWeight.h delete mode 100644 katoptron/tests/1_cube.geo delete mode 100644 katoptron/tests/1_cube.py delete mode 100644 katoptron/tests/1_cube_conv.py delete mode 100644 katoptron/tests/1_cube_k.py delete mode 100644 katoptron/tests/1_cube_rf.py delete mode 100644 katoptron/tests/1_cube_tet.geo delete mode 100644 katoptron/tests/1_cube_tet.py delete mode 100644 katoptron/tests/1_cube_tet_block.py delete mode 100644 katoptron/tests/2_cubes.geo delete mode 100644 katoptron/tests/2_cubes.py delete mode 100644 katoptron/tests/2_cubes_fused.geo delete mode 100644 katoptron/tests/2_cubes_heat.py delete mode 100644 katoptron/tests/2_cubes_no_contact.py delete mode 100644 katoptron/tests/2_cubes_patch.geo delete mode 100644 katoptron/tests/2_cubes_patch.py delete mode 100644 katoptron/tests/2_cubes_patch_2_lvls.py delete mode 100644 katoptron/tests/2_cubes_patch_BraessSarazin.py delete mode 100644 katoptron/tests/2_cubes_patch_IndefBlockDiagonal.py delete mode 100644 katoptron/tests/2_cubes_patch_SIMPLE.py delete mode 100644 katoptron/tests/2_cubes_patch_SIMPLEC.py delete mode 100644 katoptron/tests/2_cubes_patch_Uzawa.py delete mode 100644 katoptron/tests/2_cubes_sticking.geo delete mode 100644 katoptron/tests/2_cubes_sticking.py delete mode 100644 katoptron/tests/2_cubes_tet.geo delete mode 100644 katoptron/tests/2_cubes_tet.py delete mode 100644 katoptron/tests/3_cubes.geo delete mode 100644 katoptron/tests/3_cubes_partial_sticking.py delete mode 100644 katoptron/tests/L_shape.py delete mode 100644 katoptron/tests/L_shape_1.geo delete mode 100644 katoptron/tests/L_shape_2.geo delete mode 100644 katoptron/tests/L_shape_curv_1.geo delete mode 100644 katoptron/tests/L_shape_curv_2.geo delete mode 100644 katoptron/tests/M1_optic_test.py delete mode 100644 katoptron/tests/beam.geo delete mode 100644 katoptron/tests/beam.py delete mode 100644 katoptron/tests/direct_solver.xml delete mode 100644 katoptron/tests/mirror_data.npz delete mode 100644 katoptron/tests/multigrid_2_lvls_3_1.xml delete mode 100644 katoptron/tests/plate.py delete mode 100644 katoptron/thesis/test_1/1_cube.geo delete mode 100644 katoptron/thesis/test_1/1_cube.py delete mode 100644 katoptron/thesis/test_1/blake.slurm.sh delete mode 100644 katoptron/thesis/test_1/initial_guess.txt delete mode 100644 katoptron/thesis/test_1/post_process.py delete mode 100644 katoptron/thesis/test_2/1_cube.geo delete mode 100644 katoptron/thesis/test_2/1_cube.py delete mode 100644 katoptron/thesis/test_2/blake.slurm.sh delete mode 100644 katoptron/thesis/test_2/post_process.py delete mode 100644 katoptron/thesis/test_2/prec.xml delete mode 100644 katoptron/thesis/test_2/prec_1.xml delete mode 100644 katoptron/thesis/test_3/beam.geo delete mode 100644 katoptron/thesis/test_3/beam.py delete mode 100644 katoptron/thesis/test_3/blake.slurm.sh delete mode 100644 katoptron/thesis/test_3/ordering.txt delete mode 100644 katoptron/thesis/test_3/post_process.py delete mode 100644 katoptron/thesis/test_4/1_cube.geo delete mode 100644 katoptron/thesis/test_4/1_cube.py delete mode 100644 katoptron/thesis/test_4/blake.slurm.sh delete mode 100644 katoptron/thesis/test_4/blake_N_1.slurm.sh delete mode 100644 katoptron/thesis/test_4/blake_N_2.slurm.sh delete mode 100644 katoptron/thesis/test_4/blake_N_4.slurm.sh delete mode 100644 katoptron/thesis/test_4/blake_N_8.slurm.sh delete mode 100644 katoptron/thesis/test_4/prec.xml delete mode 100644 katoptron/thesis/test_4/prec_1.xml delete mode 100644 katoptron/thesis/test_5/1_bar.py delete mode 100644 katoptron/thesis/test_5/laplacian.py delete mode 100644 katoptron/thesis/test_6/1_cube.geo delete mode 100644 katoptron/thesis/test_6/1_cube.py delete mode 100644 katoptron/thesis/test_6/blake.slurm.sh delete mode 100644 katoptron/thesis/test_6/prec.xml delete mode 100644 katoptron/thesis/test_6/prec_1.xml delete mode 100644 katoptron/thesis/test_6/speedup.py delete mode 100644 katoptron/utilities.py delete mode 100644 katoptron/viewer.py delete mode 100755 run.py delete mode 100644 scripts/devenv-mingw.bat delete mode 100644 scripts/devenv-vs2019.bat delete mode 100644 tlnos/CMakeLists.txt delete mode 100644 tlnos/__init__.py delete mode 100644 tlnos/_src/CMakeLists.txt delete mode 100644 tlnos/_src/tlnosw.i delete mode 100755 tlnos/broken/example3.py delete mode 100755 tlnos/broken/example5.py delete mode 100755 tlnos/broken/example6.py delete mode 100755 tlnos/broken/example7.py delete mode 100755 tlnos/broken/example8.py delete mode 100755 tlnos/broken/example9.py delete mode 100644 tlnos/src/CMakeLists.txt delete mode 100644 tlnos/src/Example_BCStrategy_Dirichlet_Constant.hpp delete mode 100644 tlnos/src/Example_BCStrategy_Dirichlet_Constant_impl.hpp delete mode 100644 tlnos/src/Example_BCStrategy_Factory.hpp delete mode 100644 tlnos/src/Example_ClosureModel_Factory.hpp delete mode 100644 tlnos/src/Example_ClosureModel_Factory_TemplateBuilder.hpp delete mode 100644 tlnos/src/Example_ClosureModel_Factory_impl.hpp delete mode 100644 tlnos/src/Example_EquationSetFactory.hpp delete mode 100644 tlnos/src/Example_PoissonEquationSet.hpp delete mode 100644 tlnos/src/Example_PoissonEquationSet_impl.hpp delete mode 100644 tlnos/src/ExodusInterface.h delete mode 100644 tlnos/src/TOOLS/PDE_FEM.hpp delete mode 100644 tlnos/src/TOOLS/bfsc_dof_mesh.hpp delete mode 100644 tlnos/src/TOOLS/dofmanager.hpp delete mode 100644 tlnos/src/TOOLS/elasticity.hpp delete mode 100644 tlnos/src/TOOLS/elasticitySIMP.hpp delete mode 100644 tlnos/src/TOOLS/materials.hpp delete mode 100644 tlnos/src/TOOLS/meshmanager.hpp delete mode 100644 tlnos/src/constraint.hpp delete mode 100644 tlnos/src/data.hpp delete mode 100644 tlnos/src/objective.hpp delete mode 100644 tlnos/src/tlnos.h delete mode 100644 tlnos/src/wExample1.cpp delete mode 100644 tlnos/src/wExample1.h delete mode 100644 tlnos/src/wExample10.cpp delete mode 100644 tlnos/src/wExample10.h delete mode 100644 tlnos/src/wExample2.cpp delete mode 100644 tlnos/src/wExample2.h delete mode 100644 tlnos/src/wExample3.cpp.disabled delete mode 100644 tlnos/src/wExample3.h.disabled delete mode 100644 tlnos/src/wExample4.cpp delete mode 100644 tlnos/src/wExample4.h delete mode 100644 tlnos/src/wExample5.cpp delete mode 100644 tlnos/src/wExample5.h delete mode 100644 tlnos/src/wExample6.cpp delete mode 100644 tlnos/src/wExample6.h delete mode 100644 tlnos/src/wExample7.cpp.disabled delete mode 100644 tlnos/src/wExample7.h.disabled delete mode 100644 tlnos/src/wExample8.cpp delete mode 100644 tlnos/src/wExample8.h delete mode 100644 tlnos/src/wExample9.cpp delete mode 100644 tlnos/src/wExample9.h delete mode 100755 tlnos/tests/example1.py delete mode 100755 tlnos/tests/example10.py delete mode 100755 tlnos/tests/example2.py delete mode 100755 tlnos/tests/example4.py delete mode 100644 tlnos/tests/input.xml delete mode 100644 waves/CMakeFiles/CMakeDirectoryInformation.cmake delete mode 100644 waves/CMakeFiles/progress.marks delete mode 100644 waves/CMakeLists.txt delete mode 100644 waves/__init__.py delete mode 100644 waves/_src/CMakeLists.txt delete mode 100644 waves/_src/wavesw.i delete mode 100644 waves/attic/export_xml.py delete mode 100644 waves/attic/testSonarQ.cpp delete mode 100644 waves/attic/wDof.cpp delete mode 100644 waves/attic/wDof.h delete mode 100644 waves/attic/wField.cpp delete mode 100644 waves/attic/wField.h delete mode 100644 waves/attic/wSolver1.cpp delete mode 100644 waves/attic/wSolver1.h delete mode 100644 waves/broken/cas1.geo delete mode 100755 waves/broken/cas1.py delete mode 100644 waves/broken/geuz/geophysique.geo delete mode 100644 waves/broken/geuz/geophysique.pro delete mode 100755 waves/broken/geuz/geophysique.py delete mode 100644 waves/broken/geuz/geophysique_param.geo delete mode 100755 waves/broken/waves01_onelab.py delete mode 100644 waves/exe/CMakeLists.txt delete mode 100644 waves/exe/main.cpp delete mode 100644 waves/models/__init__.py delete mode 100644 waves/models/cube.geo delete mode 100644 waves/models/cube2mat.geo delete mode 100755 waves/models/plane1mat.py delete mode 100755 waves/models/plane2mat.py delete mode 100644 waves/src/CMakeLists.txt delete mode 100644 waves/src/wBoundary.cpp delete mode 100644 waves/src/wBoundary.h delete mode 100644 waves/src/wDisplayHook.cpp delete mode 100644 waves/src/wDisplayHook.h delete mode 100644 waves/src/wForwardEuler.cpp delete mode 100644 waves/src/wForwardEuler.h delete mode 100644 waves/src/wMedium.cpp delete mode 100644 waves/src/wMedium.h delete mode 100644 waves/src/wNewmark.cpp delete mode 100644 waves/src/wNewmark.h delete mode 100644 waves/src/wProblem.cpp delete mode 100644 waves/src/wProblem.h delete mode 100644 waves/src/wRungeKutta.cpp delete mode 100644 waves/src/wRungeKutta.h delete mode 100644 waves/src/wSource.cpp delete mode 100644 waves/src/wSource.h delete mode 100644 waves/src/wTimeIntegration.cpp delete mode 100644 waves/src/wTimeIntegration.h delete mode 100644 waves/src/wWaveTerm.cpp delete mode 100644 waves/src/wWaveTerm.h delete mode 100644 waves/src/waves.h delete mode 100644 waves/srcs.py delete mode 100755 waves/tests/attic/bulthuis.geo delete mode 100644 waves/tests/attic/strates.geo delete mode 100755 waves/tests/mat1/interf1.py delete mode 100755 waves/tests/mat1/interf2.py delete mode 100755 waves/tests/mat1/planewave.py delete mode 100755 waves/tests/mat1/pulse.py delete mode 100755 waves/tests/mat1/sinsrc.py delete mode 100755 waves/tests/mat2/interf1.py delete mode 100755 waves/tests/mat2/pulse.py delete mode 100755 waves/tests/mat2/reflex.py delete mode 100755 waves/tests/mat2/sinsrc.py delete mode 100644 waves/utils.py delete mode 100644 waves/viewer.py diff --git a/.clang-format b/.clang-format deleted file mode 100644 index 60cf9d53..00000000 --- a/.clang-format +++ /dev/null @@ -1,11 +0,0 @@ ---- -# https://clang.llvm.org/docs/ClangFormatStyleOptions.html# -# the "Visual Studio" style is similar to: -BasedOnStyle: LLVM -UseTab: Never -IndentWidth: 4 -BreakBeforeBraces: Allman -AccessModifierOffset: -4 -SortIncludes: false -ColumnLimit: 0 -... diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index de6044b9..00000000 --- a/.editorconfig +++ /dev/null @@ -1,8 +0,0 @@ -# EditorConfig is awesome: https://EditorConfig.org - -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 4 diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index b2417267..00000000 --- a/.gitattributes +++ /dev/null @@ -1,6 +0,0 @@ -*_lfs.msh filter=lfs diff=lfs merge=lfs -text -*_lfs.apdl filter=lfs diff=lfs merge=lfs -text -*_lfs.ansys filter=lfs diff=lfs merge=lfs -text -*.brep filter=lfs diff=lfs merge=lfs -text -*.stp filter=lfs diff=lfs merge=lfs -text - diff --git a/.gitignore b/.gitignore deleted file mode 100644 index c75d6969..00000000 --- a/.gitignore +++ /dev/null @@ -1,66 +0,0 @@ -# Compiled Object files -*.slo -*.lo -*.o - -# Compiled Dynamic libraries -*.so -*.dylib - -# Compiled Static libraries -*.lai -*.la -*.a - -# Misc -core -*.pyc -__pycache__/ -*.*~ - -# OS -.DS_Store -*.swp -*.bak - -# Workspace -workspace -workspace.tar.gz -*.tar.gz -*.tgz - -# build dir -build - -# gitlab-ci / clang-format -patches - -# Ansys -*.apdl -!*_lfs.apdl -*.ansys -!*_lfs.ansys - -# Gmsh -*.pos -*.msh # do not commit the mesh... -!*_lfs.msh # ... except in the lfs -#*.opt - -# sge output -*.o* -*.po* - -# matlab -*.asv - -# paraview -*.ogv -*.pvsm - -# IDE -.project -.pydevproject -.settings -.vscode -.vscode/* diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index d905eed8..00000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,116 +0,0 @@ -# gitlab-ci file for waves - -default: - image: rboman/waves-py3:2020.3 - before_script: - - source /opt/intel/mkl/bin/mklvars.sh intel64 - - source /opt/intel/tbb/bin/tbbvars.sh intel64 - - echo $(nproc) - - printenv | sort - -.global_tag: &global_tag_def - tags: - - mn2l -# - warson # you can choose a set of runners here - -variables: - GIT_SUBMODULE_STRATEGY: recursive - GIT_STRATEGY: clone # workaround full clone for each pipeline (https://gitlab.com/gitlab-org/gitlab-runner/-/issues/26993) - GIT_LFS_SKIP_SMUDGE: 1 # do not pull LFS - -stages: - - build - - test - -format: - <<: *global_tag_def - stage: build - script: - - clang-format --version # we use clang-format-10 exclusively - - ./ext/amfe/scripts/format_code.py - - mkdir -p patches - - if git diff --patch --exit-code > patches/clang-format.patch; then echo "Clang format changed nothing"; else echo "Clang format found changes to make!"; false; fi - artifacts: - paths: - - patches/ - expire_in: 1 day - when: on_failure - allow_failure: true - -build-no-tlnos: - <<: *global_tag_def - stage: build - script: - - git submodule init - - git submodule update - - rm -rf build workspace - - mkdir build - - cd build - - cmake -Wno-dev -C ../CMake/disable-trilinos.cmake .. - - make -j 8 - -build: - <<: *global_tag_def - stage: build - script: - - git submodule init - - git submodule update - - rm -rf build workspace - - mkdir build - - cd build - - cmake -Wno-dev .. - - make -j 8 - artifacts: - paths: - - build/ - expire_in: 1 day - -build-red: - <<: *global_tag_def - image: rboman/waves-py3-red:2020.3 - stage: build - script: - - git submodule init - - git submodule update - - rm -rf build workspace - - mkdir build - - cd build - - cmake -Wno-dev .. - - make -j 8 - artifacts: - paths: - - build/ - expire_in: 1 day - -doxygen: - <<: *global_tag_def - stage: test - script: - - cd build - - make dox - artifacts: - paths: - - build/doxygen/ - expire_in: 1 week - dependencies: - - build - -ctest: - <<: *global_tag_def - stage: test - script: - - cd build - - ctest --output-on-failure -j 8 - #timeout: 10 hours # will be available in 12.3 - dependencies: - - build - -ctest-red: - <<: *global_tag_def - image: rboman/waves-py3-red:2020.3 - stage: test - script: - - cd build - - ctest --output-on-failure -j 8 -R katoptron - dependencies: - - build-red diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e84a099a..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "ext/amfe"] - path = ext/amfe - url = ../amfe.git diff --git a/CMake/FindMPI4PY.cmake b/CMake/FindMPI4PY.cmake deleted file mode 100644 index 9d4bb340..00000000 --- a/CMake/FindMPI4PY.cmake +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -if(NOT MPI4PY_INCLUDE_DIR) - execute_process(COMMAND - "${PYTHON_EXECUTABLE}" "-c" "import mpi4py; print(mpi4py.get_include())" - OUTPUT_VARIABLE MPI4PY_INCLUDE_DIR - RESULT_VARIABLE MPI4PY_COMMAND_RESULT - OUTPUT_STRIP_TRAILING_WHITESPACE) - if(MPI4PY_COMMAND_RESULT) - message("waves/CMake/FindMPI4PY: mpi4py not found") - set(MPI4PY_FOUND FALSE) - else(MPI4PY_COMMAND_RESULT) - if (MPI4PY_INCLUDE_DIR MATCHES "Traceback") - message("waves/CMake/FindMPI4PY: mpi4py matches traceback") - ## Did not successfully include MPI4PY - set(MPI4PY_FOUND FALSE) - else (MPI4PY_INCLUDE_DIR MATCHES "Traceback") - ## successful - set(MPI4PY_FOUND TRUE) - set(MPI4PY_INCLUDE_DIR ${MPI4PY_INCLUDE_DIR} CACHE STRING "mpi4py include path") - endif (MPI4PY_INCLUDE_DIR MATCHES "Traceback") - endif(MPI4PY_COMMAND_RESULT) -else(NOT MPI4PY_INCLUDE_DIR) - set(MPI4PY_FOUND TRUE) -endif(NOT MPI4PY_INCLUDE_DIR) -# ---------------------------------------------------------------------------- - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(MPI4PY DEFAULT_MSG - MPI4PY_INCLUDE_DIR) diff --git a/CMake/disable-trilinos.cmake b/CMake/disable-trilinos.cmake deleted file mode 100644 index e941f2a4..00000000 --- a/CMake/disable-trilinos.cmake +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -SET(WAVES_USE_KATOPTRON OFF CACHE BOOL "" FORCE) -SET(WAVES_USE_TLNOS OFF CACHE BOOL "" FORCE) diff --git a/CMake/fabulous.cmake b/CMake/fabulous.cmake deleted file mode 100644 index 77b1fbaa..00000000 --- a/CMake/fabulous.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -FIND_PROGRAM(CMAKE_CXX_COMPILER NAMES icpc) -FIND_PROGRAM(CMAKE_C_COMPILER NAMES icc) diff --git a/CMake/maclam.cmake b/CMake/maclam.cmake deleted file mode 100644 index fe5d340a..00000000 --- a/CMake/maclam.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Disable Trilinos (we should test with Trilinos/clang) -LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}) -INCLUDE(disable-trilinos) - -SET(Python3_ROOT_DIR "/Library/Frameworks/Python.framework/Versions/3.7" CACHE PATH "" FORCE) diff --git a/CMake/mingw32-msys.cmake b/CMake/mingw32-msys.cmake deleted file mode 100644 index 24e405e5..00000000 --- a/CMake/mingw32-msys.cmake +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# MSYS Makefiles (pour MinGW) -# -# PATH=c:\MinGW\bin;C:\MinGW\msys\1.0\bin - -STRING(REGEX REPLACE "\\\\" "/" MYLOCAL $ENV{MYLOCAL}) -SET(CMAKE_GENERATOR "MSYS Makefiles" CACHE INTERNAL "" FORCE) - -SET(MUMPS_LIB_PATH "${MYLOCAL}/WinMumps-4.10/MUMPS_4.10.0/lib/Release/x64/" CACHE PATH "" FORCE) -SET(MUMPS_INCLUDE_PATH "${MYLOCAL}/WinMumps-4.10/MUMPS_4.10.0/include" CACHE PATH "" FORCE) - -SET(WAVES_USE_MKL OFF CACHE BOOL "" FORCE) -SET(BLA_VENDOR "OpenBlas" CACHE STRING "" FORCE) diff --git a/CMake/mingw32.cmake b/CMake/mingw32.cmake deleted file mode 100644 index ba1fd545..00000000 --- a/CMake/mingw32.cmake +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# MinGW Makefiles (pour "mingw32-make") -# -# PATH=c:\MinGW\bin;C:\MinGW\msys\1.0\bin (en desactivant "sh.exe" du PATH) -# ou -# PATH=c:\MinGW\bin - -STRING(REGEX REPLACE "\\\\" "/" MYLOCAL $ENV{MYLOCAL}) -SET(CMAKE_GENERATOR "MinGW Makefiles" CACHE INTERNAL "" FORCE) - -#SET(MUMPS_LIB_PATH "${MYLOCAL}/WinMumps-4.10/MUMPS_4.10.0/lib/Release/x64/" CACHE PATH "" FORCE) -#SET(MUMPS_INCLUDE_PATH "${MYLOCAL}/WinMumps-4.10/MUMPS_4.10.0/include" CACHE PATH "" FORCE) - -SET(WAVES_USE_MKL OFF CACHE BOOL "" FORCE) -SET(BLA_VENDOR "OpenBlas" CACHE STRING "" FORCE) diff --git a/CMake/msys2.cmake b/CMake/msys2.cmake deleted file mode 100644 index 4c5afd03..00000000 --- a/CMake/msys2.cmake +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# MSYS2 with MinGW (AC) - -SET(CMAKE_GENERATOR "MSYS Makefiles" CACHE INTERNAL "" FORCE) -SET(WAVES_USE_MKL OFF CACHE BOOL "" FORCE) -SET(WAVES_USE_MUMPS OFF CACHE BOOL "" FORCE) - -# Prevent CMake to find TBB from oneAPI (so that it can find TBB from MSYS) -IF(DEFINED ENV{ONEAPI_ROOT}) - UNSET(ENV{ONEAPI_ROOT}) -ENDIF() diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index ddf537d5..00000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,181 +0,0 @@ -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# ---------------------------------------------------------------------------- -PROJECT(Waves) -# ---------------------------------------------------------------------------- -CMAKE_MINIMUM_REQUIRED(VERSION 3.1) -IF(${CMAKE_VERSION} VERSION_GREATER "3.14.0") # we might want to update the project and use the NEW behavior here - cmake_policy(SET CMP0078 OLD) - cmake_policy(SET CMP0086 OLD) -ENDIF() - -# -- I/O -# Lib/Exe dir -SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE PATH - "Single output directory for building all libraries.") -SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE PATH - "Single output directory for building all executables.") -MARK_AS_ADVANCED(LIBRARY_OUTPUT_PATH EXECUTABLE_OUTPUT_PATH) - -# Build type -IF(NOT CMAKE_BUILD_TYPE) - SET( CMAKE_BUILD_TYPE "Release" CACHE STRING - "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." - FORCE) -ENDIF(NOT CMAKE_BUILD_TYPE) - -LIST(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/CMake") - -# -- GENERAL OPTIONS - -# (de)activate modules -OPTION(WAVES_USE_FLOW "Compile flow module" ON) -OPTION(WAVES_USE_HEAT "Compile heat module" ON) -OPTION(WAVES_USE_MIRRORS "Compile mirrors module" ON) -OPTION(WAVES_USE_KATOPTRON "Compile katoptron module" ON) -OPTION(WAVES_USE_PARAMS "Compile params module" ON) -OPTION(WAVES_USE_TLNOS "Compile tlnos module" ON) -OPTION(WAVES_USE_WAVES "Compile waves module" ON) - -# --- Disable some Options on Windows -IF(WIN32) - # Trilinos is not available on Windows - MESSAGE("Disabling TRILINOS on Windows") - SET(WAVES_USE_KATOPTRON OFF CACHE BOOL "" FORCE) - SET(WAVES_USE_TLNOS OFF CACHE BOOL "" FORCE) -ENDIF() - -# macros/fcts -# INCLUDE(fwkMacros) - -# -- C++11 -SET(CMAKE_CXX_STANDARD 11) # newer way to set C++11 (requires cmake>=3.1) -SET(CMAKE_CXX_STANDARD_REQUIRED ON) - -# Set specific languages flags -IF((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Intel")) - IF(NOT APPLE) - SET(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-as-needed") - ENDIF() - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") # add verbosity - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp -Wno-unknown-pragmas -Wno-sign-compare") # merge trilinos -ELSEIF(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") - ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_DEPRECATE) - ADD_DEFINITIONS(-D_USE_MATH_DEFINES) # otherwise M_PI is undefined - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") # parallel build with MSVC - #SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") # add verbosity -ELSEIF(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-register") - #SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weverything") # add verbosity -ENDIF() - -# -- OS related (from Kim) -IF(APPLE) - SET(CMAKE_MACOSX_RPATH TRUE) -ENDIF() - -# -- Search for Python -IF (CMAKE_VERSION VERSION_LESS 3.12.0) - FIND_PACKAGE(PythonInterp 3.6 REQUIRED) - FIND_PACKAGE(PythonLibs 3.6 REQUIRED) -ELSE() - FIND_PACKAGE(Python3 COMPONENTS Interpreter Development) - # use Python3_ROOT_DIR if wrong python found (e.g. anaconda) - SET(PYTHON_EXECUTABLE ${Python3_EXECUTABLE}) - SET(PYTHON_LIBRARIES ${Python3_LIBRARIES}) - SET(PYTHON_INCLUDE_PATH ${Python3_INCLUDE_DIRS}) - SET(PYTHONLIBS_VERSION_STRING ${Python3_VERSION}) -ENDIF() -MESSAGE(STATUS "PYTHON_EXECUTABLE:FILEPATH=${PYTHON_EXECUTABLE}") -MESSAGE(STATUS "PYTHON_LIBRARIES:FILEPATH=${PYTHON_LIBRARIES}") -MESSAGE(STATUS "PYTHON_INCLUDE_PATH:FILEPATH=${PYTHON_INCLUDE_PATH}") -MESSAGE(STATUS "PYTHON_FRAMEWORK_INCLUDES=${PYTHON_FRAMEWORK_INCLUDES}") -MESSAGE(STATUS "PYTHONLIBS_VERSION_STRING=${PYTHONLIBS_VERSION_STRING}") -MESSAGE(STATUS "Python_FRAMEWORKS=${Python_FRAMEWORKS}") - -# -- Search for SWIG -FIND_PACKAGE(SWIG REQUIRED) -IF(CMAKE_GENERATOR MATCHES "Visual Studio") # not MSVC because of nmake & jom - SET(CMAKE_SWIG_OUTDIR "${EXECUTABLE_OUTPUT_PATH}/$(Configuration)/") -ELSE() - SET(CMAKE_SWIG_OUTDIR "${EXECUTABLE_OUTPUT_PATH}") -ENDIF() - -# -- Doxygen (https://vicrucann.github.io/tutorials/quick-cmake-doxygen/) -# check if Doxygen is installed -FIND_PACKAGE(Doxygen) -IF(DOXYGEN_FOUND) - # set input and output files - SET(DOXYGEN_IN ${PROJECT_SOURCE_DIR}/Doxyfile.in) - SET(DOXYGEN_OUT ${PROJECT_BINARY_DIR}/Doxyfile) - # request to configure the file - CONFIGURE_FILE(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY) - # note the option ALL which allows to build the docs together with the application - # "make dox" rebuilds the doc - ADD_CUSTOM_TARGET( dox #ALL - COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - COMMENT "Generating API documentation with Doxygen" - VERBATIM ) -ELSE() - MESSAGE("Doxygen needs to be installed to generate the doxygen documentation") -ENDIF() - -INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR}) # to find "amfe_def.h" - -# -- CTest -ENABLE_TESTING() - -# -- INSTALL -IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -m site --user-site OUTPUT_VARIABLE PY_SITE OUTPUT_STRIP_TRAILING_WHITESPACE) - STRING(REGEX REPLACE "\\\\" "/" PY_SITE ${PY_SITE}) - SET(CMAKE_INSTALL_PREFIX "${PY_SITE}/waves" CACHE STRING "Install location" FORCE) - SET(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT FALSE) -ENDIF() -IF(UNIX AND NOT APPLE) - SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}") -ENDIF() - -# -- Sub directories - -ADD_SUBDIRECTORY( ext ) - -IF(WAVES_USE_HEAT) - ADD_SUBDIRECTORY( heat ) -ENDIF() - -IF(WAVES_USE_KATOPTRON) - ADD_SUBDIRECTORY( katoptron ) -ENDIF() - -IF(WAVES_USE_TLNOS) - ADD_SUBDIRECTORY( tlnos ) -ENDIF() - -IF(WAVES_USE_WAVES) - ADD_SUBDIRECTORY( waves ) -ENDIF() - -# -- FINAL -MESSAGE(STATUS "PROJECT: ${CMAKE_PROJECT_NAME}") -MESSAGE(STATUS "* SYSTEM NAME=\"${CMAKE_SYSTEM_NAME}\"") -MESSAGE(STATUS "* CXX COMPILER: ${CMAKE_CXX_COMPILER_ID}") -MESSAGE(STATUS "* CXX STANDARD: ${CMAKE_CXX_STANDARD}") -MESSAGE(STATUS "* INSTALL DIR: ${CMAKE_INSTALL_PREFIX}") -MESSAGE(STATUS "* BUILD TYPE: ${CMAKE_BUILD_TYPE}") -MESSAGE(STATUS "* VTK SUPPORT: ${USE_VTK}") -MESSAGE(STATUS "* MKL SUPPORT: ${USE_MKL}") -MESSAGE(STATUS "* MUMPS SUPPORT: ${USE_MUMPS}") diff --git a/CODEOWNERS b/CODEOWNERS deleted file mode 100644 index dd7e745b..00000000 --- a/CODEOWNERS +++ /dev/null @@ -1,16 +0,0 @@ -# This is a comment. -# Each line is a file pattern followed by one or more owners. - -# These owners will be the default owners for everything in -# the repo. Unless a later match takes precedence, they -# will be requested for review when someone opens a pull request. -* @R.Boman - -# These owners own a directory and nested subdirectories -/flow/ @acrovato - -# You can also use email addresses if you prefer. They'll be -# used to look up users just like we do for commit author -# emails. -#*.go docs@example.com - diff --git a/Doxyfile.in b/Doxyfile.in deleted file mode 100644 index e3ae7891..00000000 --- a/Doxyfile.in +++ /dev/null @@ -1,2493 +0,0 @@ -# Doxyfile 1.8.11 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv -# for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = waves - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = "Basic FE playground" - -# With the PROJECT_LOGO tag one can specify a logo or an icon that is included -# in the documentation. The maximum height of the logo should not exceed 55 -# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy -# the logo to the output directory. - -PROJECT_LOGO = @PROJECT_SOURCE_DIR@/dox/logo.jpg - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = @PROJECT_BINARY_DIR@/doxygen - -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. -# The default value is: NO. - -CREATE_SUBDIRS = NO - -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII -# characters to appear in the names of generated files. If set to NO, non-ASCII -# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode -# U+3044. -# The default value is: NO. - -ALLOW_UNICODE_NAMES = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = YES - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new -# page for each member. If set to NO, the documentation of a member will be part -# of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:\n" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: -# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: -# Fortran. In the later case the parser tries to guess whether the code is fixed -# or free formatted code, this is the default for Fortran type files), VHDL. For -# instance to make doxygen treat .inc files as Fortran files (default is PHP), -# and .f files as C (default is Fortran), use: inc=Fortran f=C. -# -# Note: For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by putting a % sign in front of the word or -# globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# If one adds a struct or class to a group and this option is enabled, then also -# any nested class or struct is added to the same group. By default this option -# is disabled and one has to add nested compounds explicitly via \ingroup. -# The default value is: NO. - -GROUP_NESTED_COMPOUNDS = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = YES - -# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO, -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. If set to YES, local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO, only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO, these declarations will be -# included in the documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO, these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES, the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will -# append additional text to a page's title, such as Class Reference. If set to -# YES the compound reference will be hidden. -# The default value is: NO. - -HIDE_COMPOUND_REFERENCE= NO - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo -# list. This list is created by putting \todo commands in the documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test -# list. This list is created by putting \test commands in the documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if <section_label> ... \endif and \cond <section_label> -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES, the -# list will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. See also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. -# The default value is: NO. - -WARN_NO_PARAMDOC = NO - -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. -# The default value is: NO. - -WARN_AS_ERROR = NO - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING -# Note: If this tag is empty the current directory is searched. - -INPUT = @PROJECT_SOURCE_DIR@/README.md \ - @PROJECT_SOURCE_DIR@/flow/src \ - @PROJECT_SOURCE_DIR@/fwk/src \ - @PROJECT_SOURCE_DIR@/heat/src \ - @PROJECT_SOURCE_DIR@/mirrors/src \ - @PROJECT_SOURCE_DIR@/katoptron/src \ - @PROJECT_SOURCE_DIR@/tbox/src \ - @PROJECT_SOURCE_DIR@/waves/src - - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: http://www.gnu.org/software/libiconv) for the list of -# possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by doxygen. -# -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl, -# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js. - -FILE_PATTERNS = *.c \ - *.cpp \ - *.h \ - *.hpp \ - *.md - -#FILE_PATTERNS = *.c \ -# *.cc \ -# *.cxx \ -# *.cpp \ -# *.c++ \ -# *.java \ -# *.ii \ -# *.ixx \ -# *.ipp \ -# *.i++ \ -# *.inl \ -# *.idl \ -# *.ddl \ -# *.odl \ -# *.h \ -# *.hh \ -# *.hxx \ -# *.hpp \ -# *.h++ \ -# *.cs \ -# *.d \ -# *.php \ -# *.php4 \ -# *.php5 \ -# *.phtml \ -# *.inc \ -# *.m \ -# *.markdown \ -# *.md \ -# *.mm \ -# *.dox \ -# *.py \ -# *.pyw \ -# *.f90 \ -# *.f \ -# *.for \ -# *.tcl \ -# *.vhd \ -# *.vhdl \ -# *.ucf \ -# *.qsf \ -# *.as \ -# *.js - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = @PROJECT_SOURCE_DIR@/dox/ - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# <filter> <input-file> -# -# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = README.md - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = YES - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = YES - -# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the -# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the -# cost of reduced performance. This can be particularly helpful with template -# rich C++ code for which doxygen's built-in parser lacks the necessary type -# information. -# Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse-libclang=ON option for CMake. -# The default value is: NO. - -CLANG_ASSISTED_PARSING = NO - -# If clang assisted parsing is enabled you can provide the compiler with command -# line options that you would normally use when invoking the compiler. Note that -# the include paths will already be set by doxygen for the files and directories -# specified with INPUT and INCLUDE_PATH. -# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. - -CLANG_OPTIONS = - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = NO - -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefore more robust against future updates. -# Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra style sheet files is of importance (e.g. the last -# style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: http://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = NO - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler (hhc.exe). If non-empty, -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = - -# The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the master .chm file (NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated -# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it -# enables the Previous and Next buttons. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- -# folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = YES - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = YES - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use <access key> + S -# (what the <access key> is depends on the OS and browser, but it is typically -# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down -# key> to jump into the search results window, the results can be navigated -# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel -# the search. The filter options can be selected when the cursor is inside the -# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys> -# to select a filter and <Enter> or <escape> to activate or cancel the filter -# option. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -SEARCHENGINE = YES - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a web server instead of a web client using Javascript. There -# are two flavors of web server based searching depending on the EXTERNAL_SEARCH -# setting. When disabled, doxygen will generate a PHP script for searching and -# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing -# and searching needs to be provided by external tools. See the section -# "External Indexing and Searching" for details. -# The default value is: NO. -# This tag requires that the tag SEARCHENGINE is set to YES. - -SERVER_BASED_SEARCH = NO - -# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP -# script for searching. Instead the search results are written to an XML file -# which needs to be processed by an external indexer. Doxygen will invoke an -# external search engine pointed to by the SEARCHENGINE_URL option to obtain the -# search results. -# -# Doxygen ships with an example indexer (doxyindexer) and search engine -# (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: http://xapian.org/). -# -# See the section "External Indexing and Searching" for details. -# The default value is: NO. -# This tag requires that the tag SEARCHENGINE is set to YES. - -EXTERNAL_SEARCH = NO - -# The SEARCHENGINE_URL should point to a search engine hosted by a web server -# which will return the search results when EXTERNAL_SEARCH is enabled. -# -# Doxygen ships with an example indexer (doxyindexer) and search engine -# (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: http://xapian.org/). See the section "External Indexing and -# Searching" for details. -# This tag requires that the tag SEARCHENGINE is set to YES. - -SEARCHENGINE_URL = - -# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed -# search data is written to a file for indexing by an external tool. With the -# SEARCHDATA_FILE tag the name of this file can be specified. -# The default file is: searchdata.xml. -# This tag requires that the tag SEARCHENGINE is set to YES. - -SEARCHDATA_FILE = searchdata.xml - -# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the -# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is -# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple -# projects and redirect the results back to the right project. -# This tag requires that the tag SEARCHENGINE is set to YES. - -EXTERNAL_SEARCH_ID = - -# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen -# projects other than the one defined by this configuration file, but that are -# all added to the same external search index. Each project needs to have a -# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of -# to a relative location where the documentation can be found. The format is: -# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... -# This tag requires that the tag SEARCHENGINE is set to YES. - -EXTRA_SEARCH_MAPPINGS = - -#--------------------------------------------------------------------------- -# Configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. -# The default value is: YES. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: latex. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. -# -# Note that when enabling USE_PDFLATEX this option is only used for generating -# bitmaps for formulas in the HTML output, but not in the Makefile that is -# written to the output directory. -# The default file is: latex. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate -# index for LaTeX. -# The default file is: makeindex. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX -# documents. This may be useful for small projects and may help to save some -# trees in general. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used by the -# printer. -# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x -# 14 inches) and executive (7.25 x 10.5 inches). -# The default value is: a4. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -PAPER_TYPE = a4 - -# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names -# that should be included in the LaTeX output. The package can be specified just -# by its name or with the correct syntax as to be used with the LaTeX -# \usepackage command. To get the times font for instance you can specify : -# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times} -# To use the option intlimits with the amsmath package you can specify: -# EXTRA_PACKAGES=[intlimits]{amsmath} -# If left blank no extra packages will be included. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -EXTRA_PACKAGES = amsmath - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. -# -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty -# string, for the replacement values of the other commands the user is referred -# to HTML_HEADER. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_HEADER = - -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. See -# LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. -# -# Note: Only use a user-defined footer if you know what you are doing! -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_FOOTER = - -# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# LaTeX style sheets that are included after the standard style sheets created -# by doxygen. Using this option one can overrule certain style aspects. Doxygen -# will copy the style sheet files to the output directory. -# Note: The order of the extra style sheet files is of importance (e.g. the last -# style sheet in the list overrules the setting of the previous ones in the -# list). -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_EXTRA_STYLESHEET = - -# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the LATEX_OUTPUT output -# directory. Note that the files will be copied as-is; there are no commands or -# markers available. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_EXTRA_FILES = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is -# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will -# contain links (just like the HTML output) instead of page references. This -# makes the output suitable for online browsing using a PDF viewer. -# The default value is: YES. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate -# the PDF file directly from the LaTeX files. Set this option to YES, to get a -# higher quality PDF documentation. -# The default value is: YES. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode -# command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. This option is also used -# when generating formulas in HTML. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_BATCHMODE = NO - -# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the -# index chapters (such as File Index, Compound Index, etc.) in the output. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_HIDE_INDICES = NO - -# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source -# code with syntax highlighting in the LaTeX output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_SOURCE_CODE = NO - -# The LATEX_BIB_STYLE tag can be used to specify the style to use for the -# bibliography, e.g. plainnat, or ieeetr. See -# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. -# The default value is: plain. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_BIB_STYLE = plain - -# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_TIMESTAMP = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The -# RTF output is optimized for Word 97 and may not look too pretty with other RTF -# readers/editors. -# The default value is: NO. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: rtf. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF -# documents. This may be useful for small projects and may help to save some -# trees in general. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will -# contain hyperlink fields. The RTF file will contain links (just like the HTML -# output) instead of page references. This makes the output suitable for online -# browsing using Word or some other Word compatible readers that support those -# fields. -# -# Note: WordPad (write) and others do not support links. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's config -# file, i.e. a series of assignments. You only have to provide replacements, -# missing definitions are set to their default value. -# -# See also section "Doxygen usage" for information on how to generate the -# default style sheet that doxygen normally uses. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an RTF document. Syntax is -# similar to doxygen's config file. A template extensions file can be generated -# using doxygen -e rtf extensionFile. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_EXTENSIONS_FILE = - -# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code -# with syntax highlighting in the RTF output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_SOURCE_CODE = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for -# classes and files. -# The default value is: NO. - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. A directory man3 will be created inside the directory specified by -# MAN_OUTPUT. -# The default directory is: man. -# This tag requires that the tag GENERATE_MAN is set to YES. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to the generated -# man pages. In case the manual section does not start with a number, the number -# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is -# optional. -# The default value is: .3. -# This tag requires that the tag GENERATE_MAN is set to YES. - -MAN_EXTENSION = .3 - -# The MAN_SUBDIR tag determines the name of the directory created within -# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by -# MAN_EXTENSION with the initial . removed. -# This tag requires that the tag GENERATE_MAN is set to YES. - -MAN_SUBDIR = - -# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it -# will generate one additional man file for each entity documented in the real -# man page(s). These additional files only source the real man page, but without -# them the man command would be unable to find the correct page. -# The default value is: NO. -# This tag requires that the tag GENERATE_MAN is set to YES. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that -# captures the structure of the code including all documentation. -# The default value is: NO. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: xml. -# This tag requires that the tag GENERATE_XML is set to YES. - -XML_OUTPUT = xml - -# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program -# listings (including syntax highlighting and cross-referencing information) to -# the XML output. Note that enabling this will significantly increase the size -# of the XML output. -# The default value is: YES. -# This tag requires that the tag GENERATE_XML is set to YES. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# Configuration options related to the DOCBOOK output -#--------------------------------------------------------------------------- - -# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files -# that can be used to generate PDF. -# The default value is: NO. - -GENERATE_DOCBOOK = NO - -# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in -# front of it. -# The default directory is: docbook. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_OUTPUT = docbook - -# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the -# program listings (including syntax highlighting and cross-referencing -# information) to the DOCBOOK output. Note that enabling this will significantly -# increase the size of the DOCBOOK output. -# The default value is: NO. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_PROGRAMLISTING = NO - -#--------------------------------------------------------------------------- -# Configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an -# AutoGen Definitions (see http://autogen.sf.net) file that captures the -# structure of the code including all documentation. Note that this feature is -# still experimental and incomplete at the moment. -# The default value is: NO. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module -# file that captures the structure of the code including all documentation. -# -# Note that this feature is still experimental and incomplete at the moment. -# The default value is: NO. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary -# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI -# output from the Perl module output. -# The default value is: NO. -# This tag requires that the tag GENERATE_PERLMOD is set to YES. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely -# formatted so it can be parsed by a human reader. This is useful if you want to -# understand what is going on. On the other hand, if this tag is set to NO, the -# size of the Perl module output will be much smaller and Perl will parse it -# just the same. -# The default value is: YES. -# This tag requires that the tag GENERATE_PERLMOD is set to YES. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file are -# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful -# so different doxyrules.make files included by the same Makefile don't -# overwrite each other's variables. -# This tag requires that the tag GENERATE_PERLMOD is set to YES. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all -# C-preprocessor directives found in the sources and include files. -# The default value is: YES. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names -# in the source code. If set to NO, only conditional compilation will be -# performed. Macro expansion can be done in a controlled way by setting -# EXPAND_ONLY_PREDEF to YES. -# The default value is: NO. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then -# the macro expansion is limited to the macros specified with the PREDEFINED and -# EXPAND_AS_DEFINED tags. -# The default value is: NO. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES, the include files in the -# INCLUDE_PATH will be searched if a #include is found. -# The default value is: YES. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by the -# preprocessor. -# This tag requires that the tag SEARCH_INCLUDES is set to YES. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will be -# used. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that are -# defined before the preprocessor is started (similar to the -D option of e.g. -# gcc). The argument of the tag is a list of macros of the form: name or -# name=definition (no spaces). If the definition and the "=" are omitted, "=1" -# is assumed. To prevent a macro definition from being undefined via #undef or -# recursively expanded use the := operator instead of the = operator. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this -# tag can be used to specify a list of macro names that should be expanded. The -# macro definition that is found in the sources will be used. Use the PREDEFINED -# tag if you want to use a different macro definition that overrules the -# definition found in the source code. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will -# remove all references to function-like macros that are alone on a line, have -# an all uppercase name, and do not end with a semicolon. Such function macros -# are typically used for boiler-plate code, and will confuse the parser if not -# removed. -# The default value is: YES. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration options related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES tag can be used to specify one or more tag files. For each tag -# file the location of the external documentation should be added. The format of -# a tag file without this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where loc1 and loc2 can be relative or absolute paths or URLs. See the -# section "Linking to external documentation" for more information about the use -# of tag files. -# Note: Each tag file must have a unique name (where the name does NOT include -# the path). If a tag file is not located in the directory in which doxygen is -# run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create a -# tag file that is based on the input files it reads. See section "Linking to -# external documentation" for more information about the usage of tag files. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES, all external class will be listed in -# the class index. If set to NO, only the inherited external classes will be -# listed. -# The default value is: NO. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will be -# listed. -# The default value is: YES. - -EXTERNAL_GROUPS = YES - -# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in -# the related pages index. If set to NO, only the current project's pages will -# be listed. -# The default value is: YES. - -EXTERNAL_PAGES = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of 'which perl'). -# The default file (with absolute path) is: /usr/bin/perl. - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see: -# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# You can include diagrams made with dia in doxygen documentation. Doxygen will -# then run dia to produce the diagram and insert it in the documentation. The -# DIA_PATH tag allows you to specify the directory where the dia binary resides. -# If left empty dia is assumed to be found in the default search path. - -DIA_PATH = - -# If set to YES the inheritance and collaboration graphs will hide inheritance -# and usage relations if the target is undocumented or is not a class. -# The default value is: YES. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz (see: -# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent -# Bell Labs. The other options in this section have no effect if this option is -# set to NO -# The default value is: YES. - -HAVE_DOT = YES - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed -# to run in parallel. When set to 0 doxygen will base this on the number of -# processors available in the system. You can set it explicitly to a value -# larger than 0 to get control over the balance between CPU load and processing -# speed. -# Minimum value: 0, maximum value: 32, default value: 0. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_NUM_THREADS = 0 - -# When you want a differently looking font in the dot files that doxygen -# generates you can specify the font name using DOT_FONTNAME. You need to make -# sure dot is able to find the font, which can be done by putting it in a -# standard location or by setting the DOTFONTPATH environment variable or by -# setting DOT_FONTPATH to the directory containing the font. -# The default value is: Helvetica. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_FONTNAME = Helvetica - -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of -# dot graphs. -# Minimum value: 4, maximum value: 24, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the default font as specified with -# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set -# the path where dot can find it using this tag. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_FONTPATH = - -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a -# graph for each documented class showing the direct and indirect implementation -# dependencies (inheritance, containment, and class references variables) of the -# class with other documented classes. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -UML_LOOK = NO - -# If the UML_LOOK tag is enabled, the fields and methods are shown inside the -# class node. If there are many fields or methods and many nodes the graph may -# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the -# number of items for each type to make the size more manageable. Set this to 0 -# for no limit. Note that the threshold may be exceeded by 50% before the limit -# is enforced. So when you set the threshold to 10, up to 15 fields may appear, -# but if the number exceeds 15, the total amount of fields shown is limited to -# 10. -# Minimum value: 0, maximum value: 100, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. - -UML_LIMIT_NUM_FIELDS = 10 - -# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and -# collaboration graphs will show the relations between templates and their -# instances. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -TEMPLATE_RELATIONS = NO - -# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to -# YES then doxygen will generate a graph for each documented file showing the -# direct and indirect include dependencies of the file with other documented -# files. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -INCLUDE_GRAPH = YES - -# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are -# set to YES then doxygen will generate a graph for each documented file showing -# the direct and indirect include dependencies of the file with other documented -# files. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH tag is set to YES then doxygen will generate a call -# dependency graph for every global function or class method. -# -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. Disabling a call graph can be -# accomplished by means of the command \hidecallgraph. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller -# dependency graph for every global function or class method. -# -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. Disabling a caller graph can be -# accomplished by means of the command \hidecallergraph. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical -# hierarchy of all classes instead of a textual one. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the -# dependencies a directory has on other directories in a graphical way. The -# dependency relations are determined by the #include relations between the -# files in the directories. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. For an explanation of the image formats see the section -# output formats in the documentation of the dot tool (Graphviz (see: -# http://www.graphviz.org/)). -# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order -# to make the SVG files visible in IE 9+ (other browsers do not have this -# requirement). -# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd, -# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo, -# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo, -# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and -# png:gdiplus:gdiplus. -# The default value is: png. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_IMAGE_FORMAT = png - -# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to -# enable generation of interactive SVG images that allow zooming and panning. -# -# Note that this requires a modern browser other than Internet Explorer. Tested -# and working are Firefox, Chrome, Safari, and Opera. -# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make -# the SVG files visible. Older versions of IE do not have SVG support. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -INTERACTIVE_SVG = NO - -# The DOT_PATH tag can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the \dotfile -# command). -# This tag requires that the tag HAVE_DOT is set to YES. - -DOTFILE_DIRS = - -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the \mscfile -# command). - -MSCFILE_DIRS = - -# The DIAFILE_DIRS tag can be used to specify one or more directories that -# contain dia files that are included in the documentation (see the \diafile -# command). - -DIAFILE_DIRS = - -# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file. If left blank, it is assumed -# PlantUML is not used or called during a preprocessing step. Doxygen will -# generate a warning when it encounters a \startuml command in this case and -# will not generate output for the diagram. - -PLANTUML_JAR_PATH = - -# When using plantuml, the specified paths are searched for files specified by -# the !include statement in a plantuml block. - -PLANTUML_INCLUDE_PATH = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes -# that will be shown in the graph. If the number of nodes in a graph becomes -# larger than this value, doxygen will truncate the graph, which is visualized -# by representing a node as a red box. Note that doxygen if the number of direct -# children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that -# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. -# Minimum value: 0, maximum value: 10000, default value: 50. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs -# generated by dot. A depth value of 3 means that only nodes reachable from the -# root by following a path via at most 3 edges will be shown. Nodes that lay -# further from the root node will be omitted. Note that setting this option to 1 -# or 2 may greatly reduce the computation time needed for large code bases. Also -# note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. -# Minimum value: 0, maximum value: 1000, default value: 0. -# This tag requires that the tag HAVE_DOT is set to YES. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not seem -# to support this out of the box. -# -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) support -# this, this feature is disabled by default. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page -# explaining the meaning of the various boxes and arrows in the dot generated -# graphs. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot -# files that are used to generate the various graphs. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_CLEANUP = YES diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 8dada3ed..00000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md index e38d97e1..bb66284e 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,7 @@ # waves -Waves is a collection of general utilities and finite element tools for solving various PDE. The code is written in C++ interfaced in python through SWIG, and is developed at the University of Liège. - - -## Features -Set of python/C++ modules: - - [waves](/waves): 3D(Hex8) transient wave equation solver (FEM) - - [flow](https://gitlab.uliege.be/am-dept/dartflo): 2D(Tri3) and 3D(Tetra4) steady full potential equation solver (FEM) - moved to [dartflo](https://gitlab.uliege.be/am-dept/dartflo) - - [heat](/heat): 2D(Tri3) steady nonlinear heat equation solver (multiscale FE²M) - - [katoptron](/katoptron): 3D(Hex8 and Tetra4) linear thermomechanical equations with contact (FEM) - - [tlnos](/tlnos): basic Trilinos examples - -Additional features: - - [x] [Gmsh](http://geuz.org/gmsh/) support for mesh and post-processing - - [x] [VTK](http://www.vtk.org/)/[PyQt](https://riverbankcomputing.com/software/pyqt/intro) support for post processing and basic GUI - - [x] [OpenBLAS](http://www.openblas.net/) or [Intel MKL](https://software.intel.com/en-us/intel-mkl) support - - [x] [Eigen3](http://eigen.tuxfamily.org/index.php?title=Main_Page) support for linear algebra - - [Intel Pardiso](https://software.intel.com/content/www/us/en/develop/documentation/mkl-developer-reference-c/top/sparse-solver-routines/intel-mkl-pardiso-parallel-direct-sparse-solver-interface/pardiso.html) support - - [MUMPS](http://mumps.enseeiht.fr/) support - - [x] [TBB](https://www.threadingbuildingblocks.org/) support for multithreading - - [x] [mpi4py](https://bitbucket.org/mpi4py/mpi4py) support for parallelization - - [x] [Trilinos](https://trilinos.github.io/) support (for some modules) - -## Build - -Detailed build instructions can be found in the [wiki](https://gitlab.uliege.be/am-dept/waves/wikis/home). - -## References - -Liegeois Kim, [GMRES with embedded ensemble propagation for the efficient solution of parametric linear systems in uncertainty quantification of computational models with application to the thermomechanical simulation of an ITER front mirror](http://hdl.handle.net/2268/249334), University of Liège, 2020. - -Crovato Adrien, [Steady Transonic Aerodynamic and Aeroelastic Modeling for Preliminary Aircraft Design](http://hdl.handle.net/2268/251906), University of Liège, 2020. - -Liegeois K., Boman R., Phipps E., Wiesner T., and Arnst M., [GMRES with embedded ensemble propagation for the efficient solution of parametric linear systems in uncertainty quantification of computational models](http://hdl.handle.net/2268/248201), Computer Methods in Applied Mechanics and Engineering, Vol. 369, 2020. - -Crovato A., Boman R., Guner H., Terrapon V., Dimitriadis G., Almeida H., Prado A., Breviglieri C., Cabral P., and Silva, G., [A Full Potential Static Aeroelastic Solver for Preliminary Aircraft Design](http://hdl.handle.net/2268/237955), 18th International Forum on Aeroelasticity and Structural Dynamics, IFASD 2019. - -Bilocq Amaury, [Implementation of a viscous-inviscid interaction scheme in a finite element full potential solver](http://hdl.handle.net/2268/252195), University of Liège, 2020. +This old repository has been split into several components which now live in their own repositories: +- fwk & tbox: see [dartflo](https://gitlab.uliege.be/am-dept/amfe) +- flow: see [dartflo](https://gitlab.uliege.be/am-dept/dartflo) +- waves & heat: see [amfe-solvers](https://gitlab.uliege.be/am-dept/amfe-solvers) +- katoptron: see [katoptron](https://gitlab.uliege.be/am-dept/katoptron) diff --git a/dox/flow.png b/dox/flow.png deleted file mode 100644 index 36072970be132de15bfcdc2dd3dacd19eeef268e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2240929 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�QK;=g7Fx-Frgl#^`{XfV7f`)7> zs2*|5-1PXV+xT_Q3uG0ojpI(Ri~$3VTpX%Tf9=zVa#}MRs+w;3iZh1|ei^-`ApLvt zx#BlJ9e`4ziTtsOqg1#!oyzgkV^iZsXW3;|#(XEc@|Y&+&k>Dk$zc1P<zc!f>?&WF z+cCV}U6231t;NZO9n?&V-v+;e_4om~LpMJ}*=1<Oud}d>ODu+#|9KZBQz!MD9f>+^ z@q0mK(O`J8Ma7+xnd{Q`&R0^mMz9OgI>nU5V$wuD@LFbE*nM!f3=Yf<j>Y66vj#0S z#G=UoTvsQHBbW<A!XPHI7hQT`c0z@D*R}A-m^528TKON%C^pkE?a71y?LcqS!)6?^ zpnu~<!%j5;cb6g}U1G+svc=M%$839KgzN@X@PHb|5vL9&cnq;7k>tI9<q(YlXY=iT z=RuY(>|+KV4V{vjrDB0y<ESUK>2FGyfA7eOo)!0f!Z-_2H{^y(P$6{dRnPrAPx+}# zGEfL6MN?eFVE3%CP=}Dqrj8vp>siTYo}sQ0>xA9>q-#_#i%QjD!NE@ChQ=mJ?=tOw z?o0cq?wq{xrbXeKBEEznABAIfJQl#{cd0Xy3pXfMc_;XqRw*R(>E;Ff*VRhUIgt`$ zH>lDGE3jEVKZGK)v~B));KHW!1lC!mH`JUd>XimH2hAO03~9NJ1_$_0NI-V0*o_fV zGKZV~e~pv>WvcAvV|fF(;zKWKaF{>*zw4*OQK^~6s!DJ}Bx5+Ya$B_~D(%?H!o~qs zY##pD%4yQ`hs2c|P{5Qk6~)RwX6~X-aLX{v;qM=KXWg40$}s+nzNuS)<#9r^%Mv3H zR#egT15aT2B?`txjSs#Gb#087D6TYU=l@Q&<y`#X!<#$O^^lO;{E}m~Wid!5_>SKP zbasaF8wH>N&s8gfo$M=I$Ld%L-pjOtN0@3tS?7O-Ndu*a?5}scWxT=ufZ`%nerDF` zCZ8vin{#{6PkVcHCoUmJ`cdqtXh3gI$SO8mGG@Vju|Rc8k(t?nf_(I5Ad@O}>$xTT z$0L%TAEQd@gOijR+B*sw6;Eao{}d*3?>@fr!>WQ|m`TaVUSziWnVmm*_jyCPNv*3B zQ~U0IUC^pZlT4#0t1s0qdT+;kBB?3if3pCM9B(5LuQtp+$o#5mo?s71iMg`!H-9;b z4M-q{V<<F)M_!C;+i!tmWAkdBfA}><9B#;m_cxi-ktV?H67R2xvghf;YJ$wV-Fq70 z=|%Qu(bosq|2n|K^7YDcl9s?dv=I}b??focU93jZ0+Gg-UGSAjH=Hj=wZq%@Qhgad zky4O5qcQf3W->%{y5aq{pUFl^thC2hPhpHfIueuhDVV}>2XG9dkb#{%XSWTrB2@#a zNl=v^UYS<WUB7L%RB{yDRfzgKA2`D}j+668Z~`R1C{ba{^Ml2e@2A6DlOK>y7d8`# zX-_Kc<*SG=MX5gH69iV8cgq$Z09>`&LyVflo2B2>uHKB$+N(wU$-s2lNh~^Mn*l~B zzMEOX?!F@-NT{zWu?}#pjr<$_Jv+Pd&$crCyo{+w_#3mkCD^Y%Ts3lN5&<SxM+lxV z`g$4;uT;fy976Zuq?t5{4L>FqHrvU;VMB_x+-Icn0Hn&a<4smeF7~Q-1jh@ME{)(z zwmNf<RQ>8~kz~}E70bfLVmtkS)0mA(QzsW=1_ju0E0#+?@Jd&r%MD|z1}#W2KZ1z2 zk;1$8jnTI9MZDgj@|?P|uxY;QCCvCE^t<poYZ~!@Xxis^R_w$_tW|AvS&pg<O)a0L z`ggWLvZw&M2N45FsJ+DoS8*opV0BDqplvpKLTP&P;CToi7-MXc?Z~w9iY)7F%)7@& zaGlH=xQe)pe2204$ZFMxs3!u5*6CipuhmFoJvCqGywMav6QTb%q@g7k>G!c|K2VcI ztXKmON(PRf11dd#aBfRVtD!ER;Kk=XhTXOJs>!7n3qy(u9MVnmiVpy(iWPFu9b9<r zq#m>G6o2))?d}Y3IHiHD8B8)eO&mrn(#lwjw3G3-#1!#*LN--NY$>>@MFsjMT!Q>I z@`XYHe}HGuh4q@1c#ArcXjr^Rv45mZDPoQ-^8Pg&k<DRS28rDtvhA*Sa5ji#<6b3R z;}xaHrj`~Ufr7+60x5>cIKphCh#g<URrZBqa`LZ`a}OY;S}Acw^3#QeX*jGgbv>Ny zMqGnrL-U1G><Rcv0Yf@;|Lybte;rFLZb*oLE_EzED`9ll+tn)j{RF#1M>+^Ul5vpD zW?M58Z)}BP0py>^iPB__Q8^-s+_Y;_pU8_Pw!ywQvBY{?CCE{aM7>h4yyiFw%VJNv z(J_i&yQ6%6dE|CJ@cUZv3d$=bBdza<Av(psMUKq4JC}4VlRTHYxvm}_hIR~xiK(k6 zBL6|Q6(V~j+b(f8kwS5blF_a#GE`Ni^Q@|B3QLLp1l7PXG#f9B_YFC%S-4C4U98^d zUEv9v<{X-3hCa-<T4NCOfT%A=7Gg=FW{w;=;4_lo!K)!hmKzLPSl>mj=yCl=kV%P3 zj2%7|{jyB&P<z$oOF{*%$PC2}66=ZlWR%PhMzkWL8@($K&R1Gd@%DV3mVJNRz|Pg8 z-yN`(Nfj;Z{Z{p%m9_n}LKorF>oKcH)TZ$FXl7P|$^J5g<q{F%mguGtr$B2bDm{Uz z0~N{*C`2{nVeqQj=k`sT8%~oqUb1R)K{O5X_dxPtpHq_IXtd|yx@1G2GioXcQFVo< zDr30uitBE;D<v4qd$$#g+0i8F>$D`g+i33Ob3wfp^3;-t-n-g#vU*}uWHZ-*XMK~- z2bda!MEUW)&s9drQl_p)f@~2oe)2`@YP7_tG~RjdfDAIHO>)gKlH|DFH2ndAyJ)wX zXkga7Aw`NBl6Z2dIrBA#qDa|<ObbcgI@43kqS>&x<{l}6HzJlCQC~$uo}RkC!5Ho$ zPe^?ViagCACpR!gB2e<79?cc*`ipQb?nB=hNF=978PFYXCv7tYU)Def!F^yC3|@6u z`U%)7w|hcJi<UlN+`m29jy~t5jIvOqgx$Df#TY$Pmae%@kKzUrPb_x*YDc6h@<aTV z906t}A<A+)q^^7*U!<;P+@IvmpDIksIU0m<^fuwk&Tg#uQFN$1*w<PsX`YVD6*W`4 zHYCHdvXDjAblFYrTotY5EbLcucJY<&E+?aJ=a@c9U{~xv8K7z=L)hg*+|;sf7T(U7 zFT2PIr_lJ|EROC*l~3xpabA6?8o~F-c&ZlvwPRf{QQzL+7{L?WIeFG&5vCMZ$aV6L z3hMLuuEzTa%gt!sQsv0hLxaZSV%mzi_R&RS|H>RddRz-tCU&od4p_uXZjO!i9u~Tr zK{1XV!_m7mhz;RFN-DGK&4M~}0b2=|XG(uUqQCqroKUSAW)FHS{0tHhaw^S$4A^1- zY7<E=lU6Q?j!d=sF!z1G02Plo(V3N*i4w%TMv5PqN+RoL3(=~oC84wuQvpO0xP6Ph z$~#}uWaj{`EwN!HkP>_gv)>>4-z6Vf_Ms>8){U`Y)_<T=|5PGsWwFfVk}iMA{VYV6 z7d~3!^(Kv2LQa87J|*86Pb<zxrQ_Ql`_VKX?b3g4{#<!qHkn%02U^IvZU)}!4Gp1w z`FtH7e!S_q5KGGupLk=zSsseDE9aPI?=gA5lE;arvR)-_asU8`uc$xGf&;mO%ngEm z$Iz4+K`u<eMa>$@IqD7j(Eo=mQs5VCixi+YeKnH~dQk2r_I+Atj%CglCl~5N=?YO1 zzR(0cfy?7JPl%>HCw~D`!!c{c+{CK@j=S&-Yb%UeJyIA68U<;N_Pa%${}p2q{Wg}Z zxd>i6p{C_$0XvuR&}^}ieYDMcly)l4or!AAy#Y{l*Jh)kNI+c_|JES!GL-?)x683R z?Cvb^vVTnEG44Vlkh>yq7n8EJmu2Xhk_pF*HjmEIxd1m&;N@gfXJ0<y?kGkX_P71% zR^VSo;V{?p!^7)Mbp|kgx2nUjAx_9SNAI<v2{OXml)fc(e7v?-E|q$K4@C{Fl9pW{ z2n@9NU`qWrEkd0MxBtK!sa+-h#}6nA8Dn1=j~*<|0<~zet&yJ3-WIr$Jmo?`5qz2> zI^%qf7`<zk&#ZZZh6;E)%6mJ$D%T85be_+iVQ<GFlD2J%-4+|WKf39$A;Pt57Wf0J zY1^dq$Y}a6qtrh^6x2B6+J?<IiAF}uH|{9!?UTihd;N_N)Sx4*F0YQBrl}n{?PaRr zeUUDHn8P9d%)^JmN69>5el0c5f9q`Sx@QQw9SnsLM8n`jckPNY4u77?maLO~UV7mH z#}i2z@}!789v6f>c{^on%*qG~=i>YF+w=IX-3E^P;+sLfuJ!i&R<Gi08sI(|Zc<J) zJ|I=)%$r<9n{cPNmWJ7rxM!vEpHv{s9r(2idn{}i>Q7#U;Xq$&AO|Ur61smCwE{SU z?ayUrOXc;w%Z8vs|J?nrE4NOdk5j>~Hbp3lWj@(~c-Y<jjkLk<r&-mx=yjY>By8J) zgq>@Vig>dqL$9$ywtC<`iDIFcWdY3C%tF(!g(oJ=$9FPn!jJ7f9e(Lk#X$1fmY!a* z6T49$dmms0Sav@~!~|FrTi>zF;x&)n)r@$+ZvNpAKJ5W?g{>I1(abx}%D4&j#y%5^ zFFFI(gQ}<+)NlBTyE|GwOBGcII_|?YtW_uYSE+3O5SK{tKJ#?AHB&u|=_yWxg<Ck; z>*aPw`eQi5fnOjAF8dsL`R_~uadiTaKqNtkaNSP{pgp4HzbD2A?>fWVzgCCHoq36> z26l!+_D?0nxIPf3;a9k1jD{YLp4Vek__!z7gLE&^aZu7=_b~i#a80NP2VQ}5{{1*v z?mJ{kDjwcHyM=@(nmOR(FqV;aNH(A7D?dy3bw5qzGG3&0giOr|>x3&7oYn+n;zw|% zc<HS8?o{cV7><HP9=)oBELB)o|K$s96b*~E5O64+EVqVv4bBJ0SddU)g@T!5UV%ea zf~f*-g-?t?Juao14MTGG&teIX*$o&<ToO4OL(T7AXGDIv^V2sNv&Z+0OtDf5S_nxe z#P;izn*(mYJpd!uXiWo$e?|BFd4rJ1wtK|+Mvo1-gs(US%e*K)#)nxef5U3DbS{Oe zT(vT7w$3`#aFuK^?l!;RTIUVPZ`}rQtAR;ZduQ^Xp~+Zf-{+fet{UQ;hluoXON3Y; zWw{N;EK_GHmQYOJzR?v}scM;PT1kkT0*?>?XE~2Un+Z8$7nW{;(*nFxp>`Pv=;R~> znDG@{fS7<sdaWEA?)oJEn@b$V*5ds$h~eE^i+Yba$mdc~ue81lm-B?F&XXx@dDmy( zbC0UDRU4xMa*05O5nhk2SpsZ9CrL=82ZBYy%|i+4%I`WXUp_T;gUJ1IlOKDE_m0V{ zG_pd@om)RN4|!Fn$GRJu8I2BKFF5oU)8nVF7u{r0k9_U(z<R!j`?U;)B;*~a%#y8! zCbM%1qZy4Hz!GiJ!eQGa0cT&lD|Gu?HrDzK)2~v7e(0zEq7zlnDTso9L(>M5;q$?# zU4ylpH9=KeqT_a8DFN|rZmvYbc+^4NIiemu#=iE)?{w|Ssg$-d1HJ%c_;^w#X_H1i zUTY5&EOBK>b436N;KrY!^Ycs7nGig_ujT7ec_m9X2>*zr16>BXAgf?puWl2~cX!`T z0-&pM3frU<aXo6mG2C(<$Ih?2io4Ostzg!CI>NR-vC;^I@m_GWL4J-jJppg5$!HmB zg;tIX(*9KNgiSaAk`^bjsm9H_YJ=_uVCv?XS6qpmXCA<-ek8s!i>4Cc^q^uR4#ZDM zA?8ZDF)3xpnKYHu%%iLo#<U#%CU3;+AuZW8=kLv854^J2^at<t6kn(5ym!^7iY^^# zZgYNFT(-WjlbkaR1(^hQhQ}~B6_Di42BD*TL`j_c{iH=<Bo<ZA^wI_B+{()%WMckp z>qybAJYx)69^<F(8hX`?88fCW@0}zuzO6%NpCdS!gX7}>`LPQnWDR=PTVd!!HU6+! z1WI*~F{@p0u2y@!cYZMq40vt}t1#;hxm{$1u7yB!E5c<=IB0|cX@ZMKai}zZwBffS z{E;vyL$?u>09?edH*HFrgu@P`dkCwfnE#B!fi<$BnQZmtpy-VXp!*8_pQMUq-YG!0 zBQ(~NARvZ`x5ktRARbi0c7!i)3<v0fC3H3LxTcS#X5zvOPwO>y(jAl6vJEC!*NkR; zy%>4&E(35|Co<oABq#Z%+`sf^&>By?)g3nDh#tX&d7)fA`ozwaH*KAba_#ii=WCzP zZGd1OJn+k4Gwk}QrG0n80uqS(o)Gury9587i(I#-m6{hJMSQF&7TS=Nz^OLgvX<$p zp$b$dcX(aX%I9MsLT9ZbO^P9Lq*2T_elpf0(<;gWAo4nv?jJd>np=TM!cE?Q<6r(# zZ?j2ffrRkquCyB6Aa1ib=`Da#RxQ$Ckz5hb5>~2nY>EVWtgi=Zo&37NTZ}VKyPHRj z{b^7#f1>r6sIvU=y&!k*Sj>MMgp3+sPaDZJ=QJ#@G0kxqS`v57IcUoO5_t2I<nja8 zxRh|nQ>ADNYn8l=&@b5TR|jVnct`RGk$X#oAcGv$`fkH8slZc#2y95-O^B4*@r5<| z`%LJMBx`$k9NOoXe|}CV8;$zfu9rU5ZQI-Nx$o~6jSD3Ab&PNp?Jyq@TFD<vvkvw9 zuVH?vI5yRkw)5{R`&10)sbw38F3ae3Y<L-eS%_c(a6KkW{p4^*!pn)fNr@HE=R%nv zK>B(vcgHy@wI-&>w;fMSwXo)HT_-G5rozUI4}Ot!eR>U>noDPjMIM`+SyYw)0dsk5 zl8OFB2Kk>r28Aw6w4_+N`oy3V9PE79MPLZEejKj$QO#9EKE42?GM;IouSQSHCPF%U zrkwm+>|h~>%kZWjC$gG2Z+?jR-UQMDYR~0N>S1*$zih0S=UrjwS<8nY_ju=3uk?s; z#is5<4Jm_$#{zcOw)Jg&$FM`mb76K`YlID4|GIj1uF6$*fo==35<jP&wuST@^AXV> z(5+E#YLRR1b<{_i?BM_@k7!i@{?}>Z6h=#qdI{}(BUEJM2rcMCsn=?Gb<L`wiNr(l z;U;OYm&^OccaovLzatLNXOh)$F_l6n^hP1Anc~Hn-005Hwcdy;NR=2=0N$2!ToY1& z^zG7pF@LolDx|qV-Tj7F(65bea1e)@vqVcVP4!M!-ZCBY!|Gz3=fkm;vP=a@I9syK zR;1|2&+^UHU4&71-)|_=^=|{Q=Tj0nq<*b!Qc_7Eex0|m<qub&8e;AxZqa*FOU9q; zb+1IR@hE=wF?v%}a&f{I5A_gNE!vBxW5+X(GE(_MlFE;2%2ScN;siGOk*v;asQhIz zloVg9Rzzg9eWfQTy;t7liI(6F_T_egnHLZc2CIgq%sG$!P2fWK0k_t$<PGp@fOoK& zS(6eI!R~b*)2nCbH~eMdbfvhtQAK)Vlr8-GzT%961+iPbg$&R_V@X=}_f6sSXfeJE zk)6EznqO&-SJ`8vwuhzWs$zeBKh{B_p4)hrR;&G{Bt#)SA%1RaQ;-K%KGz!ibM@mW zrQTLO)ULIxR}vhYN>fof8OVOdlmG-$6trk5198vClHuyXUYCQ%{v<0)$J4RgkNzr$ zD{IR-q>dHO5{)a<xpY6j6U>LyFhL54yF*!2Tc_;^*#<b$bKh}lkOEXn7m5;vpAL%Q z0SBmBulJV3zvf|mp<z6EVlq)YjGjcN;~$&;L`k}rvstnteI87<`#T+Fjlu=nNo{t5 z$39_$by#Ap7Lzm;*EyRkjyRjrA@MfVY-RQVjMPu)ye`^g1<p&Js3h*s8b`N%qY-c_ z%LwNaV<7*ol~rFC!`pg7#-)nrFGriEqM2FZ)P=yKg`~%t%ha7L3=aipR9Js;uMK8L zg4dZnNI>+&{*IGF`t{;#G~X$N7$o>*g|@=P<5+E_-dTS?W^Z+#;QLTINC&s$z%@DS z_Li9ios%fM?ThrxW{#0~0dUoXGz%8Pqr-u>=i0aCn`yVclo@jbyL(B7_ke@T!!<2m z6(hNVKLZQqKNqJ~BrusOvaPD&h-sa?`wz&hxg0(d0-p4|wn)*)4~c(tnf$c((}(N< zh~BW3bj`T|Ff)ppay&BqlZxVYfNSy|mvan{Mu9trLV_zd+T5Zea?Aa9Lk3}7?{CJk z-t;<N|0;Sby8gyOc;3Z+jj*i`bA882Wg8AAGgs(?yYJ=Ajb%OIJMqY$C+|L^JhTQz z3aKOE7@6qlZ(kd0b!~7|jAIVFJwaHSmMB#&gFJ-}sB{&esZ1IP3h2(#1AbvoH=<T{ zZK7|%Sq-+|W0y$s1Fz#%)q#k8E3NQ?%qmM|*(!~LV)X`{61K_!K$l|Bx)-QlH`*N$ zpju{3LIc{S!D;rya%JB${NLGGGZjKyfUk;Ww)Wcsr2VVmtEQj<OH;sJ+)+ROK0mX7 z9P!VuZ*;?88l+R;pT{~BZt(dnfs}Z~16#jRvBMv#rLw$gJX1!2B1%005r)%)g~<aZ z<U>4cqpvqpR#|cES6594a`h{OhFh&aeawFri;RrG;4{aSV6H!Ks$TY-I<M_k;a}Ze z5$qKpkCU9wHRfh8vdog>(%!}l>rL2sSP0_|xF?*}pA7iso0+i$CR)G=Mz$fT*h!mV z-F_n-On{(T@p{@5;#9al$-vlB`&&tAfkFB1&_jE@2K`W*5pIu&7n_XQ9pwtY`kW9j zjT=c^d3l{{)cJ&c3?TOvK`WZvZpPj-^bbGq{=vX|q7=nj-ehLHnL}#O;0qU;majA- z|2T1N<dDt%h253*9A3%wn|B4ljZnCPeDj&O7HZa9@!MHs*hZQ$Xy%b9a3?8d+|CZO z9XY=&FGC`RB9Ir5%_#U=&sX~?oGVw`{G^umGMP56x-8!0H5aPlhpm*aN{aWbb-<D4 zd9yW3W(S9S1fk%tm!DG9MlM}Qc)}wOzcq=~7s~XqAYh)#Kz25mH)+pVoR%3om~mK2 zC&dBYJ9lYIP+SWjB-N3P)8M&}rC;>lUMEXEF4b2EwwpZSth0;YQt!G-Gd>B~qH;9= za_P6n;q8VLug2lG{s?%MJ$LdpD}ASsm`R|c0UweyOF%E&LS{OD7v)X+aH2Iq1q@4| zJ1?e}V{bq;gWPukroh09B7SIGrUo25EYmqJE^D0|q$qEXOp4*Ut|g4wfQe>ayn00l z*B^^1+>6WDt%#CyV10U)VP?-F>XHqS!v~m+mY)eCj00TPAp$C}vrqJ&Maxh>T|Piu z5pJCU7QmDMe9BOEy>N6naGSDSX6{e~^K(|>me`I5?~0V!c2W(b8|ao94TNcDwFD|% z<w}TH{C#>uKx3pncm`+Y3gpB1#(+GRmh<L{f<U=Sc}&>g^86gMFqul!%!E%l3-nWl zlHZZAqMekfp`8~V*#u>@#5X)b_%eT1scF@A*(im1?#z~a6kuIAa$#0wKP~k|Gatz` zsn)aA({Qu@J1&?+;Wee<-%;VJGWOw^@5q$0?-xhS)ygxjN6b^}JHtJ2?ClK)wyV65 zSy0l>F{Y8@>Li2q;>dI4{Z2*%89G-du4C{u95@!nvgFMQtiU^jn2m4!qSif;+7CYM zs$Ph0`Sh>2tk*l&huEb}8tC;OXx+^`Qu}e?Xg7p}lxuo3`;(<MJY%=7UxK-=V5%i( zsa}X7*Lefel}{<S@@Gd#k-4#80)jeaUJ1+KQD&bydDW@81<@i!g6pnLzyHd-F0Yv- zNWe05?CVOp<@TGUI90OgoNti*M`Ab765)W1ns~Ol-r3GJ8!R~Sz})+%SyZK#Cf3kR zF9RtkZEknhaFp07%TpXZpte`Wl#(<nPbIC&BaKKK3AyOtpbQmmap;7uF4h!H>!*>r z&4#CKLiO~n08tL=eggv6VCyo5;Z~gTX2*9n5ZiJwFrZzfMqPfXtgm9BF5nd>XG)@h z$(=+(eUdo^V)Pd*Uqr=99gm#~js4%EVc(#S$HT(|rs5Np4AAGqMSQ5ly>y;GPK(1l z=(<nHzSc})QzI|k)aZx^7`FaZJCo|cLGgqC#2)%hVrkSmThn5=zFC7`gJJ0vPGN^+ z*x5zIoXekKo9baQp3zc)Xt&pAj1DtSP$R$68vJf>h|f;ohwWgT&Z4ZJ$?is_q`n30 zS1jM5iic^hIAp&Byc5HvSm?u3699L3Wz?Z$p<&yYlmbx<HfCXAHH{+UhQZ;pkIH~g zG#gF8^a~vPT3C>F91x2O4T*7Q5!$8FP_A0h@9^7KoloG$DI+eKTFnviN7@UG1U{_Z z+V7XDAk{y_(ZN;=gZua9KfEK_Tvh^p23kEjD8TU37G}v1Ji4kC(WT5mB~}d7j$aSX z2<P5Mk$K@OjtUut6!aQ{@@Z^(YY_!Co40GtK{S94d9&N)E+YriP?Nu_#oVFR#~F*T zeH2$+BQ(f)j>iF%XCPkmyocpoASAKAoZR*2&^D<vVTQL&d(QGNCc5(6F@<nW0Sbx> z)WK6b=uQmv=6Tv}K>?Amgr&O(t-m~tUO2~D(x`u&$ANfZMy_(jzN_BwJ?oIj<qXzv zgFCKCMW;6!a?~Nu%u^O}7Jto2a3w6MNsnw+yJ0UYiS$R^3yvzGD3FM8FcUE$H{Ncl zSW$D>iQJKX?cA^GB%61$dy0#Kvpazz=lhe5n0ZW^QmcyXP$xYYc2~p*4a_B&sWuwE z>e+?9m^%B>lu+lyUL~KjssMFgYk+>2Q3HG}*An26TtDZ_tTA*N1AU}RB{ozeOJY7z z40&4Gg-SE3ro6X*NWX}z@-BP~$fD&m%>rzd5C>d`27$%^?;MaoV+<4k(yS=BYCtG^ zGjjP?*rfT7O3?bsg|6e`>gbRSmy1?wHKfiFR<NmtQe48JX=IO1%-Ue0M72dt*&Dx~ z?^6Ej9o5P*#AlHSjc2g#JQMLUqhU$y_5^>&pB!kaIb!Ql?ib|{FF-F~g-|#scOOA3 z8YYrS?DMDU<P?IuyfwHdX*k#2*yN9WYx;C^zv}`mGHS|(3?OPgUF#Ai$9qf=fydOB z-qpf5hP2Ej<xirYveryeTWJwRHJEZy1Y8^&>J@+P!zg*y+f;zD2hlQQY5Ad$q(H)B zO5oeF?8oi%{KUO`-%q|2A0T}P)xVtW^btY7Kd%;|5Yz0h415rDBnnir+}dkI_<<eT zw0##K72<HY`5l4;2sBxFXP=_s3J6xZ7xf-hdC1fm{?85dD|~}4U=ZeffXrm@tZ5lM zqrLoCK)oXYT>Z&`zrz6etbW>EYeoYP3}K$W+Jl<yn;69-<?Y{sV?|dbN%`1<<PkdE z12%3P@!kd^ftE1Q{H_fBQjg-3RBFg+Kl~uN$0({TgH5fI`|f1fpF<7l#6E<+1yi(> z7e6+FwoWh=WY1a7LSQLFrPbN&$`Os%=&l1w+pjUd1~FJVsOG$Q7<4<7m{~P#;z@Q+ z2+Oq1=CwNhn+15wL{;pQazaKGoBd?QU(umV#7~16Rz3nZ1N7xY0i>(S%9w&Pr?how zuRsfbd*osDw`FuVWpp{o(N$A{(3Un|4WvASJlM6&2XaZm3}pM4<K+Kj);xa0)CLch z!$uPR=jYa(7Zt}Kug76Sz|<_u0+BB)9Y04QzZ|213tkz#UJ?zL`7mCCvESJ2@|Loo zCW*1$B&a<-W(7U~5yha1;*B#kqk&U?W9I|~@f0Uz3oaqh>t4d?GBZQRVz<{dWhf zVFZxT2h;~WD<@h;QD3G8oR=6!ueELcV83#RmWHLVeTIc>!=fTrHT@8gBVMO4t4^~X zRW!oG%>8r~06z3KW}#x13aHaa2eH_#8%VCm4@>uajz({}uAKgYcT!>}jK0tEko=ju zje+nhFuxw@J=u5z-uv-^TW`F7BSPMHCHXEfemCy60u&Vg-1WyUTyzSbPUUkk`5S<; z0#B3mhX1lVi6GdZ(er6KlGIMGwgj~U^SmDX4;#k%a$=l1Ebrqub`h~E-<%^_DAQJB z*#o+pjk2MxM4&O|3J6s&-xZQ#tPl%UjBdJSL&!q=ZM33oN`k#OQ9D8vd@D&UOKUKX zp0%z6&PV=(qeuA2ytO=Nvxq(4sLTO_AXS6^JA9VzhHRN9JM8+FaQ2vbyJXB2ul@9t zcJUSbZo8x%o5-Lo;(-68x&Q~3l_9#>LrMEY#4(G20_+9Dg3{h}ADGXC@MO<V4Hhwl z^P--ILaZgf$T*W}D!hq`g_s?EbT*oK(F^Gd)b^^L?+JqS;?A2$9+L-KzY|OP<ZF_^ zI5zBLFuKQ6J=P($3X>kPbSL*RZlQB|uluYtc~}<^a<Q%}fe&?0n~m1co#UGOG($LG zkmXV$<nLuQb6f<30eKmb#2uAR7q91Q2U$cI^V>lH3HlRHsz&Hd(+?lMbJNyQ@J(z! z%n8^DQxm>)YKw?e$y3+C0UE$HV{YHyOV18}d8dH@pquG0g^3HN*PfNSfNmH)#+nb) zBTGW+{FDJ)G$wJhQn3U1y~j&G6FsHLgnD_X-x`dn2ULw$>)VuD`y>scYZ1B?tkVi6 zoEc~rYe@nPPPj8$8LzYKmI!ua72nbj-UO?meqZ72C2c{>%9A)Jj{VY9($%D7s{3Lb z6okWD96+v-gEcZaXjvMq>m=YbqN*BL4~-`2@--InBs=PR5QHUPf0>WkZiD4gYlqEf z8Pf#>)=0V5;AX^IDBJL}8j*t(<m%Xz)-RYjv|mfMum|}PeSX%9g0=(`Vkbr~B$1^v z&*H`28L<Wia@Al!O=KR(K}(hC<e8$`pY=>RG9K%RxU^-~;F*Y4pe4M3xMEr80iksq zEbsFD{Rt+l9rE#oXa-0OfU$0&%D?h-C(&;p+BoG2rQY=ZG(7i7|8~K$t^piv`j|i; zJg*5-H2jtjz_C+5KSjXh)@%5&!rkeHh>k_M!GcSIQFnCwps91f;qhm6GLyrU(M#0R zg=2=BCP!KQ-UypJNENB?;9wOmVnQNW(fyMH9ecXUJBq`>W23m4xLD58(;lZ5Eg*9F zM<}fiC4gUEo0?kZ3#%6BAeoHSY_-xJsWc^pvf*lA<BCWhk!i>fkCUu^AZv<gXEd6V z$TpDTa~tEAihh*AW7A2qE~l&yUBlfQz-t|P1o%)X)KW(l3H!o*#GZVgG!QAx1c2r^ zSG2{}eikJAOmOl#w5YcY2?5cV+8vXdCH+6GxY$Is!RMyI>0xf_EVd5sDxn66wXq)W zE*go6X210n^{qV;CFc`}Xw@tCe8u-HEDEEEWTp$J%s&nqiBEhGdyp&v1_jd&*EHH; zFiNbz<0PJ~2f=I%RJT7CT;J@xum`dgG@kCbr){-)jJ)|vAS9~024BiAzWTBZ&VXRI zE}iW3PFgY08E!>bVq{+w+Hk*70!zYRxs}qttFQexe$aciFfl{~rfnZx*o%mH$^bK@ z<45f|kP0e0PSN_}e;Udi6Zha5<qn~6T=_@m0Aj&>n?MmX*W>gsX(S}=app%azMxNh zR>NXM>q>@+_K3W53iA#}81WS}m8S@iI*;?GY{iWHm*9VN*1z?J4Svc_1?;s=srQs3 ziNMMjBzN=k+NdsX-Ol#f`oxQ=51W%PBnMeZybaLH!;+*V$Uoz}itv2hlOUnD#;1sN z$VwqGm%Az6WVO@-zjEkZMl9I?yJ9vOscNntP1y(i*BUI<VEE8Qvbu+CxBjcZizgo} zJO6ehmZ+%?!?G)C8!Rh+8jE_PA0V>ZifHO=By}VC;PzN`Suapyj7mLx)+qANS?`e8 zupLzZDTc;x%0D-2h=8JL3XKN*FrpoMK!7~haGeJGKz;pi(de)#nK(A90xuE6pTEtd zFcc%w#-gyLYYb-lA93NVpg26wOk@MGKW)uptPMg=&Mm}qnV#4slilphhRzufzE2&+ zv~c|85K~QE;A*PUKg&sd8r)8V>|(5$KxWm!KIRbksm7PTJEoAun0v+1wjl{{a|krH z4@y&rJOU@E8nFv_8&358yBl)4&x){OKY%2L9B@Dw)Us>fu$bA$(m0g;?vNw$&<s|c zNgcd=aZ;}mWKIDy6Y|x~E>6yF_E83mZU7rUYxHT-jiyqCvL0>9(pG*zy4F*-fW4RC zOj0u$sC!sHK$q?P9Z7(-9n^3F>|UOdZ|zx~3CqkW=GxLS7Bq~>-~(`Z01cM8*PDyQ zcn7K+C!tdtS%49@;^!bv9@f(%grNNPnZE$kP!yF7k%m5tD1`4k4RsG@Lg_0}y>-+q z-oH{96x$Qjma&C?=|%Sn>ujW0P?=Y;MOW4e8jMJ}WAiFh%Z2g)+N9v$poR9!U6Epk zT?}6J{*^b*fP`F*1>Un%fB@f$ejh4&(>IuO-9ot=P8c>W!S^=pbZ4j~&)$(0I;~zF zGO*qSGnm&i46)hj#XrsQ<XCU*ZxcFyZv%tAnc&gpToI0iX@-vo3OH5)<o`?wb7cO` z&4|yoS2xiaJc>XK44agKPDVjAzPTONlcyvue$iOd_m~5=@OSuTHkpTdy)l-+>!Bd% zMg3D?O1YMiWg)&L)+q1*DaL&N(Zod|*1#hw4$fmzzxg`{QLS%iCjFAB=qM_}V4Zc) z--^tq&V0(VFgOHch-?aD3Q)VereeO&=TST`?l!ISKLnJo@Jqh{Ge8OGs?u@VZ|w;| z{dkD=Hdv&JJ6XkWM%m)ez@3XE=b&9^36xez0HUY7ycpr-H?L!3DmKU)(LO3g3HR1F z9(P|Y<+p~vRiM4xmVE=8u-_eeakZNE9p`ODKlr3Y391v;NNFO#)Iqsj=QE)nWoFYC z!R#M*pi%I&r<d-g*U(0E=)yN@)~v402X?3mkw?QE8JAPb&?(3+7Lud!f_xCQ4^OF5 zMxr}J1dm-VV1g704E{WFA_J$10k!2KLnE!|E{C;|1|Q}IqS8!GI8;@+03D2cUFHXR zk2aUhVEb7z-4hb~&0-YDAdvKe5VUlcL-{{P&;OWCU5$xc=XcwGMt@w6GG?<c)prAS zRCAjKSR-a$tOGB*-LNvlRbZ5DdZGfy&sw&d7&tStTAQAOcxSp=o28BZ0~Pf;XK{dF zt+v&RbpGm5kye1^l!BU0zTNrVbn5=5-&5=)gOhV7dCLP|Q#as}&q&t^Bd&VAzMAW< z3QJXdeWAN5>Gxk;q$64(?(6lduDp&wZu(1G(eD9`>|BAXV8_)QX7d}@qGfoQaF#Tn zJNZvV$*9OPn8B5lK0hif?5$PrfO)vTjBwXA_ktSeXt-i%u=?r|dksFBN=zBU^==)G zt)9wAZTsVw@>3`M(oP;kXZc^6dl*!jHS;fqpg`JoXK3S76fM8Y5(F%tki%@HZG*D{ z-^WJMjEwrM#j@L)zKzqocUf&mv$}j2%KLnDF)QB2AQ5`WaHL<GHou&$$rkCP*wxS$ z^o_)`ym!|Dg#rrywdX+KCRD+xc4f*^a}x6)_orE2Y=T3H7uFxI+kTIB`4Imj!j(Pz z?RAQKyujaR3B_4=*VHaY5IOiEaqvzq$wLtViYL<pvt;^erTAg%++LW`wD`hAq{q|) zdjasvwoI@sbbHq(oXwyAO$R@OSmjx0Gi$J3YM(ZLZm7MlV6)|x7{95{WozYW^eAc9 zq8L+*LrqmW?Y?0~wfX7d=gqcSr<2#(16EKou0gKyxdRrB_$$YX8xUlj#4$kKhJEc7 zs`x(V8wkl1vBDslpA8vj&w<G1?e${^52O^jdCD1lFhj?R#k#c<G9&)%(k#J?3!6y& z0yjgTOlxVzVAO-Rdk8S(E<lG#)m!$f7jDkdTSP#_$Uf?_CL?xkEQNsovIWAm!xHfW zFzQ84kS2h7r@e~GI{5R?!c;hzR;&bdcjTEOqB*xfW;R?aZ$k#{)AJ|U>dsQG-EqQ` zU;~(rOp^<?&B~8hs=cWJzWf(UdyZ~7DJA1lP}(0=_@&oDrFxj9)@Q8wpVC+9Q%bZ6 zO1-&%{qB>{wW>V$61M%;u@nGUUui07-=AEFz`^o#Inj65^$NZXWKl`%<N+zX4dMUI zXFb%*gc4xH_@twYx2FVekX+k3riYjvQ=)dt7RT+8-0Asoh%8f!v1(++GqfNCuk|AP ztWE64aBU&dzT$>v<H`I6#t17*b#mQ_9KN9bTUHgtZDMe&D*|{@8R{;bjH9i-#5ub7 z?Z`CpsSb@xWq%zOqr&xAQSuq47HiB|-kyfTbt$0q145)3y8)rGhYOa#lW>G9Q{6Gh zs*u1^%~+E1e@Y2q4r-xCo1ICImvJz(qbhA4AJBaUz=WmFaYhA8hP;2`?)wm_H>583 zsaR4Bk=y1Jo4=@G0kJ0j?;<vWP^8H>T(m68?#w4I`AqMiKfDcH4AbwAgD^PNzTn__ z$40Egg=BcjrHYOUIC7;BkXWLekWWi4PB#TMu_S2AMBXwzkd-8YJgnXs$*j5K{WQ-` zEC><m7XPBBj(2ZA)+jym?x*6f%+uMG^fc3&Yj{f|Go;kTawWuS52>Z5;exh8M|ekW zc~qkiDd<ikGT3e~Jx25Q#Q9WUhe1xO*z3MAWaa+k?_KLP(KF5h%BY`extrIJ#PVk6 z171$K<A1zz|JhEpWC}Ob`I3mBM;>lWU#ibVFEph5r505a-Sv3sa?&Zta%E}2?g7LK zoTg;WKdx|zH+ELnZ&CBMCmCg6NvW`&l5~Dlv|-m;IVDjg__aHALAg@*;`{x4iJmK4 zny(5g;6pvqAmM&^{{52b4MmEkBSxU(tGhwO<I$(??j-iw%XT?~_X5E4g2i*gR9G%u z{7KZ{q|eZliUfFlD%w<7YqA>E&2P(^=_b!HOq02W@Macs`v7bE!DZcV%qgs3zaPm= zVOQjllG5+?ybcxFnQ2k3DAX)~7kiY;HQ#(o$_?51%;CGe?(>Ep*``S7tQ0&9IL`Nc zZ3z4*B#YCVWPfB>PIC_a_?@#XfdQM6+1wYEw58ZsvnF`a!}=<@Mr+=3iPnuWr}>4} zVa2$puZEia2fHim7LMRcSGrz#YR(w%9WmaG#VzJ}Im(np_T3s6Pdrby-OGNISE8y7 zG{2P-T5$y5-5*bTw9-_1VYu<c&QR;ujGQ%gT$_CEk%nKMKIxyUYdtlq^wj^OcUqU< zv9r^T_>43dfxk5%%2eo+EG_73RTf%;98D_^;t;<w%|rmgg)f#Ti1j5gG;V=<Sk{cA zI9g+%R2b+q@k8!bHb&vnxJblQ$e<emHkq)dc72)IW9$0D!_1k;k(=?lF*^Q8V-$qp z()UUGk%oE8Ev#Bf`#SQMjm6}BkU#%tzarjXcFU$}1e!JBWrJ(woaR#s_TH;g7YpsL zGjvQ-QLVVR;$28j8snB?5(HwZlD3>!(bO$qV*J(k5{jk6L*UaMPOjg5kQ~S86I@&c zyiRvwP26}g^jPAl>QO>89q7*duo|ZvT9uK^4^s5o`Dq1jRQNIep45!1lOmfp3&C&} z02pNI1KjqE$F&KUr#`g!RNedgvsz7I0qF9kIF^%GJ%lEdbow(gu&?XdhsG?=b>w`v zDLYg1Lxc{bNw-#xHb3c8_Q8kRG(dCGUiL+kE3J)wWDFawDbeA<*7zp1H&ytp`!=ZC zO$^F={Fmi^$EG4OS%@mn&gFzra8kS9;Zc^0{I^ufX9Yu%RLF=*RE?b~P}(jGn?W<V zO<2b4KJ)x5k+@)y8-)VbRB6`*E>LX5^N}e}2>J2T@&+B36jWzud#$9<lGbUbC?|^< zTe;e>`mf#`m8Y5U4Wp5K2|?pD=b;4$AOTl-w`p`5vo^W+&a0D5V=1%?weHxoolUds zqZRi7uBKHwSVJ7N(qD@C&%3n&><4|`;7LX5bwy`Xcn?19c_9e~>i&7GX@X)+C4*Dv zD&|>=yMDDn&0IiDLzT!Q1^+S$VraaP;8D5b><DRKxwMA4*R-o(uj1uqxXcC+4b)8N ze|I92c<_Y7AV=3uuDD^KArNE4Lz<lhY1CXeu#1Z32UBQ&Lmufc=dzY6bu*J@jOp{5 zbBX>6DZVZ|@2b$0?Hlq(VU&Ndiu~p>S!mKER7(|>P&LCz1GCTZC=57pf22+P+@V=( zu&W&+J2#=Pk`6<<_t-QM(|R-9-mHd8w;J{D-Cxkw>mE8-emHowk=-3G!{NvDdVe;s zL5y;%r!*-D(2b)P0=pw{cA3FbB6Ne<50_eO%%Sb|o(CKA$9%=6O2C&2V$2K)wH~rd z*&!duAoM1iA&fHSe-~qnY>=`gLj0ixONr+qzBlV%xByol=v~ivPpx<-BQv_JoGedp zob;JLlq|KPR5P?M|Mv8JDyFjvE!jh>+;-AS@z)=^?j82xU+!RTxSx@NBdn48drHv! zc}n3AKP*jzu<fVqIl2K2w)c+nsB_RCQ{f}f*I)$qI>#`aG@gjJQn{gR_nikYRp%mK zp{e^+5!UDl%e@oGCm<IaqvFi-wf6Pg3?m>&(=f;0%+2h+gYE5cmwR^J?_pt~(fm04 z!?TzKB-H@qU}Dl)2wgFQ7@W~1tll=yL05k(KQxRA3n6Wo!dw4fjUp8TbNz^<Py-ZT z104?Awa{I?V|j}P1Mz>GqGJ$T%$IHk+&s`g&*al{aXlY!??;=W-?VR`V+^TxC+oc; zSuUA5pRSsckopcely=khg4{c{Qs5L201=uTTy{b7-`m;LPBhHdP9Ee!=`MWF&+~u} zi_f=*HBVJj(4EiaSW5ugEB<{OFd;F#ZAt0}!p94+2sR}v*^7~9-h+pVpR5xg6TIQn zdMV+$#!k;ta}O6T9`41{Q)jNIus9*Mrx`ErDZCqCGILKnv4CpDhO?I}Wh0T)Et`$6 zdgRY6Xz*Q%!}VhFW;$)j$;ldf(+Ih*CI{Y4*!^y=l}x*E0j2FTDJgD18^gZJm!r=? ze>Xy6)2P4x_TQVAoniK2EBamk%?;bgpK-VJ#+N@;anEdh7gMaZr2JX0jc_xoTN+IS zJNF%4WKCYYZH;$X0;-ebQ}cdqo6A751MT3w!R5sONyyIZe5%BAA}rCt77uIs%>1fK z{E<e~|0Q)zc!)9hc?udm#G#Vyg^LMQv4D@GAs=)}v3YmXKje!{Z%r|Kzycq-J&ra_ zg7;L(4~M*i4)U2Bq({gGgeE<V67KUM;i$6A!2voJdqW9sl>_{ZcqE7(fc$fM69T_S zjz?v+DN8jbyFaDl%ijuMeNiZ$tPc_g_+o>WIDV!tufS~~xdTgf9%R)B1S!B{{VviR zzdnOVP`<67rDGyw(c1Hri+L&EaWXy5-pMpO7b!s+kr-5-pSAzCw(H`EE-$pT6<O65 zSv?n*Un^=7q%nr*i(dO=Z}G$=o~9lSeEx#y^cu_MtTi&;huxTj_uwDSUJ+w4=j~yp z;-)Mpx?xHIc6iKTcV|!?`>^cn>r_=H*T(K&5dvP5dlPdIV0W8c9~5IFlQotO<N4+Z zvMRos2JYFWRPKlh^)Ju}vD0X=l*T3;naa*(6rnQ4)S-a0FiKaBm->_=Gp3)I(MWwY z$}9H3r`?eM!`NF!wZV7WzQLhbk>b)qixvXKodSgxcMI+mcZVQFiWhe)?oeD3oTA0u z-CYWV+&uf<bH+LEe#W@_BaFc(Mppi7uHT$9Wx{YZAb<JG&T`%~dZE8sVP{?G-SbxK z%Z2}->W~oNT{Ak`C6}p;3?v<2w3q4I0RlSA4Ty{pt915CVkZPtbOcDYUlawBg{qTT zU*_TrSjbyS@Z;Tv$0B8jRQ($8i0E2>x^@u$sSstXK+RGxmMYK7(>3VyW*>-dlk^qw ztgR2n2-pR0YVf*bVoswBTh%M2B|gP~l{jtnA}o~kac8A{fvP5>9OYJ26xUigzj%i$ zQzZYsC;j+%sF|8rl2l5F;cVtVBko#-?pk{x#1i5-wygbD2E<WTN&Isy^jznd01rTR z3z@$Hz1{9tgm~r!%Awn|I++oNoNM9&n%3=PYK7c(6mPm%+}xvu(62p$1y=-aCuGi0 z*}ODFk4_%9J0UPeAwh2~ZMwmK`wsb!*Co_V6Z)nJyTiJ8flCN}l^2iV5N#OrXl}S~ zN+EJTiMP|hMD`pWf8a&}$2M=;+ED}e-%|7QI!(}*t2UxZTXwmToCf6bp9485l$YB- z@`MxYkbZTne^)inb?U9Qgp7h`7DP;~t`KLB8P@5fMbH0@H>01gw9~gbnu@=OHp)8* z^-xxr>~|1o3E8yjAZi|Y?dP*qyUBIa-h91~OqfT9!5CiX0Zq~jpHG?orz0yUNi*hU z!0^N7AHF$0Om;=-^tRhGA?L$_QeP*mW|`nOU6i~S*PJH;XrX~q;J~T1)n*B!_5QYp zvaj417fF6H{W+90e}4}bf6a4UUqO572~bw<LriLU*#4f_ZIDUaZ#4N1!sVILx*D$$ z{wmTUC@U11Z@TCY3ItDI%;|Y@@Srx!2S1ud#EGQ;C$$KYJp#;P1-tU6;_=}_AL<Tx z{;qjY(}=j<7l)Cx>rohw7ZqwhFcvgkdoP`VZiI004e%iT4+o@o?Hmu%o%LeJs8Wl? zLU=|lp)c)6!kN27oBXUy1Bmp0lTi7Tjf8L&94yPYhULe0vx%(UK5Fs#(~dr#M+wJm zsIAN>&AV9U_|r9Xmt@)=az;cro*v)PYR^dV-%(X&-yctQPMMCM32}Sh_j-0Qdu&af z6f7w(A@8Z4a`!vER@7=Bbn^BYpwd~{S9@6C?{rz~f`utTe+fioZZ`yTUfdp3;3pgo ze)h#wyd1U1e(Dz*hgv)_*#<6Qb~A#EZpFun{2<^r?wpW+R`DCZSlmYL2Bb^37Uwbj z_J^kDCoy5TN=fqC7n`Ab(VBC3-OVNBc{OF_sW9L+%&_DBKqoyI6Nk{}$=HN${B<uY zlgJkW<2OpGW<z|N<Qfr{O0%helwUluYzUZ#Ly^-~KtRI@1>w#eTO_LyxtRXvvrSO> zLT{RO<8Ju-LNOWoSOY(7SdI6aP*|hefnkhT7}mM%^_lIr4^%eC0o6&5I}ao1LyIp< z?XE!Olz$9`{)}<t)u`ZXV3Ey>nqvzA0msGqTbOo?nU(q)X<7`JT0zBCQuSc!9TIG1 z($g+<%h>!Ifs|^+&?YwpOPI+bYaz^eF*wOFBvG=}%AIFCt^Yf|OY0*=X|$forB%0w zZ8-7VglJ?<uS^1^{hKzT6P7gfMhbT$b)r^>8{tds(cVHU7TY3GN;AG8owb{AY2vDw zkQrc&Qr?smgA2~X*CqoYRNB3wfP(rb^$DGWksCd0T$pr=z^ezoBjT5A1(ybI96vtQ zy&@DO6B8{;bWzCw1V7LCU_2@%VWX2pVy_?D$=bbpT<ffk_F4F7#-8zSk4mle&0;Yj zzw5iJLM~62?(4Hp4Q7jWY)k>NJ1<zGgMVP4CZH=@C|gfKd|zy_NUcMd-qO6f1aNRl z{1QW^oW)|b(MsdgcQvYf)i<+FN7$#)U&BMv%OEM2<~eT>l<$;J`N`rzE7r)myrx2> zT~>3#XeFjViJ>3<Bs%ogbjvW|O8B~(eR{fgn);I#<hW$|g^X>J&CsVZS=RgJA~p-+ zEGr<JRgqySCrXrvTZ&?gcojZr$VcAEbg`<q_;4}gJ6vv9q*$g2LcIP1x!#*xCB`7r zo`SHgy4sXEhCKjQA@`ulu?j5zG!ed{Rc3u^t<v%7_)?63bES}H^9Xa`f1^78b4cQ< z=OP1^zP)U_@1Gw_!Hc32=0vBTl2__Yd4Q(X#T<pDKE23j9$P>1*lQH6tN7TC>yWF6 zo5@peIjw^cqhi?wi~VhPB8V-{$(x_KaC`nEZxlAE!w2E=csicu>Z!3r{g{sBB7T(i z`V&S&Zt!F$$SCM~<2G*;W%45*B$!0o#0*;)Q9kHn09wC93_f1Wy%y-~mtU=2^)dg8 z1vtt_Buy!a*1I4YAR;d0{G%f8ru+JG9x9U%GNvY-NKpq-j{fr9ZQ9-)4TXU7<+6G$ zj-?R_N{{;wBO|e`7BAnko+BWU?SWi?&(sjZ=6;pjIIli~kUwHrS>9PO`FUYFd>!tg zS`*?1zG3RldpN`Ydr$Z<1;2xTNs25?ZcIHsWKfem@%_9{?IxludH8U0x6+8I+~eir zve~^8@3D?9(7Lr=J6KrnXB|RML9f|L-96y5oQGlW@Ku4VefjTDyu_aPe69LaJ&r+< z3p0PtC%rYbJ2nU3^B;3OfNl}ZA=G%kQ&p464?1&KzY5;pP*9l%+zlV4m(0=e-zF7s zQZ1FACl(1!k9!*d_31uoHSv5xY~6RbkY`?D=Q~;vBz&`(miPPnJp3LuLupZtr-;qI z4{hP)THaNo)hedc{AOUi4>74@DdH?|^h*~}mwTHQu6DTQgW=$nV9M?XKQEVwq!w>T znM^?gCISld#PlWXYJI`9wmQ4`EA@4yqt1-%dgNYb%dzg!&)W@CQdR|NR=^v%$gSd@ zM5UMhg7cF{_K>^AB3|+AJHjl!?(8W`_^qL^$Ksh<&HZOfk#SHq-t#D*y`15F-xS=_ zXJeB8IKP1Wd+LvH^6#7v!(7A>dE1VDPzLBWprYU%qN9iEJ8n!T7WzEGlJYd{X7QYW zWTe=)0R^Aw9=Y9V?)oFjd`gvosmz(&P9$%*a*?b*{H*%Edi<pv08V2>{m0JIn|5M^ z_dxo^0tI|D38~M66j|xzsc9v69@@St$IXfU;pUs|qMH#UVe6Fo+<+o5?p^PnV6AY9 zgEGfZDhD5vequNj1Wobl+Ua2O?N|T)UhwJ)Yl_zX^Ul|edjNRKUSKO(80h-_Tg>e1 z6Abd=RE0c;gAZKaE|JcNt{pU}mR^2Ii686=d3)Jp>bzp>Q_}j^@fTBF6&vrEyTJo# z+SRu*=C!iu;pk?)3O!7ECcE*-j*q?v;2u+&`SmucXcz7~iJc0K)KS6=_0HYz0xncd zB?qqBfIIBX6iYE5uJp4});$&{$TrMJr-i>WxBJV^Cc=eAm7Cij3u`=lUhQ;+&y{5` z<^0QoGF2|{>3aU42NG~mpQ0g%3KQCCgx(`+ukE~cP+(b_3(zmGR(_E$T>Jq#nn>}| z;Pj(95CWtx5MMtbGCkv%u$_48L_3pvYdXfVK&u8*?H9(n+K{*s-wIWe**iv07-3S( zgge{aFmd^4UHaCd8q)*~Tx%6@aK1n&y}`pHCI0QXAwerztYy>*RDKdbFrofIux8R3 z6Qw7U=FP6Jx)-B&Q)ukd04EXZ2f|Ckpm#-sf-?TqC;+mF)H-Q<ao>9FQ~4e!zc`fz z*s0=T{g;-N#uTd>Ekb|5gN^{26xuV=nb6Nl%Pp-_ec`mRx0M0h_MQKe-m!IQW@TDH zqa3|tOV2s)e+h`t(-aQgkTu&fwp-q7>mp#L1z%y4XzNpL+Y)+8_x7hoP%d~!(1+VS z>suI?2g%@xdiX(;ilup@s3238TY?ZX-Di&&oU;$8%z~JTdCeJhrHP;yPJBu0#I0Th zZLkO)L<C=gkkv-ts0p?nwp$af9Sw1b&qg<Uda5^dbp0a9JqJSJgUA!6vSW_e;Wy#> zbyPc5y}W#jiqn4fXK;gPuV@&tRd4&vEq>gmKjy|lS2Wl6Ku5K1`MjIpS6Z2&>1XGa zk-E-vTv(pxS|RR~DLhh({7KjFyQo*{R5h}zIT`;)(UBbZ*>m}+9xn`-1ItVAL>^Fy zQ$%W|84HUarB{};M0eCGt+8`^be|V~_P%cGCoo(HxSvmR4h2{{2TzZHdi#aE<inZ9 zY(Z0<ex@!<$Y-7>#ClzKv=a<DQsdnuo~7L^04bLi^FQ^4n~gl@9kxMLjPe&*PIN5z zRIFVjWVi>%g)-y<Lq(Wny}qQ*iKBk-z$FS=Ti#gG6`AT|F=r~riqnGZeLNn$2f9{~ zh@OCy^I=+uzaSXHStgcq@J1~ahF%Y)Bd=wzvWySyxWl9MET0z%XJ;TJo3mp`ku40b zWb5*2gjKI`ISzj@(o2Z?8cQP}U~oN@HGExPE4OBjpbf6nrpVkT(H6=^oiBup+3jnL zA(Aa7Jz;Bw{$4k1LFWgm$1!i7TqDmECYk`p=^)HWgZiIcOU}V%Va2Cw5A^|e-C<fY zWzpB|3JF4^bFBymP5r=g?Aox=E(-&>3C){TLgU!9Z{7?{qbjb~Z<N0FGW!AknRA$d z)sBgJ1D5Dy6HtJ|^1exI&U8wZvMd?gq~6ca330T^L>7?eyq=vpTCJV!$&T?^#wL|O zc?f#sAu@1kWCz#^2NJwVaz@wmo|n;?dt6(-1{Rl?gKZ8BgN0^EkoV_o6SR7gXLXLa zL<I0DZIx&n?EG<)bU}g=QC1Dtz%lei<P!J#Ld8r4Vy)DP=MnQVVMoKEDU*5|mu$A5 z>?nFo6b<`8jn}(I0&rAxTSGQ?w0w0A+}S?TBH54oV5G5!9oyFBWahm|*W>2ts@7|u zWPK|#@qoH%BZ^tj4?>-pQq|0)q=2mK4~5E&$w9Yh)~u%chKW|fJ}uVrtIi5>8mOoJ z*T8}5Z-E4g)9j<lMWdmC7b@d=G1%X;{3m>+BM)8|g{M7_#*J5B>JPnKh1fGgy;-E- zB<pvT_~#r*goq43jAOu4sp?(>BgZUSs-}I8^QrnFUXr)3+PDMFp6+jhf4RzhV?wk5 z?GG0Gr6Y%<GkZ*0BZ_lotTWWvrtrw&B-AIc@^+|#aml9ww)guK_<<+JuXCbry_fAi z>sMjPR8dru%WK7A+|b51xi=QQq9WTV4K&XD5MMr~yWmV!-^5+oUJB(HO)N1z%wvxw zAeW!Xn~=s3WD8UOcErRGLNp==H}Q;l%ZoD-4t%8w6Z|ImGL8OR)kwujun0CZ6_OFi zgLnK^g+Y^`$eJNSUli>t9VunZUxbb0gOo2Qd7DD7HLcx=AUB}aDY9nZ=zV*?=|1T) zkP^A+O<cE{fxrndNBHR#d(iW@i?gq8B%)9`hSif!?>D}N-)PH*&r0u3y)PlKJ+Wxn zczDGBzZ$vx8EqE>d@_l6;@R1mJ&+i`)genWk-k(tv765qCL7wop8{fo1Dh&<xPC4j zWJarlof(X0gKoF$7Z;J)rxj!2f4?;7W@%6zzi70@4DEblUwF0ewW0(<WfuCDAM8!+ zo1upI7!Eg2eR_J-@~2!tj&!&}WOcQg5BeWy)8$pMIkM~|Nhsfa5?^_cZj;OYKBw@o z`}_0SaSfWNs6RQMPeAJFtdePepPJb~8FKeCUtw6|d-zyS7Vcyn3z;WF2^3mMf`dbs zh)Ek1NPBkE={J5@&E`N#*8I_%Lj`xZ=P5jN5)lXO^VNXvZRMZXYa;gQA+CUX>Kh*= z+j}K?+ULGlxF1<!@K`6<s913`iyPzAv-Bl@$qS6Bjoq%~N}ET2YNPdV<`o{nr=fTg zjH}voq+kYXvXNFKe=H27z>DEY$-4?Gx(aTuQgF6k3Qip2>?|ctQbE!FwhCYWOl>Z# zHLU}&6l?Ny#<Fwt6&o%;cJCi~#X+HygDQ;~-lJirr6~hH5qh+p1FFx=H!(pIdd=&J z-?{Z-U^lKig0<{YVy^^?>0}y@M_4%}BzD)XxgU5JN6+_H{Z5&&(fH+}#CU#5?PAR1 zGf!l0ZAJh2QE|Y%me23>HXi{mL{oWxibGMKLf3Hm>^k7-X?g{=W(}Y;gV|CowcP#L zpGdH*^#zc~=DJC?UT+czFcywFOZpln^4(cBRe^5jjcl%-6~!UK^&nuP_{+}z?5%Hv zPrnR%fr2L4OO4e>Go!X9yI!kpb@m}0jAHlo2&3~A5n6*UoAIRM8Sc>Yj1sLkjJCS{ zS{J}dAkW>KDLKM0&4usvY&=;1(yN->C?v&mH$O5Wv<745;)dDQeAq3?7tE*p^xN8! zV&0&AL2rMCS)`hC)fS!1_#A1q`8TLxvCWk^b4<%*R#9RHN4^;sur=L|bG`=v+dVX~ z-`NmB+$j-P%`GZG4Ry<HGY;*vP9ti32BNGA=OI#Uh9ZcfGNF`uKvcge*ZIrTruU?a z@_=uX;<H;YAx|kN>{~9xeK!het}wuoq2MpX4SQ35{ytrIuQdv_$zsUbu<(GC4@)cM zS%FD@;#%F-7D3%GP*9)Sy<)5Y{Vubu^p66{>G$x5?eiBoUeqE3K-SF4cc`;hM)~t` zP|O|EV*$IBSO!p0K<Vp9x?O{q%c!f5s3W@4ub;({QD8TYJb6nT#=4RaGi2c}7`eVH z)}s#}VAu%Qn<FZqfr~?PTRE2X<`pvdk%sKbdAQ-Q?q5FW91vv0{#|a7X}daVfCVbn zI4%3yQl@)lfE|j!O|MvRA5vE1_9rwEHNR9e-!70c0QBh!@N{F{OR$3X4Zk8>W8aV{ zA)|{{E}eCEFakx5F3c4C`^&MP$fq)cmr|0}iZ&(cS*GTuB@HiJ8pdadO{AYEm~>=v zx0!ScAoJ(>-<|YC3kUKi+8F&r7hP%pkQCO%#Dnx7NLA!pmS;<LA0#!}n&al#$#SB2 zGbM$aqd!Q!28xA|zGa|of5Z8A>13ylaCpXeg|kO%3;GA*`7X54h^<A_4io1gWvE+7 zI6pw>>7e1TgXi!)**edm{MV=BlMUbu2FsH;n&q;-ng@I$2l8j3Er^od=YQgME`v58 zL5o<9?V7I&gXuApqV(;NBngAw1jaKHDCn%qcb<_9r-t(sT=WI@*YdUJedV>-C89N4 zy!)?Z8z5FNHgx-yj7-gW$runmCi`grQSfNiEqjOf!CRn5F|P(q8Y7;~G0EYofBJU7 zfe5q?n$x;U)Y}lYjtDWoR{xc2e<Y3gtyiL6MKK$`<I7YO<5n4SJ7g|hDbpp%W{G5; z={trlXz{ox<nGU4{MKGk&*hJ7u;U-R&3JAY=INWQmXJvT9IBV$H|trE=)JnWq;J^> zkU{HOYx#y~w%Ad?EN=hq9V(1Q=xgC&R1~Fv>$`wze6fS)CQG;<zsoBe$C{sfRx)!a zzG!>H$ToS-bR)GM3Oh0{uoUS_)(oqez#XEe(6YpU~?MY=^S)e2h7@-{C`?5HjJd zD12xGd0z*d0<cQ+3hl9cp^dt~(CwksB<i+y*^iO!K_!S4X?ne=EuaunXXdor6P162 zREGLlmCobnrehTCm(BRRNKZA@I|tQE!PCf&FB^-vl0sTUV|EG?GFPi$C@{z0Y5eLD zpR|=53#ZyyFOI|g*6#stv%fq1<~b=k;N#emc8oacBesu$=T5Zm-3z+;wg+ngbZ&C3 z_v?_{Uv{s2TPSz(vzi@00cmRtrxu4LptsjHAGPMk*Oz{VpQYq-?_<Q?A<rAYglq&! zN+b(DMe4Tth`oOLU@!8E*n^hxb+ESrk}od$R9CWS>};^rqJ_Wc!d>>mxl+#3O?OMa zZeu$4m%ob45VOs5Ezx^OD|-j7%-`_czF!if58W<((2n>t+@&WIlERqaQ46pgfUH<p zsdAbNCwPeJH;bt@KY-EK#11`Gi4C;7>}U7_++kfOvNuyCsNjhVknYxtoPxBA-gLZt zNQvZSfQCLtlMk1Ct^Wuq+LecYpiIkHL7nea;%@nQuvS*utU2AP$DR}Rp?(4q4sBi7 zuB@!lPg|r*eca(6%$vQrbAdvO7#e1pH4#aJG;-YHzSATru4L=oyTLDKuu%l7+R|Q- zq0jGIZ=#^w)~<f5c0PEW(Dl{-eu3~ydiY2SC!(ACcEllpav;x-`+~pq*rxEanc{-3 zR%qu3)*J=rg!&d&dR4xdNXI3~)KdM7l?DWZ=ps7L*xlmocCf~hU>r^4B8vV`lGyfr zZ8lzHZUFT?QvD7v+%WpSduy((r29%%e?k;Wn)q1y0tqD;w?7U>Q%Iw7m{Il^lViEa zM`^bs{x6TemRA7S<L+wpSfZG^4vtXxGaAAilcE5&T-G!AOQx}*1cd5_J@3@>f5Mot zVwbkN9gK-R5$Shi2ue~y1uR)J2V{8#G4Zxs1d4?4y{yxhYM}U?f_vTh4zEBRUA`}T z^iSmkl13J<&v;8lYEez=b+x@}V(@QNj3U+PWiwp2C;nG4M3M0u#NMT4$Vqv?!ahdP z$Rel8<3U$FeAp)rmIN!b*cFlTPzIOn9vvqM7Hx-cqoHVt5i&v1K7WXI8Ge93*dN2E zhE1Xln$0|Jl5yRwoHj|AbCx&$E#zL!)RZk}<R#z<`(|hdAq`sgP<PaEXufaz|KEiJ zDJ!6RsNfS_1z%tDwGB=(qtki6_k&=sBf4hp%fw;zjmV5i5Uu|6{EA($oUtd<5}UI4 zmgQD!{pw^E8vW3M;4tlCU7b@qlS80(Q~n_0R2-tV--*J=z}~vZtWNY(gJCK4T6g~T zW%EP-CW^y1-DpseIrfvZK)rCt3Ts-SM=5dcsXQY1zQit&vhTXViAUd+CsKY9zn#Zl zpxo(Vo`gS%9;lf**kxLe-3aw0uC^+Xsl`Q6+Sd3}Wo%UUI2EGAfX%{u((<hjS)9F9 zuDa}_2IPeicGM9^&?M-9?yb*P`N~w4oddClm@A*P<?|FD{|izvSnSxytLE-d>JFp_ zYLWmpa3IL&de4WwOW#~OHpu%jqnqXy`}VB&uN-~x!oy|ng0rIAd)&pgUtJZAoxdu7 zU>Nx=tm&DRvMG)T)6%k9Zupei1*Q;+99hB=wL;2GYisNj9&d4nDIn4DX;-Hc)YUYs zoLKUI-Y=93G7oPykJGj`rSYr&zf13vd@2gMyx(+;Xg&{xuhQK_K6vtP-8S|I`}gdF z2HqqaopP4xbMs!O0|e<$l5x<2>YWWN97&@%sOR*$4XHd?Jk;|%G#02KiNC!1y4=C& zFW8c-1!x{r)%lV&bp2w!E~FEv>OU6NlwbXwD|agFeAx<-yWMm4bdF{>x6JcdPmukS z0aF)(Ph2I|<`lnQpFE@XbsqiE;^W1cwc_(|ob!Bd3Cv_I?@ZEu-;W*n`t_2S@O`fj z{5_~u${u>WKMZ{@bawexn%aPU%1t2yuL2o7s`rJf^g|)~!*AARb`(THOol=<gFM*j z1;07Nk?#Sk^>GX7v2}F=z>y6$TnYf7pzNB~8zS<X-{JtcV8hE>?Y-6dR6jTXBT3B+ z0J6W}=LX7bt1oQnHl!l@C1*KN{0!p)HK4JwuZK0aj|#SKNb6FW-_D_fjGXo4Y453E zeXp`A$T{2(YXmo_)YQ5N2uDIV{DK~BbAwC(w)|qBwA{sc7c@Y5sqOiW6j~K~K56pv zKd{x(63>L(4{n8zrIPOHPu!|@k8OGQHh8Wb%xCMfcm-$Ev;am5OX+Mo>XScU)scC? zPvPwMhg;*4@Ixw3Ng2fZP;C*yyp!BPC;%}1LTLe}7G^)kc(^OOee4kbQ|<8yO*}wM zgGMwz+k?ps@&Zy-^}Ji)fg7bs!65S=;yoB~^B5@=mx3pYq8jL2`sG6IGh7$fVLo5j z(wsoDi&1ko9N}eTPbQe;{2B}$!bJrlUJKp?1xM3)0V>oqMH)Zm-?-|1f=inUzKzTZ zJE4--^fd}SZ%C`hNm|}_nVFx>g(UII!|9Tvkz~j}(a(R@_X*eGS)SfINh;4reG;pX zDE_FE03pxNMBmhWSCF}-{=})GSNEP(;Bx!P`nq%_^aLSoD*TnsU@!a{*=1D!hl+at z^X>^YUl=IliC#jR@~^W<L9(t+SdtcB;w$a7Uj?a1w{Cd+41jrSry?)zXl=jJNO?Fy z=?&!Ko%J@K%u)t`XW9;9;9jl=p)%#Hz<-lA|L?HVmuU96$a6@5MjKKB1&r8e!w@6} zp;2}X(I`V*4oL-{cg;{zBpy2*L`UgvD<kb`YhZLj#h!YuzokZP(X>uF&xs8aa7ZAd z;j^OVBX83W2d;vf?WN3yd#KS>k!!(4VB}ByDmAV$yTC_RvD-Ku!R+rE&r1kBFN@fr z(bfdCK0)0UgI<HipqFVExN(*e1L3=hj(`RGBQ6#Tdw0|nBEBZVXQ<maI3OcfaaJHb zU{WRc!12mxc(#qAudrr;Jt0G7jatkn0|Db8Zo~=*pj(#~)!_QNFhRCZ_Kj_zTv?_E zgV<ABKqVaVJX-`2^t~PRz@rs#d$1Ki*=DxY&+nRh2Qb{|PrJ&r9@#ULf^M|?iEA_K z7{;9PJ623jkRrRG&{2X6y*WgtY3flAZoDP$s;yssc35?PN4IYg)3b3^9Htm|_D<dv zseL2aa-G~gS_+IJ<r+$3OZ?I)hFAKwte|>tg9+P5BMyqH(THT_@C6B_iwDQKTHt+* z0#|{Y(;ZX$m*BDITuC45B|lV$N%`i&fhB)<8AAu&5zj5Leq1xf1;!9}LVZ-$M*Py; zz10I1X_=p_k4|j&@I%E{?6#C|t`qEqXL|Fmi<gBNoL^l*+LqzZDHJ>C+~d-hrJ-yb zVq}4XUj<hb{vxds8ch&g4&O8w+SjYr^;CDjM(pRKa)c?(B<j#+*O0ZDkYWxx4fD}H zd|#|>DJ~7%Lo+C$vKtrLf{#L;Cxq;q4ru^OFLDTq_1*^vBN{dX_$Un`EcjYkdiA6b z7+|}UR*U=V_r~WcVQ;CxrLVQj>&qaqcsArl=-`{uA?^VkGNU^=!;3VeM$1xmDu7~P zW?&M{ZKLcQDuCXYBvM5iwIFL|c|ab%Xl_UZ7+HnPOu3XZ<c^^OdhYq+%XCF-By2>E zlPO<~YE@yt7Ax_HL|a@~gA}WI_c&k4jZ9=w!YU&lXOl<v?Ipf1S~a|Zf`ea=D9O0J z;}u<H_fth(wD)<vG(d%j$aMm%m;TBa<4;Q_ejlVkA<v;e-W0hNt76n}re;_9(&Pu@ z{#tLlog#=?&M*k)^h1D+B@H62>W%XduI(w`1_~nL#Vo?~IehsZz4Q!bvm(@w!GA=I zgC1r2)Hv0GCPmltNb12a1n5~oG-pStrZg;^p>=}~*6W<P0TrSur@DnS`C@xWGi?tQ zd(|bZS*ZWQyTvIZ0_P{<t9P+!%Q8*23>Dy$v{c|L7Jb)A0C?fPiHdMG(uu^t{H?A3 zsLZw!3MU6taRe}6D$XTdj)StrnJdD<eGRlUmyYC?n3Ho(dr6fV;;WqUT={k)ns25= z63#$Jra8N7TVN_O$h~cc+%@x8y%E*YCa3NsK!E|hx?wFKwVrHB`o3z6N#z=0o1wc} zB3HD(+;~v$;GU!<j3)@15XRqc37xp~(qP8okWPw{jd<(IQYAL9F^7BW6Qo(Vh<T^+ zL>E~Qh-9$&^Mm%WJ4Mgoth#Z7Aj;fY!y)YEuwx|c?$JV2V~bl{^Q^5{u=DB>zA3Z( ze&K%*#;{C<R>cLdWvRsF7(ewrSRd>nGEH$|LGi6kz~P8^`&+}*VO<U*1lS<}({D;V z9Q%soQzR5wn?vQrZ`xU>8l2VjU+}b4l;u&GCkhHHUNn#vA5q>qtC%O=pvFs!sZNPn zdOe1F91cw7S+hb=)6}bO&3b)ao25*RP($UFPd_qe%>jXbSujUPJ~cw2eYN4}j!u-1 zVQh|NNYsm1=%OOGPpiS;z=0R+HP9D0IO%vqlk|M*Xg=DwC_ox2n|QqdC$4+By_PI` zu@yhM!2@8HZMDJ3H`_oiYeuE1-7Clq7*6Ry(&-Pcb7i>M_%=L#=4XDN#25KGuuCb( zJ9@q9E2-Y~<Dy}t|JudF(zx_&im1*z$>>2A0Su*{ioFql!9RzGdb7uVhDNl|o;`fS z<u(^FUm%8ra#7ZB$&riMm-LHv;i9UVvmKbidO>;K5UfB(DJp40^M!OgTTDuvA3KPO zk8xBKfrE(oI^hSVNZAy`{+i>oHHEp(x>$mHUSY54ub72g*~TuH)MBi@ci#*;j-beR z1JOa_&Z^zB;BwEdti@!kx$TIcJz0cr@vUODK1wcw<AEN68P1lei2k4FX9w;-&L~lX zF;oJaD(6E8FW2B^5Ng)g+|Qi!2+bJ4yQRl@qa`C7bGlV3Rqn-7vhFp=*7^k@P3%6Y z@SBZ5oD3&1>dl}i@LnQ%wh%?-^IVgt@)rK{HT=2!P83UPrLy%=gJG-0@%N6QUizi~ z-S(PdO0~2Uqb5y{uypp&U_I@I%GVO3X)GKL(Zje_9FBi1WxRl>)Kq2=DWIP@1IdEO z2-Tu)HKp?hGK%e}>O0{-R^1!*0swl7f6@ePH-T}_Y@_Fy%ECW193W`m^r&57BaX@2 z=bio3>ZKsBOzio?NeF|!Fj2#IhMjus;s64%*Q|Tn(k|(HTmAyL79)$q9v=!8#9XT1 z85w1lW{3ya&CYeATZ{_{nnw9lGruC7s~g}2WHONo*X#-P5#B+1F#Z<{u(~-0qF)A@ z{W`I@{?5RrZ5LQoUgAvxlXG<F7?GF!x^LL4Sj4fgnW=ChP0-S4W);Hvx^<dhswlwj zIz_RsxtbHBN)A4$qfeT-Bk079xA$vMXRFiP_d3g2cgJZxG%!*Zk&(EQ1XBO1`Up@W zIxVkK|6_Rfy%G8Om4ZF{I1{`a!JPn_eNM9FALovk8IAwtQTF!L>j#hP3Eu;pc0~L^ zM@h1LTP0c&I}`2o*{`AGcAS1q;r6-%L%h-zQ|`p@Sk+PGF)A6X8_#w@qRZzUaTjHY zU!Lt>0!esni!1X3DkTagZ_Y=mB1FE+cba}QiyHR)soka10PZc2_L=}uz4#I%?Iuh; zoZBd0E6rE|cUn9&@7|o!Y|P9wBu98|RP)@;<wdsMk7m3vGcjQ}BH4q&`4l+zfwc2J zW8behecqY{k#ZI|m+qB?@SIVMM3RF$bz-0Vo#JA^4rP9tKFCca|8-m~hq>SY*78Kb zFo)qZk13*0$l!sQKso&9XR)P;iKcu_TP%YALFTE`i)ALje3cWL;WA>E<d{GOwJ0Wi zMY)ysWwv+-HJ?ZB8FoD?7^ZD&vvVvB*jjuqFrEkP9niX^rtxv#8^m+fB$-ztjfYO_ z7%6NZ?I%mf>#*ay69zWIE|#)=n_Xg-x2N5-UOQWviE>~h*g>HPtN~met9-&S-K1)9 zRDj~ls_y}-)(RCe5G~E(jg2+D><Pa@gl!!ao|+5}JgoXg+6H1hHrWNL^@^h+JhHcI zYhYF@!0kMuUgOGV1IO340^tb70^ijLaC{U+<Sux!x$r*|;5;26edFCKY}v9b&hbCp z>j6@;SZakdV;)q?6_zElLEY|8!USn`Q?f=#{V#_wibeUI@3)tTyowQ?xpmfigbi%} z&b9w${c49Rw5dg`-VL^%f3cle>4JsgV~JyS@Q;!;_)wS8E|`Y}GHWxiYVI|+rt7kI z7|PKQG7$R4dn)GqBtM_unv6!>v0Z@eqr}f#WK@X0Ob=g~IZ;{>y5ByDj%n>987TM% z5+;|?sT;S;)4(Z#m_%-2Q1ltQH4cyC&G}t_KP`B#d;;)&&;H4->(Ix5U|-dRaLjF~ zlPNmusBsz<kJjr>tiAb;vARS5lm>iP(fH9GV>e5#Whx!@d3ER-;pUj)S0eN0J?+hZ zvz?L=40jK2!x@)8S;e83>u%KeEJm1Y-dF{iZBK4lpZrIp!+ylyYeWBSLB+w5{+oBJ zlW*sKLITTEn78ugVwsdNXT{|SCiXa-1@v_^SZVz75u*ZoD}-9h--$DaTJV;y<1!Ir zThpcbBM$5XtFAHFj%eLVut?+bJp(k{$*rt=is4+P2S5qnS7+Zhya$+8;wAW)I3FUu z=oyg^pa|Ij*2CP(DE_3JQYA+NR)FoEfE!O5qbLv+VDUiOP?nu-^P5tksM4x?uPWmC z(=L`rrYf^FwVsCAXqZg{oQHhcZf<+$a(TAXO>IV<<wdh5pgH-GM_?QYFqe$?cD_@T zRiQEMYb)7B)u2Md&yL%QjN4#thAR_ySHEl0V)>=&z-P2?k!{)zQdbP@(jqp?p`Klg zT#0hWRcc+K%wD*#Na%}&@@Qy*YIFNM5&!ps@~*VksDG-NnRXHpvsRIYi8mfP_EU9_ zo(M6_Yv4EHa0AV*>ixu}!s%cH3NjS1HC&E?*Y|B0{@>~t#fcFpNMz2_@%04lwj6EH zbCxrxs;rT<Ea_m)cOM0YhEC<ld;&m($i@!NKc>WvlCeGPt3P?Fa1?J+yfyu>NjU{^ zvQN6nlXr6c{$xV`Hnrc?WfJ1XLc&?|TMOd`kynt35x=fQB*jW0`DRAlj(f8rc~RPu zpbOl_sSAp*E2!7-(pD*;;}#jtKngvXBy!+mvdHX}G9||xs1z`lC@Uj4>ZNzv^~8OM zBpe-P<9+_L7$OxO1wlm=r^k^3!%pn;tjNN`h{GY7GQB|2d}6A7h<Z8|7y~x0Sz0SJ z16&70iOs`r6$8pv)y6`c<(k&+@bS&h&#?dP2=bqvv}HXsdvt(pQ}{7%*j+4@Ft0x+ zwM8JX8!PMtw=3o0g_;r8R~9^XG|+6A<XZdD?=a2**+x(Sptfkg;veK#!ZL9ARN0zr zygL%nnE`ICH|ka;-dX@nifH)0whatKN?@yzZdi#5vgUgJ5^G=RIQ;Mr2sc#eD%Wbg zD!~R?=Nnq+dYSbZhS`aCL=R}WlYKKQ!_*bvbA{djqx5*;ELQz95*XC~EF)teBHajW z=^R8^#t2Mvp*s09#%g72`{xrmH%>)XU@R3aYtbNis_{C>$vp;g2>Ivt1~0py!z3ca zi&0w4Y#<Kdy0i5NEZs)&YJ3T0Z;UF*hc95UINhu+ht)jZsv(C?{6^?11_HM8Tfdp; z+4pE(|0-h@Br$Qu2A!PD20>>)?6?-)Y<|y(%Oy<FrLG$LOrglE;pW}`zG!~I$DohN zI19BF!i@MIW&7;Pml_?cX4}Aiz<^&qa3upF4GUU*WP*r&7ZH4}v_D(Z(3??XR0Wa& z;PJxWp$X&!s96rSGd>J0(v&pDNx{s?mVJ6Y!}S`mnkEY&Ovw-7n3gAV)C6N+<*M6Y zoin5UT3=1~Cg$f`5LP`bAA4`pJpme_o-iJ)r-xGKJEQrAC_%otnCit;RCX&uPq(c& zsMT=qH&*&HMd2nJ*MUIOcXenMlwR`@Q*_9kIV_v33``p`-CG^2FFW6-Pkr#XZ%`YL z8@>Ns>zquLf%rd~a_L7iuK_1WO`Mj>H0}JB1?OA&wIr8(Hc0~>QhI>x@U&Jt6wOHR z8oMw5g;1m4adepIgNGb2$9XW3%LGghG4u>IVPP2WM|jbOHKy3ND7!Umk>v%Xu=W#i z0Y_>Y&#j?I?!qrH08t`j>llz9UD@@WngFu#iLRtl`7&W1jlkEI^!{6mQ}B=Q%f^>P zMwGBmEc5W$G5ej(Jqs{mj>wNl8MkTr>iN95cA)!07XzE1D&Xsar9au!SF$aJ_#!Oh zGe6ohimE43SHs!nTDCq^tW=fSW21ui*8LUGs;~f6mA6UQ+vLRS2C}c4XH=+#-G#+w zR`Yd@@6;BKHRt|78dAvK{e1fnHM*~vWML64#BAZTkVL8^qS$u}*)^qOeOp=>ph7pW z7j&OmAAK3JQ_T>_RR-QBPr|^8!oU+zk{t@<=hx{@G`IVU2sXwi<A?#WVpKu2h}#2# z<*p|>a=)ze7S4VJ+!Hh$m(#ZSJ7`eu1pf>E%ku(yf0s4q5AU`Fmg|w-pGIYL{7jY? zw4->q>4I$nfFlj~j;$5722aM~VVU=-`240c)rcoy^?9q)gbG#91ziq5DC_477*85K zUW|>OpN&hsTt#LyMkE#CT;CJqdFhp4v=ce}!fD2!_`_MiG3mz$<a_npt@;RdiRO_P zH(xnB7+OXzG%sUK84QS1F%g7~4>mortW1j@)0u*qq9TDw?Xf0Vn-S_FfMZ~zeqZqC zj<1y=LC24Tu26*}ZK8Io^#?~(M96(~o?%d6?HI{Um9Cpnq-^1kwZ^f6{`B%0c~L;U z<!VPIH~O_!mdY5p+Z=62yKB#uJN>ryf4_A6V<h=M#j*8WCdYatqbZjDRrgL;$L;lq zS~-EFlL-!vc6qF?$X|Zku1Jv2;&Cm}*wZcw{{iEL@fC+r<Pndi$A}0apxvVzXA3ad zCuj82&9U!MmJv@_5PuK%Bl>77nFY)btIdK^dLns?Ephkajymb(N~^LQ*wl%jgMPPO z(vg;I#3!~kIR5b;pV+C5|58uoWUQg`A%lXwG2GE=t`Vw3CgZ_E8~NcUPhdm<!N98^ z;3&Euo=i-D4<7Ohk;nik2Fvw#X872*QMrHS-y|Ea2a<e%fmR!}Ia7-|@PH>irpF6e z1wCze1H&XWY#hmKgG^y3rPyZJPmXhvM<1sCO0ewE2>8Sp899589Qrq9(HPh7jlABV z`|vue&4qEy@O$Y!QB5am9_cT)uYwf0@1JV@PGWK2iY^Pst+ZA_zMKVZ^qhgSsYTB< zYi+<xYWbEIYLLD!g%a-{h|ov;@mJdF^0a$f{VYLLC}mOns&!6dW~v4>E<e93m^#_= zy<Gh%=1UNA^<Qi-!5sm?*g@u=ys5>@hVqlr$7F;ZV&;UOh>TL`Y|ZK1)Ao276f6=J z3v>%jADZ`y(Uf`1q5Q<6v@Rccrr33xr+&Zs{U00cjFpJc6M}1YKcf|KHmOL&6RcI1 zU{txgFOADfqA$68k=(-7{64HkS;8f#jx!{-{6Y$=BREX#RP>3Yduu`|tVR?O$4iZX zrEynqLHE)g3OQSJnFxYt9ex80gCBM%Np^!DFZ%Yr6+$lrMTMSs@Zkz;I|Yf#<EA*A zxGG8?e*&m_8K66;3uH>(y&l8j5M-0^Q4Xk@+L!$~3osFY<CSg?U<q)(&8?7J*|s3X zUZI%cIz~}%e;I@b_+!38hBjPRe;H1zm&gQFHLM=1QjZq}TsS3{wh~W?_U${+#nEr; z7HBfoZ8CTF`NmzAv-C_9amNeYg<4l(c`n7|SeF*Kuk3QbB7gA$Y%R@=)?0rcX-@uu z_%`xxNHiM??Ewb?j4Z!DJJQ8ff1Rs5jG4467ofP)y7{&JphciWB*W6lAn?P_uls;c z<yV*M#}hgR*{)SYMUg#KpqMkN7FWmM1bdL8hGo!8b~H|Mz}S!9KvgtEceTk!UT^0{ z>|sM(n28SQw=L!!{ddcxh){&!D=B0jEn<JdQXng$t&CFru19SA{Ys`)qA&4(-<V$K zAtI^x0-hVvCV?87uS96Cfdvq-|BWI0xv)e)kE_9i7>3dNQn((C`s`Z9O;TdYx|>QX zd33*yb%9Zq8Siz9st#hhV<a$!%}qj7LOka!e}GigLqm2?WQn5(%-iS4KT-CSYrN6) z-~H1o6RrT?G<7D^{U`N6yrx0tB0RxRW&W?rh^{+d;4_^r8_ec1E&BOW+4nVIa##5@ ztDuSWoT%~J4^AiQ;^EO{Ox%cE2U<FRo+Ct<^J`Jnu6U&CH&gf3e>TP|)XtD#`h{av zDwfIR5zA>Fu-beVO*Ep_gP60Yby_hkH5IJ?b0GcS<LQ6@)J*<j`2%3yUT<<Z@x0Ie z#9WpG>!J`UF~8xc=Ka4`MeE6dEsK(O=1i}A0NKJGZ*b`F#f_Gzha7@0D$KPh>{n5R zhBQpHy}7E>F=tk>)E_^m-HR_NHnw{33NGa|>wE86+>Uh*6N1*i+1%JrA{<@`l8^H{ zyh-LDBZH6hM}_UqnBG65K9Tb}xHgH^wsM|bW1_G6SX~d+))(S@%*&+>d@!oM;2OUg zg1)9F<DY9M+otQ3^=S9~eq4%AMG48AXoN0C(hMv8be2L!k;Ukn{sh73gnfp0l*5#h zT7@R*&*G-G{sHmj9tM#K9JPcpX*N`_ZeLkhjdbGeHdg6Bp?XRM#oz3J-pwP|Grs-I zVdr<?#lC{Jb7{mdKbf)UAD|{!hX;ASodO<v8DB>We_kJ>p$kN6H=lsIB76b8i3vZ7 z<j>H|7xzm*wobwi36eGZvoUp}wobO$ikut1oARj|S;NTALum1<RZkT;m*0&tNC<Ku zh`n#`KK~6dysty7?^T=YYgF6cS`|6gH!EM(lM0{iG%X--s9m%)GNpyj-g6I{wno9? zx!k}VTIYKs%8W}C1DV(QtCJ}-t(FKIYVyb%iJola5cqYZPxe~CPx06RgG<!@CV&{t z#K+vM3s1cniP(W%+jXj;Gl6H(Wib3OE4I6Ec;<Us3BpH!B`XJPcY}w)8{w1js=0%S zb1HBANsZ{}K}a@4M$UjnFD09FQ{Li-luv!^AxOLcj&)V#ws|r@KLW0S^=tW73>%|B zxu#qe%UEs}ED45NA8v^&z@(iE01nmBegNYi!!g=h2!D;G4?8Nr0C8~~@$zQx&B=bT zv{;aTT-s4+)%kULv$w)<gb;xuxbOn>94s8EyU6e@9@koP9qiIu1t_mmw#LyBXuuId z{w3j~1o&1iSO5O|fEaDB8sm-H-cQ~BaqCeRyoSBb!sSZiNT?hQq1V!nduTOMO^Nwx z$+lG?c~uwxB0#jLVSou?%U3oSVvLFkz`~zh2J$Y$Tv@WoV$?D-vY{1DCRuN&g?{ac zd%`!D5WZ9O7eeRV^TGFQOc>XQ#s|7Q$eVpba3?9#Tj6T*b)|?G(o`7LIgs*cA{O8C z=dM6{J@S83pgA&-rQoN359QAhf1V0cY^i+hPY%m+s!On^Y<o7*$p4YDvGMBm>JNls zmItNDYNtpi)5p!8rl%vqR>e|{E`~mCULul+fWHm_h+(?s{xuc~5j*rV*XAdM$!!T! zb5Z;~__;feH*J|e8o~vORBnV<Qhe84NWUMsP_4W;eM=BHOH)v(m^VZ0gpAI6p@TET zQxztV1OO9^#pA+2*km#a(e>X=G#ldb-;!vU3X}EaVHO3@hcvfp0>BCp;SpLQC$h%Q znsP|k)++}&`o*gVteVVmqsPT=kMZ~8UCJSJ<{zJwhwF7!_*X_a(SM)A|9k%Ye<P~7 z<pnn?z?M(o@`H${?NdH2^4ISO^L*e!8OJCoQ8kAekm;X2khdhyVR<H1Z))_U7o@h> zJ8%vVmZKS~?)K!R-1T;|<ot^wB<l&tuRo7{SA!Hnz4L)HyW=;EcnO)75|UU1Vn!sC zR7&A3E&LJ+7Kk$=c>ywVn(zFb<$~KcGmpH*9(+)asLTisjT9<t2<ne`J%DNvD|-Y~ zm>V}=J}@C#KA=FSS!=m_Ee{_{<^qiWv+x;xfSKZaxa?h8&RJ^h)Dcl3J(?k76XO(a zHNBg7EktHQPAXh_-XSTrI-gAe!MLnJvp^)qr&K2gPnNpSo-KPAZJ$R(w6l0z|CpkO zGMX5E1Q$&4AkoAr9q&Gm%-#emd<|(kSHxg?9AR(llt%*xzQHu&kk|x?kHjf`*bg=F zUrN6{K}-UYd8hsDdaLybBGVmt0PV^<5fzlF&<||(pp{1I{_IgB*ywGGnbU}?N#CZn z4?ka0Uu}!5sl((%4vnCSblV>p0MK|L>o-9Te!9Zi50LlD$sNzT82h!@$eDSsMoYW| zC_>qK&qf^*-*5=VxFi&|1^HPLhP?Z{zT~_Hfe=u)gc%Bbv)metPayi#wA}JuR{%NX zU7N;Z>A|36r`zL0=K%T=I;a}0EmNU7gL2G{O2qrpHV&<rnhia0PmCtkzbqV$N7l<* zSQQ0?0U{k&wepGSxbt}4Hq08c?0I!`ZykJxQG;{RdVT8$xfjD=@AwGIwd6H%qNF<i zH5ra1-JEu9g{L>OR$ND+^$W=eRy*`|)>l3iAx@DIh{J=B`bleAs1SxF+`C~;#_EuT z%zFDR31DA-BfOzW7m$ke+f4X8LQB%;v>2Bu<6M_$9TgU7J4&@FMS%Wt=XYlgJ|KHc z>u?a~+_rCq_vM>!KQh3!N75OUuduFDrY1Fr6&kbH>do$Lg&p(lwE!{fM#BvnRpnBy zZIYHnha*A;;<wn}2_08s(mPdIM&1_T98v9uPGk7%?$oiQV1H;aDN1sw)=LmnM1vKE zB)5CZa^^(u>&X*%(3_DKV=m8-bY>b8bNw80^4;#=uh#z_jYM=Lmk5Myq`H_sXwjxP z9v?o_7aKmKz(C5S<PZO(5!YbjXoH@EklX{20)9?2QULn%rOP$$?F#+1ZdN!?{{~O% z{+lB{^;2N@Gn>uBobdynk46I$tfNdf?b-aAl$@iq9Dn!vd8VXNBnnYdsVPeEP%gQz zfLUC3N2R?c*-V3_m-E~(;ODl=^5=6+-OqFyURCPzMdSjJ=c$j^0~ps3rfj@P&<ZD~ z3FrFPm$QP1!nA?us^7gd4n0@ADyV-J9srJRqD9I++75g23z{fB({W}|R&RLBf*`2< zBd@r4`*v>#=N8!K)Kgz^6!i|i$qnQ)w;wd7a^x<{-Qmr2p9YW_J=qwv=<A=z>FbrR z8Y247%2!cPsC@ZP4Oz+znQsDBA?h}8&tI0Xf_T?UvHw`y{&O-R22@~1m3R*lR2u0P z`nL0W{i0Tmjb(|b2g(ulCW!My2rYe$r~YK)-ADqCJ21PYh7TrtFM-y-jUQ!+pYj{! zWq-YX`csz}so71Gz{%!kUhqO??5&u)Qikg+sp^w1q1MuG-9{*f-EG;Z1fQ45qA%Oz z>U1*?Y`&mQ?nYl4rfuHYp<)-XiKj!gQRJ><N=$+nXS8jT6o|yO_?dwe3&c^5-5RtW z$_uE5LS>Y)*ov{x(E%u7+Q$g5k`KGEir*_J(JMVG_oIivA|o`)Es7TMhTI)SBPG~j zZS61{%fRilx6{i<N(=}FZ!3tFy4{k;za^<H`TlX0#>aoHYocdhK-M48G-XDL^BJl5 zKvAZe^jtDuZ*tqXo??St&+m2so%K<;0{9Ub1;t=ezqa#QuddS!ul^s_iXgC~g_6?8 z2LVKQwxh1ealf2RkxFaqO=MnKkG*R~;1GYamW1}kPLgw?*<uXmNCrCUK~(s>>Aw$` zCpkCTuafA$jRn@A_)W_kec*6D5SU68QJ<b2z3XainRv81O=cgNZ}EG4Sna!TlN5Q> z@;NvKwF=V(@>nfywy7OsEtkAKN5Etk&TjzbF2<II;ni5~<>&=?kRjsP7g!im=DNHl z`T<;Zh>Z=BBUs||+SX83`~7n4h37UpdSREVc&tp&IpqqE-zg||-2Z98627(OWwpEM z18jgtV-I&$v<|*o4OS}2IT3~LqR>8Nn3M9LR~+cq92$XH0USXiPrvVTXHh+0xaJ^` zc~4$Is%(Ucu?3j+UKaf=N4L$v8tNV8tAgnrY$V(7b9S<92POG23L(88*#J?Pp-2`i zb@q!3?EwOH6ATE=dlC}vP((0pEaqeWJ>8`e5Bg1*e`@G>+6EacS14OOItp0&L{@p2 z52145#aM3@oI_va;Lxg=J>y$Ru2SH4_&gf5UPf#ff)V3r$ST(Qt86%<^G7Dg&d`5b zjT$*^;3N$l{g};~Z9Ob-6(@#re71-tZ2J6$mmqv>#-MYaD{FXQo~zB~GEYMC#kTFr zJkoq(cf)2Z178g7tGuC9jTlVkFbh5|!11OsC0x20XtCULNg9BO3aFScbW;)7OX|5k zD;^4NdlHddsh&nDdyJU4R!!R(fieGgD!il`tN>3IrtLj@H6yt5OJ9QxkzQ#~7^z5M zO7NaGf`BMiNiHw!4j+qE--XxxA{t#suMDwiF}VAR@=9_3Naf$<|9#yr-PsUt8Ts3* zpGCbtnPC~>i-%&W&P3p#XOe}^2Gvmsu$Lm^s7ct!gM>19b;$dh>y$xu#}p5IWvQRw zbiM7XHTAMFKY0u?N;tG;-tJwYOEfMGS_?4Ts>o+$Vf`#R`hG#X^(W%?GBWlBiu{r3 zMCi*lZ_EP^_1ME9y+dbq_n$?YB`zq3^tliyxSj}N`*;7t1cX%mKHJ54T?p|^`hN&} z%b++LrdxN0!Civ82Y1&53!dNv4X(l6-66O`g1fs8Zo%E%-5t(6-<EUs`+RlwALhqU zR54X|PxtE8*YYlN`0sFb|5B9ZK29_Ns>-GMHf`s%J~?Z`=g@7*ZZal2t*F5Faxz+W zaDuXS{_AQI5!us{na)~+zvUbp=76jE3y551?MEpv9C_~12gvM0PiuS)oAsw#`|Hi# z&S5u+bf|Vz;|>=+nxZsH6UAzMhC98NzQ{GNf^)w;=!dnPtYjwwDN*LMEO%q`R0lZ` za(Zb}G+B_WtoUTbU`_pZ9Sw0x?q~(mw0*?XCebnQcn37{Rn%78ns3;|AU-b~^US?= zO&?@(n_#`z;t8|PDV?n;6vo-$r_$P3<2xy4(e8ja<Fm$21_cb4P@iTN$v`0szCSjS zoLzrON;W+-(BllkH%gZobbhIfwLCjhmyFIx`N(VB0AnJhW}8y%$i4gb7r_#atC;c< z)c>@=3!)7tNbBRpV;V0N3_46^0)t?N9aWE&?<>tbhgGzQVru&A78Xf=7cTTP8`x<t zG_*WcEHBXA_olLz@+W_5#cRHaa&k~^C_RhPWOI(5aEuZ%q=x#H-w$Z!>v~?gJL*4M zwL8!#CZw_zv3p2^9(xqcfxq~vp{QSHyw#l;>q48g%+<0DzQnZhGfxa03;m{O`jVix zV@w&E=oCz%aV=n(7LzCeC-h1|5+ikZ8M@|2=_24gS-*9!$h|8OGq7xb<7(ACw}`uA znjQJtBjR~-wTqxS*12-!L5k)re_QrDk>w?l5JzB~)aN3g^PttW*RH;miAK19QYz^n zcZeZNXK|f06|jx$>5Bp=6Oj}@g97SP0bfUutAM_y+urgL%$_n6hWw{iO*}#E2r+TY z)Bnp0Q0bvR-FdP;f`A8TxExv9QC7De(Brq+2VY`LO?@vGgWQcw*xdeIUCNo6`LH`W znF3UxqLavCPngSqdbRZFWdm%ujcjdMKjD(s0>MrW>7du$znx@&zo`%Ag{)X(>8h&) z_NevGZp_I?(6yJ~Tg~;QZgize!Hy$~ANph9h;xw^vKtte`V2q5s`*8=-Wca)rs1v+ z_GxhPc@<*Mh`FUqKB*ghekeDRq&*)KFW;iBChJ&9w^y;HxcM9$O1kuG-X$^-DCWv4 zL4|rMaCo-5%@@F6gbU+c?QdhoIX*+s59;(UiC0x{*ljY!HgvbtiBCrbYqtZM!2fP& z`>GC1e;f7Kx&J5I!8%i|+5f8Wreh;7><vZ8w_fl&=S?NP;FKSUmR)GORP)QEZSx)@ zun{$?=~gc>yGq)43i2MBeW({$o?~$dP!*;frgsX8{A3dJJd3Xy$4YIPqIw-WlItZ` zr}mj~V@^TgaW2v%9yr_3o}rCKd29u5%FFk?M<$?No0ML*5WEJcyWwMw8K+@4?ru0r zfcUNjt#%FVMa2nkj7jwa#q+h+y503<OSRbmWpHbgCI@<Na^}Rlt@OFqmt~F8Lebw# zmN?YmW(L}irW1=}KE2<S#=y=>mC~#`jAuFYClaW4Nv*9h+`qJoEH6&BQcS8n{yWC( zU-k@J4s0`2z=B#}#%}O^502{##b9H{0#1`y{`Z9BIcQ267i<LBwcias+X|bqHhZ^5 z$y}G0`Cc{|)M)$a>jbSClmarOdlE~qtT1T%D*g9YoLDTKr{rDoHqI=EYxogF4J<v3 zbv!pfkYO6viIIaNmS1ti?<WX#7kk~UskwdiXF~^1so>dwsY^8KxqEvCG4iyKW5f?H z=xUe_O`VB{-IIsK!@}(6#|zoY#M+S_WIgg#r;1-FKLUIV*)<!_2a989kRZq21Q58S zqRQ51Ka(!1IXZOYGI@h!NEi0wajVM0>c!HEoGbFQ_|oII&aQh8ryA@Jk0W}}H4|Ys z`RmB(YnZGHva=af#zV!X`Z^;9a82R_i(hCSRy?ZAK<KZT@1kLo8*8J}X-(hic2&oU zi~EV&=UhcdK5N!5M_kqr^BH)M*K1+OnK_g;x7}`U!r>*y4+Z6d->WUE6*@m=p&EQ? zIv4K>&w^rp<_3747`?5WEo|Z4HJd3+e<w=M3U8N&kajPOnvn+c&DEJ3e$J`uS2n(O zs7BeW3f|W;a65bVushG8Wvf6yXmUUJRi$$eM{RtOi77B2HmawlK2i8R+RK~P2!B-m z1r9oAH(n}I8}F&i_BOeH`v(b`G;M?=M`f$NLmm@^>B&g_8>Lje9@W}PMr&hpeoYc| zPYMiN_eZ5zS`;Kv_6BO?HEfe~=imjD2b9Y<qY~h4h`i-WF=vQGAWdD*$QF0rU6$As z<p=D*o+Lo=tUA3d*knAagMAOjoCbp+*NGBqe?JUA0P5brfZd+u+2RuE-?ePurP2h0 zB~)+*NG-2vAL!%G&xjKbw$=_Ce&2jWg42I%%j?l>EH05k797F|4=O=^1gX#S0_JhL z$gAGVEmBbH9X8B}x{<5o-^ccDEEV_bBi@JrtdIl(s@TG9^--sCYqAMFs|G`kfnsCd z<GF^UxAG`%mU=BMhCttk`kqhkbCT&y`%C;Y(prRdzUZx(znxQKbVT{XxBB*490ukW z)7&N|jU}bakj7>)Xd=89rU;y!KU@%UIm4Q$>jpdhLA!48OtOsd(!onP)DwE-OXDG) z>|7E{IjY2(TC;%voPyF1?4JGswEOe|i87ncWg{oXyP!&f19Zq8umJS0-rCDn6cfAG z`LK1r=KHEKD`_P@HGIEYCT&jbXjYA@{nxX3aa;!OQ}lLzx<I??LsM1r`^P*5fL#1& zeLW0)LwU_f_RD1n4tbG+&~mwEk(tm)Muqt&P}@DVWp^a;`|bAfedNQOH4Dype?^os zF_cIO@>ZmaS*u|O<52Qlo9Zzm-_YnUJ@hHCH~ZPhqlVp6)~|KaNU!2zA_K0Al8^Q0 z2WIF$+kPuy9<Q+8ZMsuMk&5Xt&Go^;=2&5A#CXJNBE%i_!&^AQs94j2?F4w8q7?tq z;?LXZkV0l1?xy!}Wt%AweRnR7AoKQ^eOy)|E&qzekQoNNEj{a|-F)DCSC?>7^8*UI zK6a75ToV&}eSTMyW+44<_#FSIEZ+2p$Vm#Y;-oO;+mnTe$*n6n2$Fc5P8fQK{*$*H z9b%s5ZYIk;vb|$BdwN>VVN0;KCySeto2xbn996k9kra@eohCXfzn+C2w~cC#CD_(< z`?IU^*~jZd;s41FgM?3CUfJ0%+_kFWWH=Yfbp0TN06}_;#=09qmV&uiAa{o2v{&+9 zxFVQXU7vB>NeXlz1q-2lVo+iNoBe+{2N<(s1Ax3I8cf><2ZS7*r<-$sMgyWe3l%+` z?beGqAjGb^^NXRF0tn);Am}u+7coxS3K^7)53Atgu^rwQ70i7Vlw6c<tmsAm_s-Je z=)dHsl@(8X<<~=g&m%1jkDP8dOyZX3#K|67NQw}|yVDUtc7d80fNRiy-NvrJ;k(f@ z`kE?n4nu600@>YF%~vx*<62w!y~_1FTvc^2a+T6q20_@k;UAT+CQm1Ctj2EJ0K_`X z)(`>8%S%srWnL9$z)Y5w$at{_Laao(<{PDM5OjJU?r-F6urYNWUPU<G8}maC<fuoQ z8{LslyC%Aefr)K`f6!=u>GkGzMm_L{PU}dR%K~T|xk(tX;Kq>iF{`^mp^@^cX(K9b z7|)cK?;yx|*QSWWL!cBEAdd09Mc$X;bP0&IH*AELk`y)QT3q*5@DZ(GMC<A0^uEH1 zUrXO&!(-pO&g14E%N4}xF7#5}1bF(m|LBbmYP83QFc6&7#Cw`*DUU+58o$fkeW5jc zKR6e1zwAzBH=)`(vmbtM-n|#We<(RRE8G=%iNyNQ%1q>Q(bK8nd}xb41&{4O3-UJA zH&O40Tg*7p!@=g_gORCbf4Aob;8hc|q*0{m`^HkuAC+lan`Dj6!6UNl^b9dzQ#tg| zROaTcohW8X{XzfKR=>eKHr53}b>$;!VHc-^#vrm5gi|(AnJB+IA@?YOKHbT?0S@8? z5I)W4v1>x`x#N=W6wN4r<yj6s7U)-rokhG=neFXd=u1nfBH4Eu`y!^IpY;sGGjsY$ zzxa3T<d)|OQd&N9#G;64g|UtVY0}d4y5ugzCo^29U1q^^dS^0q5ETY+rh;7R;mWNe zPYPH&SD{=iV=%heqV8FIc2Z7qR5ra+iRRS61q7_A{R5H10dKe6zO>0$uSivGzXjzE zVecb4+pcJa-qa!W=XVBD-G0m&Eq#W{no>S@(M99z)cKh-nrFKL2lbc#W1ap#RGCPo zf`K)+Q#f4a6D4!iev!VGMTU~oxbI4~wT}~~&yX-yGCzb-C#Ao~1lxLF%+RnO8Q~;d zPfsAgpq-CPf@_@)6P;le3pX|@LyMZbEx4Z($b&8MzShVxMUNhovq#oyTk}nL1AEA6 z$i3<$YwJPFRIiqOO~N-e+Cb%MnQcqUfZ^|cE6f6c(`xhul<Hp$Wz``B4%W`r?uDdN zpMN|cc$f-puS5Lwg`v;J5Y|X2y0ePQLShT@Q=^tnueavW76ieVPoVc_3<VZz+LQ%4 zJ1G+(pXS5e@mt}m?7WatV>0#E|K>mc50PragnptIP{kC#Cp(b6%2#7JpANjHx?q<N z&=1TspR;SLGB8bBd^*@LbZJCk#_qT=(KS!3;VfwKS@+w<!d?AktE|6l3l$jRP-;Kj zagGgw*v`AgY_BC<p0OGuLas+oXh-re8o*wGCe_lEa_K)RQGO5Z)$Izmq<YnE)Ibh$ zx|V6>^j4MNJ@(@|`iPqQaLSIi!csV+O|<k^PKup(jg=q(Z%MRGCc<H{b&cnp9vzfr zSAV~C;p>+*F-j?gtaSRsP2|4?J^=5~F(_o@ac)!CPM~iuIJt)9^;DiA9g4t8W3<w+ zuTJQeq^58TB{)_0)lighvK9Z@(04BD!JQQA@LW;5&9JK0AkgFCVNoe9($+5+6S*z0 z?YGy)`cL4xTBJ`;*v%W)=$SZw<K6|Gmr1g7Ffw~duHrM5B|lrPye4J*4nX_nt~Hql z*C0HY!<hf&NJ}C`SMr9@o2P-7juU0w_=G2&pyj-w-zLr24jD}mg?qcjS|P&lIW2M- z#%8Jv(q5f*V;?|n5BCgZC7>EM<y+dyrQ4;O+X<M7eSXfr5yQnKANZfBW(t)^<Q^6$ zNKTIgq;7;&Y`ApRH7t?}upzvtReQKCv?Gt>plq5#z}@S}RIEZmb(YLlegomffCjJz zb)Yx7BYHvBm6oRsVgwQP_0!ggrR4Ss#3Nzx{dv@2Uf*ay9=+p@M6Njq{OP!(k^TA= z4#KyvY;ns2!#$9`Zc^@x1T}`rJR1QBp}Q&?NIkh9LXSwQST_vOJRd5PyHFOQ4m7)c zM;(VBes}5_*Cy})^sRz{|1?E$aM7&>i37qd1>H_)1r@<=BX|w9V&&^9F2Qt@or8YI zTDa?(C=fU2eBQ3b%&6ZMG$$ptv6G`@yzjA^M>Lp08T%NIgAfn7N{9n*NOp$|%lfwu z)^+gd3tPy-{jpp)L|10BZ1<73_bjCv-c?2t_u;c=O18Yp4tUt*6$G~MDp&V#nPc6J zImg>&e60J)a1@HUuY_CMCr#*Cp5DehI`V~;SvZ5s$R?-z+8g@SvIp$6P3c3MwJ4aX z*j$d^**e-6%7GH`vxU8SV7`z~GPKJJ2uL>+$k2(f3x~8@HSfkx>e=+hDr`AElR6(! zdRbWYquvbATwFi<{CI~j5$`%#-(JPFfB}eE-_H2+x#@3<WQ5v^T}Cfk%Hu`<<JtVD zREfTKH1At-?CSZyF}VsK=()a+@iyZpW~yn5c1ob3f<=9V9w3z*g#vD42R;)nY~h+T zFi4&CloBri6**RmhyB0+YhA$@$})bL%sPkBv#jQQHnBL$5OJ&aPMBX6=IrQ?rhhtD z+fS#hVcO^z3>I_)oqz+?aD0#hG`}fI1Xlir(alu1e^f3zQCo0PNg^GT<xHv|!`Gh~ z0d(`dQo*n~75Sc!U0+zPrLS{pi-hXbdua;bSRE>Zyz|eem(QFH`JnMXM8BBsiY=b? zCOXaYze7U7wukqM)LxJ*yhXiMN`<vfvs<TMZKL=>u&xrkS+5UQ%`Q+*x_sHi`rQJn z&pYccg(5YjGz0%?MgP+V8Vc1Y<0k=OC0?CAEEbyv|6>Ie_MSxIVCCyIGG0jaXR-dK zn?@%2!XWXLs&)~@;+f~{L&uGpjwiuqf!2TU5S1PILK%MP&SnoGLbA$`?VfVCiYPCz z0aD83&k7J#I-fO=XF;P=U)$4ZFnL>I{F#og#MYN)217UGlPdm%%Pv7Z+Y$#JS{fl) ztr}FhkeC@w&j%|xv8e{D8{zTUdcMRdGOz<cuxJ^&IfCrb3eP|NPBlm^+>RR6mYmB_ zK6dw-CPOR>E@nFyLk`o(AQ#Ld5J_-`UoF6UF!}1;^n5g6r|IlvELmO0YaLf%4I1s& zj70bc7~dIQD=bXu<{utBgZPWJmX%z0M4KYc6wdv}PJum}DNe4Y&T1T3weMeQ-!IT- zQGO9%kV*V*l?G4&e>K6!VM_d-1R!i#5$UM!dHb9jcep2N>Z~@kg7qZ+@L%r=bh2=i z>TY?h;euoQ{XACcU05FHzRHS$%#o@nng7W2XUb%TR23#M1n_ERgxuhC>9=+sRoq-0 zb<vVq%uArh+;8qYjV=$koC>Inh0cwk!zMjghWc!WtfTCVYf7ylW<Jb4Q|GMm!>q8R z+rIIrH<|rT8PV!!ue-iizndAd0FprMzicP3ySlw(3d*r819k5(5P}Pui!&@U2X1g4 z4wx<7op*DB6rmX6m98$RA`B6@w^0bM`|EfsT1Z6F+<#0zj5nN89-A!e(Ay{hmcu1% zKI*r=ss4V@U>EI2kT!GIGxI%ZF+z$={n4vylH~?CG2Ts56&Vk5bG*p}i99}<_+PZb z21I)wBFIryIg5C^(^UvCGJj>W(lbM0>!7<MMXVuf1To_MVZBwEy93x1nsNChbhfbE z_7a0o;6S-CzWj<OD=uF-;WC>ZU4j~=STY?>uWzW~(=Q85&xy4MSMwCpvGnBLhC012 zA`C;6Q?f$&ex>*$tbb!zNO;E8Ll(!YO0V%Z*dG$QCw=*Len`A|A^{Ff6G{B^+oub# zjScd}U?&72um8{+D@69UZ85@&-}7Jk=RM_UC%x%HPn4P*rBEb5Q+>JnTmIiaAAuWB zm1+MR7dea-q(&gB^XA*ImLLM=jAv8-q?e8NL4k*#=NT!~v@rp5;eT!*JGLt}d0$o4 z_yd;iW1a~kJ4?(?izEjnL~Nz_w@juQM8%q}5>ykRQDN0$gMBIagn34u)E+D8jX&j! zOD{nLtPZbxMOXqjv<RT|8yiM;RGp8_Kj%iA^4jXG3$<sY>eW@{7T=F#j!-Nx<gE%0 zXXCE&c{03bD-O{j!75+B#*bLrc812`&IJv=-M3u;o}li9K4o`(`{707VhY{ne`-SB z!O|=8VR|IZ=1gQG5B3<TTS^nC=8LTlqw&9AHb#m?y-lv#nZ)0_A8?y&7NzCk<f~rV z$)+BlVNaGfyu;o`kt%lpU3r`Ij{tSvZ%PWM!(uo6MN(1|A#$Gcp*E$qwtXhTB?5ot z(B%u+uhrSust_Zh>6Ink3DDX56jc<B4ZM{!3A(s6SLn^=e!G=oso(vrgGY(qmj3nu z=7!N)9WB%_zo-e1tt5nh?^`0bW)D?T*`<z7Gpnl8WT={@twPuZnW%`WQcRVjd?>I& zAy^1G?l!(+;oD9wK;QUXfbca!MbroTby-DTcpH6epzh#HcDpQ*207}=k&kEXgHftS z-F^2y+&YqsM&^0mMNF&V{@Gi*h}QaCYta;4TOVQ-R2hH){QvV}`}&~?2-IgPVCSRi za6JAwlzayb_T5BAevqf2K1@h7?YMc$^fVa?4!KqkStUh(1f4IU+C!DO@;(O;hri>q zKV}C_`V%(eOyRh$Y}EO|t5r~r*GF8WP$&?hACigXAziB!rF3*#ad3zy<F(6At2e;t zrs%jtSxE3~x}XVldV4x<N86i_O*DX~qE$KG9aE*8%jSzrl2syspmQPiZCO)&6c7*O zXL5$$r@n+id{_CH>t3M|JlGDZ>Pn-WVYjBkRr~L&#iDtoq#*O=V5HE1Ze=tB&0iBZ z8n_}(_U<QQDGt#wZMVA3^#gD#`7b10p#|*0xIe2b$Xf62f_W&*D_bE40U^@%d?@;g zOHi`$J1TSZ*!~3#v^Eyj^{=Qb8trYZ)quX()90*pUWJM*Zvx>KVRU6ksKWya#U!(V zAEt&ov(4kF2LZ?li79$>bFqR~X(DlF)4Z9anFouFLG8Y!=brgz*-xcY3gL!!5i=Ol zWwE_dP2S2hu=7YQ!=!xF=s+Css(^>q`HT;bGb~z{pL}Qmf5xk2sDA86k{W`Ud#w=* zVQaoPRFBPF`Tb|iCb3ws=D6L^z9z;4Qb+2IJW!5!{loHIqHpo`S|~@Y<`R@gAlJBl z;x8qj2r`K!1G3L)bUn(f<xERVOk0!POX0cafy>s^@l>PKuS4n;64{_&TR~wU>4wie z`igHCAej{#Q<(%fZje;K#BJhp;kMqBQ<}{`CcF5lczfsU8SPDV{g8NSKUg;qDCI!& z{47pG2nFWlEJUb+^~K-{wWlIcH3^M+OaWx`pTS`?74r_M41c$)j2N#9zd{RL*@^th z;lHE+DL-%Xa+U`1D&x>&#bv>E@HF6RiW{p9qe=Rmmq&19ZlkFKK<$QQYECZyDiR33 zF7%0Af%atqzFJ%44mI=%nyX}AmD3GU|L)|vW&?G>8cOnhR>{ucG0k<}|2r(maAahV zD{I-lCk8by?h~I1gjK_yxa*vik5=DUX$D`57c5#I$rYxx;k^<XW78W>bt1m1BD1Dd z8c;xWZvsvdJQ=Ru`c}*sSaf{4UUkt^(iPRf1A)Gm=hB-bv<&*BKf$2^kW;*K5v=L= zs>cF9G;N!Yi=wDM{y){|f7T`lCc2e|Wav3NiI_0q+^yC8J7*@AJO>W`d)$2`F~PgR zLl|v)coo;-`T|(<RH@FQRVOgzq2jL}_-kh3A$Hj{Cy$CfBHO~M5n2fW#Y&!!@uxWE z3TG;{AtyTiMpoz^VfooKF;U_#2yrHD1efwwfvMskJs|*h&$i*{M=b09(nqa}cD8xF z#jy(s!hU$d*1+50UoxolKg(&v7sVec<chxOHr=Y3Dz=96%%zrg&sKc)ncXIu!7pMx z3RtQ7Ry3yR_O3Q1bFTNbLp~13ed?n#GMZRBC-;2^?!=HMVtwW3>yg5HK)%7%-UiRE zUfB8x&X_a-yG?fUyUV*(U3ti%-fD4M*Z)sN`mbsQi453~g!Pp-N9ni`%9cYF7&6Ck zE(m9-&jhGQqkrshJnadHSz8rcfEnQP)`5eO)LnjGc?x6Fa#8H+N#!rq*($im3Zl%v z%Id4@F_3@T=U2HOQORqIrtyQ1wpuv^VaQ2`s^~~LFF9o@`5qUE3r8`OImN90y<0-M zKKW{ruGMgsFUz=$8we>&G^=+DIIchLmg>tAe;{R)G{7h<RU7aH2U$K9ic{h}fd8PR zH^!W<aBxw2`ui;pg1_?R7HlA&6c7u<93nx3o-JF-HY-=2Rw3@IirquI(cw4|*#4oc zC*-l7w~4GY<iE9$ry2*(%1El}h}p*VHfN!R3~`8Xz53o3D6}T_z_VFt-An3jK43R2 z%HZ`ovFoVg2FnFin19AIm*A7^@kkG=F|ij`Xt85(Ad~HzKVFM!-qfFv!a5jT7bzRV z!{5X)J`G+rJGslbWTwkbo^ZPB)Sp)g@^la)wsrZ<sS`9tW0}oLXLnxxnERtHXjVNY z#-WMZp+O*-Kn4%`ZC-AjFvq7q=>%Cr+5B#>Mu!oEwBAo+KvE;~(1L)Lan}m5P{!(H zrsFfKhomiS7=*UBa-ASZ&gR7s7T*1W3b&O>^~KFp#tpRY0hojJcK={!#bII`wn=D9 zz`uje)_yN=|C@uaDdxh8U|UY-rInwH_e;F`8s1_<BXs<c8eaGI9sHOk6Y~Z_Cua)c zoTFCHJ(E_7h^y%P8v@=23ym^a4O{Cs1qVm725RfJqnB&Lh`G=);1xeA+lJ6R@ze1e z$9bR&x!iUF7DH@arQ!!RTBVLXSYMqHb&U#YpuY6nQ>@O3r<||f8x%mTFSQ85lGp?h z&56BD-gP3bt6p=AS`#lC`5LZuhUW5(Q{9(36oCN8yhD7gywFeT5?>U^BwZWwOC+c_ zEuL_tMv)CuOH+HZOj8e7;%4sOW>r;@ZR6e~=)%uu+2RR55+MC4x)2Rm8gi}wTmkzk zyIaK9`{}o~zr4%V_xd8-f-#ETl&CkZD4$~^m3ZhZ+$TaALRGSoiACih%>@;2Mn!p- zo+Q5c*x<0nZG%9`>))A!+qlIa07Nw%YJ4kE6e<Vn;E-e%Z6EWWj-T{}y$@m>b$RuD z6JO8qHvz9gG%w0KuSllMNRvPPtsBu9B<8Vf3R*}@C_j)I{AbPbV=0H&PoqTymH9sk zeyeLUZ^gbj$DdTHgMSSotg>lc`1m7?d>Mv60)qiI5AUu7Xm3AQ)?-fD?Wn2`vz};Z zO-UofTrBpkMqL>kt~!u9%PJ-Z(AXEzGP)-E&1>-zGESeR)?b2*g0*7BSTmLvCxhl@ ztY%S3uj&M?$|OF~-^mXhhW%QqzofxG%#o`4A?IxiA<-N|+dP?GY?hUss9!heO%($f z&Jgj-hY*1Ldrtf;h>c#wzO$%}{Y^FX@Nab*&Q?)ig18z$Dh!DF>P?py`HoBP9Ijk$ z&@$9AVME%g<LR01f{thV9HyAAm?_kt1w9btkbv{I<ys`#W&N>gl77wTKR=iM-Dm#q zuCr+j(Nhzkue=vKe=owrUu{hIpv3d#UZ$fCa>Tq^5X#aw(@OD;8ktRZ{+i>;cFn?- zw{*<HFQnGk<H3gG?>4a&+<Uy{v+aBCJtvwodxKZhlbnv!L0V5CHbrQ~VbVMXnG#QC z4W)<m0u)*m(*@U2Vgw@%q;Dbgy3MpVVdeBHw??w6^swT?TE(Ta?U71$F4KP-kmNc2 zSZEjQ`>5_*_Rtc@R7HEL5fNp86#16IZ|6P&hX}hSkcevwOS2K;y5am;Y!msUiLPuu z+IjV3o?1_K&_TWJX;^h^RI6u;a`83#h(9L+E%nCSm;E2Q%t%wX&n<sQL|D-m&cFUI zFF^B;YwoLVrhIX&Mp6phatf3>_C)(KC~w&W*<pD1hmKt&te_T(SNIRt$u{T0c2_%f znQIrNSozxNoFP_NhgJtX3@=>?8mrkP9j#p}GE(b_Yk4+j^iWQg0qbQ{n4iX5DgX$O zXlK8hNu8RDKfM!MuJda{_WWk&_mf0NH1U*7GHBzl+h64Mmu*6vINGGKV^ivhtX(31 zUJ;C)@w&N1pFMo3N%oK-es%oZ5M<J9BoXZ}#e(Irh>z^En-tu!DNc1U_IW?&cWtMg zw7#1?gqCe!bo`uuC){l;rlrsR%SBtg0^d*fy64*A@w47juOMv~-#Y}5!7cYY9d>sS zKK=;R&Esb9k{67Y^>UwVl&y)7ei<~&`~Z0G^LgwVc;@Mo^EFSRArq5r+k2@U519*P z)(2;Dn}{tr?-$=g?iUGdIUO+ZSgj<M1?c1cjsgU1k@Le+qyc!%f6bwgbDW-3Pyl%5 zKnRLUO?C2y#hC>N;JzH=U#a}r0BODAIDy=Xcvk5g?(u*sd~#So_PF{Y(trtUdTWZb z)p8T1+Nf=i!?!XTcb=p~=d*7Zamv5qAB&nt;OB23*fAg22brnPYFKgAZvfk}E8Gzf z0|9q2K!*#1KV9%UZJy(w58v9ql|8(j6r0!BMY&CIx#`1z(ox3;acQOb4R_N{v|*h! zp*lKDK>4FALFiPBBNR``&a&w72YMf}lI2*|Qb;m!6~1Yh4qZV4>i!^H;FCuqA_;>r zu^W;Rt3QV>2i}8+&qAC>*SLkd|J5nz=|b|Ce*2IP;fkOLezRpam6)cR<hQQJVMLo? zkt{|8-C6rP9a>|&BDF&_C~K~iD6grCPwy7!>QeEBri{LUR+iJ9Cc%k27_X%xvzdik z$F^9n`J!RWw8}#}MUq>5zOXK(6WaJf$gwd{!+T(Me?O=1_(GA2e)M6;DvqV@8R#q& zev?W{l;y)%<X?&=^mM{ufA;*+Q0r$d$UmSz+^MlhOr}>+#s1T~wWXNjo+vR}f_6Ae zMt<V2%9*$vWSgN?4C+>e78C{?MCjaxi6$nIq;CGv6y3bayuK3knQfKGXde>tjJQ55 z-<lth?POLUw&6R}3hA9}r+DaoG`n2#xz*Dvu^>4Azm9icL~R?Gjz~b&oZyyhW0bX* z&y}2lkvr7F-?&A_2PJ<z6k55j)US}DG%!7TVGH{X8SfOPJ?5@6C<^XjCH(#Hmpd9> zKjdiU8s-wZBusMcARzOXiZzXPOAAye_xt$8F|qPmo35rABgg74zopukt2Tgl+EBOw z;ylYx<LY2S;jAl@f%)A{j>Exd)rw5=PG*SPl>bYzo4f0+{@-Y)AK{cgHil5Ne1p$~ zG8%`iF=1&)H0%S4kz>E7m@`99bg2e3*EimACW#z%C%m#-N?0nEW#f6szFCbJpd>3i z^~W}VlXj<S$cAxTgIa%%ZY|75-E?Pace*`4RJ?`^n~Nsyz@Q8>%tJvXef>C)*5w$c z^j5rEjv}S5TUPZxUwR&Cv)uePN*r|e2JoaSV*Nr+92e#n5*IZDj%j=Cx=zo_FEqpa zEw}8~(k0c1U*$4Zum1=;(pQ+w#T6)2>}-=nL?<ZN3Y`|<p~A1e`DOazqK*(%8?Neg zJDJDkYhgBQL+xm{>go>t@~o*kH(qE~8?v$N`ohKD*yqrK`$=_VX3lw8J|oW1Buo!C zAJFf^p}E6f&<K$x4O}_2tlv2yjn)EG%sI5*`J*)if{1kAU!dl?KlOOHxL<uFj$tz9 zd*MMig5!E~`Z{jy9)HplKvb4~m;^PGdeStFKc8Bib9|QN2O|M>zIyu<^LEns14eG2 z5Fqlx90AZrtnRa%6QM?K$|co1PCC|5n{W$X@qHd^Bh1QaI5>zCQQ5Wp3BaQPW4`AP z2H#i8L>IS=GR<um2t{!GReK*Ahu$9#p4KotE3men3vV@BqPErMs#nhKbZ@a1Y&FwM z1?-PY>h?b@5-auB<`)H~-&7)I#sk$R3&z!HuF|+>mI(l3`^9wCYALNr61DM8nN>QB zu&EiT?`;Qq8?7aZ+A&la$~?W32Q1c7Yn|9m6C>9bzz*%FMw&}YHK^rSkS*iFihMU% zx{aIdj|S9ra^M?<>L8U=>R3kly?NmgF}2*>w3T`!TmzB)tNfAgh)6unD85KCiau)O zh{~VN*j*d!*9c@=YK8)J5E!*UCL7lv4WPeY2VaHqbe~a$K><3YA^(ZJ<xPHO=T7=O zGlWWA+C}~^S>=LSePaf<(&yq0Vwec%u-rfWTW2QB^nH9;9tLBobKxVOD3kd_$r@g& ze_kIY40R@=3Wj6da7CaKMu?Kcg>^Yfs+KrXdh_8<wIH4M?bq+7rKqVlEW{<;6l!)m zg#>Z5Bm`#uJkfhJe-_~ZYQinIlX{wm7ubY1YW>kelT~>>qZvKc_#A2m310BXr8=*8 zl#&?JlNNA>iRrp~a<pY+9qiJh>bF~FA7rTqXxDg4oMW-o%DcDJ@P_E0^-y39d+HHD z3itrlS-#(O?wRE(WHqjmG=SHJa1Ma)a_^0=#}>}z(CAkDa&Ki4Y<%{4hPe=>Ki%b{ zl!4afn$PRH?$2`_mD)L?!GD$Pe|=cC?H?YLK;VLdSx@s$aT)%DQ=q|LjRq`zB`b7f z=Z7gPXWvni%6Ym7d(-=@QG=g0J3<22Gh*O|MUT5Q=Y+s7wEYcde4a}v?CpN@<gcHx z#gAmNC0{Bvbe&PKZs+SP_w+O%X-2|NN6Xk+`Yred#(@?&9x#xKq&H7UThL%gyxJ6> z@~*;Dy+yZBjd{&-p(E{F7F0+Q`0TP0?bKDG|ImAu$;kWL03JnE(3S}Hjv9Gog!SU~ zbaZ&ULH;~s#D5|UCYFiSPnaywB#+59sxrMee%g?f#QVqg!=ToA@)D%RlE<x6f(5TU zA{Wj9%$cRIHI_CutfjLNM+6H{B9-Pm8hTL4s@}C#FlxwcHRGqUDC@Omo6Gx04T_n8 z`TMcBJkjqrt03X#s=GnwdU#je7H5n=2aG(Ikrshx!maNLws}>&NhDcW$<8N&CNbF8 ziY%i-9;AYT%PdFGO&zhh(>CKqd?1QgNb;u<PnYwo9pulb<o#^P-Lz>g$qy`m<MT_x zOk0!SA!1qG`M$q11yW?O^uAl`H_0-k^i!@-23v7#-1Ew+qjL3XmcV<iknqU0X_0B^ zm&Hv;A|d{s|2*&LIk{n((^eu<dw2H+>+e@=PD<)#H~k>HEb`Ii4vrVQYZGLzU`#yD zw2f4UoPJ5uat50Yn@(YS_q58W;K}w_=yQS222N=;>*2=<=DW%_QCPaUcVhE&)K5Gh z_;5fsUdz;Zd~=o<@)o?}`@^2Xws?q(S?Ly_FAgF>9+>0@ux{yhpII}M6xgOMWu&7b z#sx=BcG5%BfWf|y?k81j^mNVpS-Tf|ob**yQ%4BGCk+5X#H5DVwjZiyaSyYnpE)Nw z7iIw$g6%%o9i?O%BkA=>DxYZX34>>Hd}jYVAz$QAbY7Et*HbL~LbsQP)8|N9QnR(f zgjJI=#0swjyheChjw)s0B4>Qjh(C#{#}H)2)90wNMK$TzM4F;E5=h4wZT?+azp$uc zCewA59O;8W#}rQf8iBt+{ezOu<V!Xd&Vim>T!(0XCpVFAp#%U~gAHsNC?XH8@`^{l z_j|+6T=y1QZRb~GTQmO8ImC~p8R`)!9&YWiYiK$>kXG~^>M0XP-c*8vo3$$F-iG`O zHnBZ`dmXP&KlCU*kr|`*=&P03sZ2?Ntzys{0h={G33GY=_2gyGPK}333GXliT5;}; z6l$}IW=rqzH?NOZC~9^_u$%g$M1vtxY|s(k>eI$%2~~oJfw>!Ljuni7ITD1MKW{IT z&Vwc~0~G1_+iiQxuw^PW8EzxV%e0&(9X|#?OZKHE&ZIC?l%BfgZ#_>n&%@`DBuSL+ z)RCY1R7da(E9HKVv~?0vm1BV@ZOnN3RG*;3gBksQA@=`Ko9JvvXJ`yPM74u}GD19@ zn|WPpAEFF=mt#nt9o2scQPxQHhV^Wny?eFokA;-hZwURzCg6WhX#eke!0)&c00MJ8 ziC*SIgq|#ZYH~?i`CbsnzzWkjybSfyhvW~WJ!(u}n5+v9ou~SECM4TmYYQ8E&lnq? zbSh(|<u=}pY)f}P!*z&5Pv!q*fJ&TSya9Ybpe+R*Yr;5!z}hVM5zQIQGDE1_-bDWL zxiZxqsgR7KMQWhIYMH?%cnYWKv!lmif|p;xlK%nh(NNWE_hF-@db}AQ>;jZ&31nhq zj0HQUK3}mbqEwPtB#aR0|4jmgaD!=`2hN6aq*x&-M6x6)wylnR_`K9VHkJvp<XW9g z|IX5x@7$tgX^99oINk50(tHwGzL15O0&bkJnkPmo3ClFUjs)qt^~Yg20wpJecJARx zQd-ij48;&9?|(qIx3IkSW(J^iMd<oZE!jBVl;4M2|As8=erp<so_3KcEmQI!bCycr ztzJ$l>Mk;RIZ`9Y6%l$m);1hJpnh${<iD@Jn-Y0kI$dus-p0&pO_G+2<~%q+`3~d` zA;}Vl+U}RdnTwj2a(wcFrtzUTq1lxwKZ(|f`MZD}x^|4RzO4Vt;pFBQQzpgTmG$pK z{VcoB{%)`y2z!f60^sBg<_Hq26DPPWDqAU19mirT$~f@Br>ik9C##W)SE*~Y;`U@5 z88Xui=i5^7wf1*qfJ>Z8Rm;4l%lXv#+Ke-k4N|glQkzf*Tg&Y$#bTt($a2R^{kHo} zzf<y+`acpqIPb}w`>3~i==~yOUC{dlz2I}VAdfidY~2?G$nI_7j&PSY<^}{Jq3Cq< z4A|E4ddkHzoqoUBIBx<DiZt;?5D_FJ7OGpE6Ssc?R8gUMA=tvk@}UKZFE99lSUr6$ z>3#O{^pdbdEup~03H4UZ*12O1RmJ2RM&^Eu*Gwb%>I=-xtBdC2f5q>3*^RO)sa{Jz zPVe3E0hW;VLGgdMXr6<W165&8K8$ip2wd=GKZJ5C=i!gzO1xX_>(1Vmun$A?7K>rN z=C_P0yq6G}82au@zq_XnK72gN-_oX5n-#Pt&q4!b7?~NeR`EN0c#2T6^^hsy%>I?~ zYV%4}@3yg|j<9RgkfR-*z3liyyz<&~`*vLKYot)nh~>brtGB7FUDc_l`rT(7tZg=I z;$!HIrp=fg1Hz_C_nrrr@4SV9K525knYG;m`-tSMjgLRr+Fv%8Vf&98lVfWBa~lOt zmIqFBwt7Df%3UfmFd#-JH*UPj-mu8|vV<Z}c6MK1+A8uc1oI;H-deL?^})mSd_Y<0 z=cdw?39!5^KGehiTs(}49kmtsp<2P12$4g2s*}E4Iz5=2ec8zKXr)N4B-hDPM_aXt zpz%;qC^8~u|En(N3P=2)++jJl%G{<Y)MB}N*0-oViZDqZRr`eCO>+GWRtL?NrHa%T z%^yMY1l!Xkav$^~A6Pvk<q`?0V<pgo2)RYyib+UHg^2M96VdT?h^O2Pa79^w;J6c2 z7F8in2<~6b>f;lx8#(G49!!rY-gspiw3SbBRx{bYw(mX5nohBUZ26G!)<n&QGAme& z15RY!=@Svo8ymTBt?=3V+WSqmUbxIw=fB#fe=qWoz5ro;kDY@3@#Z^QtgVip<4x@; zrm?`<3ZEi>qEgw?7>@_OXjw-zyEk7~Gn9z-dE6yn#fIy|-ZMs;=HHiPXOALZgwF+W zlq!je<w+?lb_9PBlAZyzA+*AJ|7i*(=x4bZnHxaJX<a63F>C;jwG1S&S-tNHh>ck- zvOT^$T|$(h!RW*kA7iA*5kYE}>;768Nm>~^SNonl>urI1IUJoTHetrAv?Vb--k?Mp zB8urj5UU1PijIetA*EK7_nMlOpWZUo5>$vKjy@2VCB1>=!*RJLI{qiwyVe9KI+@k- z6I%{GfS7(5BKhua<zaQmdFNv*%5DSy`<v=l&gR4<4sem@gP1>iVk9KOQk#aNWq?o@ zfxheqqv>Yub9^#SB?P1kEFxsxxa&aQbkG^M8;q$+cz@eE;Xq^5d59{p&0D@tMzA_7 za8Px3RU&QP@G6S=FO7M9MuWDbPGC*0p|nKDy1jR2<QDgHt@Z*jiw%h`+r$Cq+d(uM zg8X`mz~^adkJPasp@Zbh(V7BTWRVGQW7-mxEx)X~cCH)Lh#pMgZl(X}P3iB1J0K{Y z$rf&vWcnfPqNc*jkJt0-%BZ*<3o_j5<I0QFI^V^%`r1Dh2+sk1fIAKq>mu>AQ*uBd zN|FfWf4K;P{H|}w{Wd`_q;D60wg+e@iC&7JVdYqEi}Cak^s{Q7U9dZZXW@`tW6jR7 z&23Y?kDK+f>Fdg#XWuuHSTvH*NH^rhx=rN)c&WZXH9%Dc4S|2AI|zeaek>>7A}7Br z_>%uo;y_Uw3n1CM))D$4iZ=fh4_U4i6H}oO0q^H|ot;beJCcYyqPu~aQ_bC-?U}i} zHV#BPs)(7(IE-M-aLoUF4fKV~Re!Mof`#`s$SdU_z`WI$h49DfCTZ9v)K@KXZ}}hF zL=42~>CpdVbZ4Of7;{xeDY;91tsU&`UsI|B_kQNn%+@9xQ?a213EDa>Q5^_q-O2%Y z)ePd`lH?2GerXkN6cTj`B%j+1yJ+FEdoMC0AT^!49Ri4eVCDuz1UvsGJqka?VP4B1 z*Mzlpu@GVx+bpJCvwuBT7smfkk3Bj)9sA$Kje21iI1G(9o;-AoOvS&vr}cMAq|5n| zM;KVnUPD_QgKcw{^weQ2aMb&fv&s1)k!Qc@88gS1s<?|Knw<qN_a87O<#E487{LO{ z;)^<>cSZfuR->$opntGyhAr5t4e)SC7br<>Z%-e2ozQ($r@g;aq0aH?vESDGsvY@p z)Z$?0s4IrRuoRyB#*$M!wlP$ikbTATXD%Vq3Ev%_v;^pPMDnnjX%M=&WHUX2aO^lt zL~tGAaegj4YKpGl$8VFrGQihGeiC_5uME(00@l>93r;e0-{c}ZOL=NFh|X}c(GqEG z9MJrMy1H+pmuTZjXpdVC-}sL@+@30Yo=pjtJaEjZT?76PJH>y~L;=<GH$Q>_7oN{K zpA*qnXB6M;S$leyEor2b$wZB~2_b`A>Dh3Zm+Qu)M;e?!`{Ul&Wkm)Qww1^78vJsw zHJ!VR+jtA`ATyk9H%F2ULUlpZY0NO1CyEnqzcN1|m(rv-(h5qC_5O22VZqutaZGdI zM85!`fLg_*|EOoW&<<U7D&fNQIQ>ATwQ-AOXj2@-fh;iB#KgMNNqC6L`1*}@zO&le zb0AAhJj59W;H?jU-(p^+D$&>9MgGfrQ7>>DM=h<jf$-Fl`V$p$@QCY<8&3@7xtajG z9H8nF?i910p<OHLbbn1q8~WMm)DMI6mTU4WlWlaLBZ9qFpH+0fqn7+Im)4h^5q^b8 z0}s+iU9}f-WxjcSG>mW#MHU-#MuK=xN1k@+K!*t`es`~+6qC(IE3$%-v@9KjnR4L8 z-lR(yCH3(hss@h>#&xh0VrYufbaXsid%<A)GY*%y!_6Y^)m_IvPlt4#F&|2;b`32x zS*JwWF2C`M+0BrHlf0?hLun(E=l$Md1$!XFoqbPlG`f6<-p^WtETP2!9QTW7*_!c{ z^)GE+W$hRUZKV@j9~^Ixb`e&ps93)jlD*(^M^|PqXo62;J7|`Qws+_(VjY|gez*QJ z(M7*W`uRyUY`3K2t=GHMWLye77wcG%N2)A2<j>o&Dbma`RDjmnOy`f^A7e;!izDM6 zs9`naEhFW8>-Em1Ti@GX<_lU#Fxq7gjAZvkS$kF+cNd<~NS=LK#!o+?b)(=RTTG#( z$U)X{$$`~rJE=y#7*GJ-`46KdkqR!Z@7+K=4@d$I@66oK{OQZU>SO8#tvncd=#>D- z0ov{I;tJ7_e9=F)czg?34Qx}Wx?7+=*DPMKK1-x#=O|Mkr{0IxhzIm{`vW~yQ)4J? zxYzvf(U><?$glH;z0J{htFpgpA_2H_XM+7$5CHv{h(qe=Tl<bi+zs5RB_@N$P~bsj zRY@K3{Q^Vfw$foawR%*5RY7DIct}OJc;a-&hA#UwEei;+vV_|(Cs)7(Sb;#oG-ca6 z!A4#|cpDY8>oQIv8p>Fx|5_jUu@pkqYCqrR<Sx?fhl3Yw*2cE3{lTUL*&J#(+?{yD zJrB6s+Qv|2pR@%<zcw)n-@+P2ven@&NM_JIUX~1AambP6bk?W*;8>;_m6eJrgg0q6 zF`BJ?`gl4A@TH>^N~#o}yRov$wQo_uY8V0<M0RpDFBX}YFyur=1sBUpOa+S>YMN2+ z_tt*E{^dwD*JHh9RsL&?%QBP-vhQTOgfv$(jL^QuXD0LxA1a&lhV{5%X8U2CZ_}^X z#KnZGu2li7IrJ)cH<g6tY=wxke_7*{%dI96pKw8IWV<*z%Zd?DfDPdBg7ucV>`C$3 zl_^hzVp90f+_)mi(!M}p(8K38uNOa`$85=zw?yI|mjCO}hLZz@4A7IQL|^5EEZ2_D ziYKhpmY@pra*H#s1X~XbJ8WXXaoBe)13zW_sgsrH3!7bG3WT%QYOXJ?a}6n3L2?XA z-xi@Pm1P#7aI@X3Qrk^gbXP}YzL6jCbQM;|gt}`47cAv7RUP6YLe7kBI23#|4fM); z5w!GEI&!c+IZoHWM;|AERuHHS8vU*PD%DsRcRY8EE3Ew1uWOq?J-pv__ISl?Q(LES zH1KPAQl4F4VAq;)Sy>nGYQka25UEmrw<etGm%xqr@PeL8VeKt#Oz|FCGD{pu&NAG8 zIF86xo}$e&4mu*C>GAL_KotrJ=ru_2z0ZirkH6uB-VpQ$#|0Ct*EqbJ;tuyUWC2WK zTm!BsbU#ElEx{0YWomkO^t8r}&8cqOXDxsHqe<ETZWsQ=dI83CLQ-@!=0mdCfw1ht zcTZ-9I1EYU+nemR3eSnidOx^2gtiz9@;H9<vT#G<b3^4q<7T=^^fDrq|5C*#<pr&! zFHv4NMK?h6eq`{+FD+NG4>7dETCrFMGtBI}G9iE+qlL$iU2XF)zuEL$YefSx!r4=D z3LSNcX8t;&zgEJZ&x(ye6>KkiT=ak=Y)qY{x&Xj?9u2E-?=Hg3iZ1-+hWDs!RdiZe z81qtwX<b>v+CYNR!*UFd3#e#IbtSKi7T6g!UT;^RX{lXZvkVRiye_zmwSFGVOT)qa zHBX$X;xT2?CeFRhTHF!Lz5RZ<{yyi|PH2v4;akrOUxyMV+XJ1FMoIfMtL|x?!N;NG z5%@H$>nMOv0K#M1)lxip>^FUP8DA9YMnwN*4pnJwKCBJ|5Au9<uwm(kZu*5bCa)ZI z1OTT-&MqaTIDM~0%MnEZlmY<%XiREg>F^rV*V3ABHZZ;IlV@KpZ}9Drd#QN`0U(;Z zX)p3edz4zrrY>^^X1W!B4t254^mAieZ#owiHf^e6O_K&Zp1#EUSi}Pt*0{ubnjHgG z)u(p~|3iQ_)}{Pi&9GW-XRSm^?WRefEQEUprD=?(BdNMOzvDNWM*D5;afVdzA_F0N z?QLjZm&PGy<x-jrVobsf1SUsx6Jl-&bQ5=!?qhr>^VR!T*8@iU2-&2?w>EfM7Q7IO z<oFayVEq6m8TfK^oEqRoxahhz7#3SUAs>7TB7h$dzCF;e4kW8kHO45L&=db<#fmZz zzf(>xOG44YDg8e6=lfq<#+tL^Duc-l5jDm3QrR*nZ7ypDH1&3RvY+Mq<oxzll)-!b z@dVEnwV&U|qTlHE)NsXjta}$N5Y<(Q*+vlqrE@-W0m|4_);hnK3Fm*6cBDBf`s`WH zk8vjtOnZ~~Swi&inxjUa{aHmZ5$A?w%VX*-nO_g1GY&<~waOr}I!blt`z8wVP4dBd zoemKd;K7g;+!ztls^~SP#p`?}_Dz@q9w1Dv_A)7cU%ozry@T?9tvVWhK?M-0D0!AL z7Q$3DcUqugx8>|ZHrX{x3(7QKa=0@7YXs7OimuM)>mP}GzQPPK@hvH=S@nb4Qn^cr zueUNrLI#<-ju#ApAJ6u>DuSZjw6jQ%KGvV4T~;^hBV{BCN7*Kv#zl`dS6PaSqSLuq z-q$wXK^^hs(o<HRdi`{?8kzG_E=**yZT)gTXp8}0JyOGT(S6cjsll+#J|4!{!GO(x zdVkIsIcFOe*nh&X;$(@#GgpF-2`k*@ecfP(0#eWLb0G5}8ekTfTFcPiI9XbLCiJIj z3pO37XRz401&MfXCg)am=!`KUPOVY|Tvr8j{IoK+!sFFw51NC1bUqEDEr`xuyXxvf z(Q1e}U+`$sf3_A9E;@%;yv1*(Dy)+y=Hmi%R*%cIn)AM0K5(l3FE0S^Lc~!3B6b5d zXF(0j8O^b*#t#qO{%RA}W9X#Xk?+Ch7F0y;jssF6Zo5$!WCg?^;DZtv9N1#K2}Add z$Fa1tfD-TRhzV)kO6_(sBE4U4siU*3&0&&aCC$;nlV5h;kq5K9d`!tW>G|rR6%xv7 zrs9DXo0Mv@P!-R@la$m%?%B*B^l%4fT$OA_hy1I0D$rh}->X2y(?ZiB_xB;!IcvR; zA7KV`)<0edzafZ^OY!7)Jth<w+!XaOTmS{~1>t@X-ke3#!u4!0CJF&V_doHt;PAut z94n-%wBC#sTJ?8!Qr#nCJaElTrf|GJO7ULyZHm11z$tpNNds6-*kqJcF&a0C<VGtb z9oS>EUOh(86im*rnN|&kh$)u+6V#d~+%4YcW8Ngr7w><8Jbjh<q!x!T0gQ#;4aC%~ zvS`5nc)MvK-^X9E5{sNo)q|=sYfr=9Bsh5i4Ba1QKhs1c`2q_F=77Qw8-TD+2jcXs z5sOUt=nc$k#1sZR+y)+P8DV~W?}6Sy>ews}P})KXauM+VF!mN~aj;v~X5sGc5+pc* z;2I=21czXSyK92G6WlEjAW*mz4u!jWaCe8`F!fG%PfwroUDNXqC@y$v@3q&umkvSM zcQz(d-KL_T&G4)k8cCBQ9Mm&~;JmFB>up^_bU^v^SFpKOt+MvKz_0XWL7c7I?19&3 zm<_s1vXKr3Kz4c1=b)*00UAU5+3Zo7@N6-%zd-v1bDEYPyXRh}E#4}W9$&|N=`Yi< z*Rk6{SOQAXM`k18|83Cz&y8Y3p$IV5x&31_S&Xg4aBVyrs}_3Ej~N_YOnhzN>Ogo* zL+lIe4WPk{wF#B{fkXSKjZmgSA@d^*=D@~@DDbL6-@glY2BOQTI?NboNbm`3bnL!9 z=XbxIq!)KFJD)DhHFixYL6f%T7r%a0LwM;4of{g0cBq)6-@hPJQ*v*ZB9FmCaBs7> zt=+m;CRt`hp!?%i)8WG-(PfV?NTI|=BNrz$nZv{eo&Q_?bmjY>Q9o4Ll+LslsIUq( z!uGClHHeXGhS|#N6ay6TU$UYijNpseU^t04Z+g+O#_<Va_7nUN0ED6Dr4wg(-dYiG zEPZP$Q<5fX<jX9*0>(L)esc|fJ>Py1NiN-E{eN1u|HBv=q!9qK!7|TAATtvyG-OBU z#Iyw4s1WzTbV)gY>2SmUqsee_v9{t<^vK{vuCLe$Q@7HTI;WFzIO4b;j!45JrvJTA zqu=?@xM-FDQ=>B2Frx!@G43xl2w{b+?y>4O&Ny<8r$T)#1JLb7{z6UDy4r237J0cJ zd>WZ59naUpthaFmY@Gl@Fy<Syf4B5gcs1q)vT@Fv9PqAmLfPLjOJt67F{tQmw(Dk0 z2(7|YufGG#F65L`aL`Yl#Lpe<8W&mII`k{-pq9<Mm4o|Kd+!qE)}L&gIpOv?cp*-1 zZPuG8RJK9rRg^wgKmVGEpby*f32cGgpJ;Xw`V-%CYypj%zA_6plp8;rCXHot!++d! z&0^?>hE8@YKaI-k0lnTqy_A-%k_WA|5hv(joi4V88<U0Sl=nj;Sqq&Fg_G>6eEi9{ zN1s<SUC3#3<wMUohJ;<;ro)_!Q+C$&rW!p6Qal}mGH2Lh<&?gX<$|I~3j`jsljm3P zbiNtaW?wCP59Q)JN|@2t#k#6UjDx(h-S4`b8u~Sb_Yd2}X=Bdru^D#`=2!ca<zO4- zMpn@Eb?7rIb<Wt2zqV8x>Y6*q;u7PA+S1#RQ~A1T*C^!{G~FCvq8N(6dCYjK)jy&T zA|0w!wVQ5CbrmC4llVWuty~w4dEsSffQ~WQuBOe@Vh1R6UW~tuT+F#CA-z07`=Tc! zx0B2}y8))f=K0U6qq>Px<O=+yly^^e$(??Sts_QlL4=r)AY`D(NFSK{sncVJ<9o?^ zFj@7su5~0#&%B}1>MT0cw>?$&U1(toot@V*D~g-(g==i0!bFCE&_)pIl%KOOO43d( z_IDnH53pXi-Gs{?p~usd*n@|<y)9s~;R9~*wMB$TN~<eifF~ATyNhN<`I$*YHCaX_ zp;VU#348Oz8;;rv6hQEk=4l?*3&^A;os_KIhbp=YAU+3k%@DY+1U+9>>`)d-{H&uH za35R)1-_QG%pnErhxoBz#8~iT(YQJk60v8udI7vseRxppC^<--_)j|h_lfc%WcnUt zUXS*KUgubsoH+mOf63<%AMn!Z`mFbG<tYA^TQ_(ME&di|bdhG%#J*ww$|MXoi3!0* zeh2NmDl@oNFKpfnyV;ZWIT_|dEcqE&ttf4(Nv>%sE3bCSNItUuE22k|rk7N-X|nK& z6bhjmH5<bzFiM$fFHpNIU1R=?eo)kQ^Ij(|kVg@el!el>6SiD2{$)WN>(A{w5~ogP zOM@gG=HJAU{y0WO-C-#6CTX=i;wG97_tl>&CBjiPCfDDK798>mHkYLgt3xNfw#WGI zu%W1h`rLY&m1-RG<R^copNMX%<U=PIqG2_47u{h=V6fuY-6GU0w$NYm5E&pjXG<`b zOQ@G!zJFi!qN%9X4V?TavY#7}#~1OsMBdKcRwmbaKqgFw4@v)<))R<O2AzVmi%kDt zM(dm)5(aXmWrSvmZgji|YvwIt1svGMY=M5zG{*Iy+s^IFM67a*z3<z_p<?_ghVY?C zRuCJfox*A|bbkSVbV7{c9Yh?z{&Eu~9ob@Ww>fhtzW}Mx6&x-WQTT2<A?tVwbC$_c z{6sKjb##5mCWO_=*|J--@E0jV^zf7wN2moa6AZD7_mg&a%pPS1LuQnwU-U@oOy^?C z&6!O9a#du00z(u?&!W{5#lrtlf}Y!7!sQS18@K@kC|5|FoB-8;5U?Af7N?Vc*hb#Z zy-=*TkK+$KRheZxXt_pWqAkuc0^GzKe1O$rAleFRc0FJO{-Bpb_?Fs1y}>?EHRkAe zpARaZ0Cwl_ASXB!N*jFdt0JV~RkKmGFf10<<~=1nZf50lj8)pJt+y<f?^2=lsd1dr z*k60cOxV$uVEM#aU4E;I&m=V7iDAuRDCbHPI9$Mg-j|=P_$T!tuPg^XSnCS2ni^cD z8r(Y(CEk&e$-|P-HCN1(_l{GCr_p8=ZfLvoa&Nxs-a#W{{M^{VNVBgjVTR(;-<&qw z^e3?;VZ1%_j$_xa&3J2dGPI#krQopFCF$wI9s=PtMo2N^vR7du#ENNEk+(wtY<sTJ z#SVw4Mdy?xajBjgjW&trhr)T0$$r_2wf1=WGxe7!8gocx>wn}&=($P}QP4lOD{SQE zjq_LP^*<8LW^dHQLGOP@r`p*NZS;#8)1*nd8<<pe5ofX_f7;R;{28mB61jpdh9^%^ zDjkYHZQj*BZ0^}h-fy!%9*aFU_>Cb-O`c!aT{8je-~z5zyh|0oPuFrvfW=-39t{*E zVA)@Nj?B;c<)fDx04H>$v0YXmgvT`t>m`~w9l&{D6r!<rrRA6vF8)@AGR$0E%7ZVG zq4iLexk;q(R)G9W$n7c~Az-AN0kFMEiyPm4v6bj-p@QU;oes+Vwh2153vftpV+ZIX zyc}Is)2R17Y7l8qy;Qi)vTovnm2^btHaUX(d905FSPEOk2il+tf4O{gYsW*%a&EKx zg^;UO%DaE_<UwL9Af?+-XV6;b=u>A#4Oi4_=&s}15PnEF1`5EN{`oGDoF9Y(lKAG^ z5Tf}pUn_hR=VPdB@`AWW!){e~Ko1S)RHxPfTsdmlL+N#?pdi{zH2-&T3e0+pXy9B) z%ebIqT~&|9Rr;@QAie_DZo1won=>NgDY#4>2?KF{Y?X_~h=2rZS;-M7EhT;!7oJ04 zclZL;k=1hyTV!|u@%>8KC;wz&#lpPzLodUI^+oanbvaJ&QnM1si{5`GdH@#oQ!ho3 zZ%37e8Owy(fCOdsb)eF|Ol0%H5<GktcdZ3W3d>EzcFvYYBmWxRIA80x$xgVf>!PiV zb`!_Hg>~xZD9#!mDeC-G^&iCE?r!ZB-@+IHZ~upU%>PuGft$=gk%v4{>#=(ZrFlNB zdTuGtJ|U>O6Fv_;cAZq*F;47A70Yx(ID6m+kkbVCP6fYFCEW$2bHRG{?RG|>zdK+0 zAQ3Pv9sv0n2!DpnP9t7<oDAzV(GA9bpILWSV~!DCU=Tux#%i-#In-2XfGUgwDA}*n z1&U}J<RmO$0d+%c^nlbJX7OiD${B*HhDM$O$MdYa$F`sDb~S(NH?UQ^y^Xsmn0f%- zn5+k)-actV{I{22C9D6_4D>p8iGe2+Rk13XFSMu;^cDzXAc#i1*pQPL{O}j*C%~fy zZgi0);<TggkEe{PRjzUUbGF~)wzfuN^+)+lWk((8OxazABlT#oc5x)l1ATPJ<i07z zoUVAAeNNttK*J?={9>pp{yl-I@>hrUT~Th6>p|Fw75~BOeaaYF|2kVhKRj-+xcbo8 z_eujg(;eEtV$U01`D^+k-rKGI$h;0$2qSJ&7AZoySjwe-+T>DL?RU&rIlkC8yC>1k z_H}Jvc=aW>UeGpKMw{!ZJ4>3Ov&*@>VSQwqc)Vz%>Qa)0v=FtWj+&>M$~TgQ8U_Bl z;l7eoo~qW&zrP~o4ITjQc?s<0z-Dh>z{IR#OE2`^_37uK!sgKmXSJ_lAz3<nnD_Hy zV9zn1W8v8~Hw+N?OqqXXOK-O7%$>{qE_=Xxl}eQJ!Yr6yJ4udbDW=ot1Q57RpFGAt zFBoXs!eTHJSPXSNxvnRkug-cDRfcb0z`O<{b>44PE7UR4-=OiOL7*?H+;>#-dYpVN zaOO8=!^T{JKaHp$8o;kcdqw;Pq2fT8H_h`KWn(0ORNYuyR_$>X0E^Wl>nrWw21QH= zRDmwrM6Iy1Z{X53^|NevKfHrv%<vLz@aq<Mn&=hyYS0G1=>7~5hQjjH(W?vmHQ7@R z+oqCtb?y<Y=Ro`LECBut`KeC9;$b=zKpLGgxubY}Ui}--p;2#b+oZov5wsO^e#fup ztMm<rxemznqmy1Rd?i#9LVY>%_*@Ddc_nO;Y4N&!`ACc`zgd%gn6ODfiHXug;21t{ zv_P;qB8kqB@;Ak)#78M7Z=1-gP`rtAK&cgPk(oT6?^<v1y%aNCdAZ%Qb1Y|Q8~HbL z9v>K%^HrpJ+bCPOeM)7MM$e*ucnfdRap`g#2@s&Z$o9wDE}3o1T}gjFjV0+2hn;t{ zu%5-hUo#&zY_2k@loI)%kbj5la;$t*(GAlWC>x^{TRSEUvUz{Kz(Ft;Lye_Ly>sy; z;*ZUqRzKI}SCTKr&LcLz&C$U)y6u{yoE?v*)K$y@ghky!_Np3n!!2JHAC81Uv{KEg zz6In5IP$lHon=>%;jlx-70ePakoxrO(dNX+gkX#Bn&c^(7!#WZ#vxH!56P!Nu(E3L zd5e9)xG(s~AE0Ef$41S`5=JVu(oBBZlwmjk;>|K++@`DC(e<axrTFx2%K;)rKOV~a z@KFAcw@!S|w};fVl=Ue1|9_`<Z5RdNSHyeJpbbYnP}1VG=jF%RjPRl^PlCfHZ^0)U zLg$!ib9NE&2&Vh#Nptpjgu@0bEGHuUs<>F}e35V!Z?g?_y$y71>cv#3i&}r0_Izo6 zQxhYyz<|S;qjM!;;V+I<i~D$`vEIfA(UZ+Ca1r)ADZ(Iyty)Utay_Yyp?hxHe{-M3 zK9I40?T-jaBLc6Eb1i~{hL(@nlPI7-&*SXrME|E0C#R1I%$pnXJzNqur!E}Ppr8t@ zmv08+nHll@*F5ke((+)xf#?!!FnkzPWYWi@LzoPi#1`X#)+k%(iC7-pAF?4~+Ar4n zLN94UiTgby!~yg*>%;hbDIVp*n-SAjHOrKK8+-k<Z2L1TZeYhu;`N#|e5-SM$DK)9 zF56~90Fs?`Ok0bXh>xdf`a!{5p^zxFYuqu$ZrQ+wiW;}6JsjW|It~kAo=IsfW+C?5 zNDVufobvp1*8bsfuaemXtGL#IdH?JF2j57aEIlZul9S@sxFVhlgMy8C<N<5#FRl2x zod@S1r?+9}1}oTz<2+UTbE8Cjv7Pn4o$FISK#IJ0R^PQUht=+2z;CDClfK&MZRNU2 zAbc;lB*+(5VFkXp9~}sHUf)u~#v#P+#SvyHw)D?`MP6cEqHqJTvMzI;FcFn-mChNG zY?>b>`x`8)lRrD}L0#n9QIK$~i?_c||Coj1Edo$B>yJJ_XjV!B#01E$(_Y2Irdu;P zH&T^H8rWD4GS^(sXV?Gc_%dRHQ{;JeeK;s+J5VX4nA;PqT?pAQ7*h$ax|$Eg>yjJN zzcAyFJ2IFyfa!~qrk_WvshPVkUNsjM>;Rl`TV{b+oGSsEiazr{{cX1jfdM5G+VTtP zehDef6&@)sRieLW0U>ck%!HB{qfYb&f<&nZH`;RoT2T(NiLZS$cmORFo~5i`{>S2- zEy={bnb}Jq(=v=A<It&CL2rkHg;Ck!vLy<OeD=P-w;EeI?(F7#C@(?xvF(Zb7e!r= z+uLlsm)JR*T)OHG+3kw5H7vOeGj;Qizu^I1&Ubtcls?(U8;|l=s{bOdZuI|iXRo}J zx!P43sqZx`w!%3RGPSgffMGyyvg&!#Zf_5g9&uwj(B=_CoGdf&2_u`k;Yj=~sR~~n zyIaNxXS3*ic~cep29AiWnsZpWC6czi;UmRX9kl`yk4Sxh;QvM}zMmyi9bsVvP$ZJf z{U{u0(hN4}ktf=8pESx5>(4F|ZE3m?z~HI<%p>78&;P3~O0{bilcXY%=5$JdrWbiY zFS2;c>djb_1iA$(YB;pC=YMlIH+lG7!cfiBk9G;&M|l$$YJT~<r+j5gh(1`ih*Ejm zq`U45?n{1O9PHD1f08=8sn^S>FpT8rfdvCN%NBh-loH^ldzQl?Z@^l4?CpHG##!R@ ztNB+m)V~MyS=|s=pE};QTAh4gW1=#OmAaL^bJcH*J(wwY&Rv#bE^TgpN+>qkt#Z2$ zV{-Yz_+XZzK~nS4)N(C}e0h1=NxO~ob3*{_-Uko2K=67h7-H~~t-7AA!Hy9kY_W^f z1gkxa3ubHQ_vLu!QDkfA+p6fM)z}uaQGp?dX0VNTKcV2J)H=aeGZOz$#+U+zTr96} z3#_tYOz+krZ{CI~$JjM45#E=1_DQhjo1i`ap%i;(ABfVe(W%)+7C?|E=w~zX8cfFP z$Vhze(=kg6l{`s^WjTQxtoM1zrlFkGA#{!!J&U1UuhQ<M-zdNk>gn}7;Uv7JHEMc) zlu3JLTcJ3PU)};Zhqr!ErvB}J<3+-DO|_BX@NQ${Jb)P4jMHj~sw|IWeMFwG6eajx ze%tq9e4Yd!W1&D_l6T>g-jW#y1*e7Qkc0bJ497E8xA(Zjyou9CB*kfQ>W~$xbVK$b zQCBf2ab&-0?ly`^$$UMzxR!+2>v6bIw}rel4)6OuZ?a>ZmfENBV@41Bh@~(QYphiZ z7y<7?)Sb3AbFV&eNu%$xqj`>$OD(M-c)0d<aGA=L<4{**+=3H$xdzRc5SL#PvF?7% zh*@}bFmAx=1iI4!o8eu4aOf0O{>=AI0AOX?*HTP)7C-}eH|<$u8x}!(iaFVoPgbZ_ zk1Fe_m4{YnYdUA}jK8)YbzZtSroN)+Ja2XErqyY6Uz#TQUm-aoF80|-kebI9R~`vu z55p6u{6eX`I$-h!YF{Rlo;gO3e<~{pM-Y^^x5Ua8QvZH*(0O@UuigPbB)&sqEZW!B zBHs8}WJqYpA`$S)w%endUAGak`7OueWt=?;Twxdf0T)nRi&=RHHMRf%XUC2D0wVYT zC#6~qnK*lhq_z^P)+SF0+OZ@L%!Z<Z`K>rzmE0RG5*{Eo=~dbX0D%@P92!ZfCs!5w z@58;=AS428e1SX+6iq8;m^J)79);?3OG-7^8lS`QEv(M2i`q?k9dYks&Gp{MKkq#B zK<W;^F}0912z#DQC;!eldaln6G7y55fPv#UeEmZa{dQRqyq>{>OZDGA-~UW$28L-u z-<@&3e==jY2GHbvOv=#m(lsCebhzGjfe%N%5vg=DExE9W=)n|1tQi%fBAhl!v#E+Y zQ1BJr-eep1z^FTHcTyp(@~Fr|GwksTt8x(vVxHZNvDKSG=|^Me+GWCgdH5xyB2(rz z-gZ9L=7z|64!NnIroa%ytsPPwWST%HS{;2A6KY#cC>JnGs}Rs?@o6^VAX1H0KLt0j zU9~LpOO1`6m+a4OLIRnL5f#{gUBalzscKLz?$7|tjl?btfaS?Zk5YY8HY;_lQ)&9C zksw2plC*wtf6~}GVIo4}hr3UP@4d$*l%-s>HCeDRSR=x{+up(depn`FtSiU=hEL4# zSdR{Eo9N$^v43A#CA1-r=l+epPeSM6K)8FB#q6NM>x=C4QRR1ObzACKybI0(dIuHy zklU=s=a1Mkw^a_HGgw7oX(BTgzdEyzNS#Z%v3rD0c#iR9a_38zY<hRfIkms+nbJ=k ztkG8JI6<N}aICX;aBZLJb%0~}l_V6)wHOB5*vdxE$$d(!N2DIf2EcYgP#hTHb*b3b zkJlJYae?SHE6F~P$b-Xh>`y2d0uB4;S`+G4Zy96~c<Pss%Oc}}Qp>9sM8M@Z3ns|M z8*I=Um^OM&AT)8NLfj2WFlK$0ewp(<WYl7{vC=xV$>q?dKSxdIu=bSwWtj{urgKo0 z60{4n+?fb?U9t;Q<?b#J6@KpSzf7n&Pt*J4>zVk*?e4}ctMFBi?xycn8^dgVZEaD? zWGpv6|FHLdygkW$5%w;D%?UnCH%?(pd%oPabkm!V2NSxoE9BP+EXsDD>ehQqryLj6 zRk{aiEr&-sT-V+4hDBDo(f2V4eyFu~j2slX=VeL$h*ZrA`LXu-nA(@}^Zr`ykW2sh z0R}*z&^-WGon)Y9q$wVTzBq^{XLqw|?eA)qpiM3WO$^&gP(Nn@4y+9|NOQnUSg-mH z|N2AP@m4$n!%>xnNr2nr`u^aA=oE0iJQ>V~jw0;7RWD`9Xt;9eJXyzoK$_h4J&rU2 zC7`JLj;JKB+5hm)!6E%xy}9^D$E}|gcia<7#}$_Vb(Zx&YP8V?=F*L~k#7C>p`v>Y zZDOE+_VhqJ3<G4R>z&b*n^JoP6e1)mEAVwIndidql`JU-Bz1?qdZR`XU&2NtDqvvu z^vd{VS|*Gk3FI?}V*m4GK`+vQ)>v#swG-Jl!CXoW*-6<_*@2>&vkLCNZ_BLTq9dRV zA1T@9Pugj7^IFR=_cx_~G~r&dCVC{Bh8YI4vF#j;-hXM(ls&;?fRyoYOXE3KDyGa8 z2-t*yVnmilP08i|yk*`v3fp6wK*}(A#7u{92L8^iESDYB!GMN@eLoJ(C*>R0s_Sif zbuU5pGY$2!F+n;SWA2`%-y6~Nex@neMheW4M;8z|5e}r6+cCMNDFnYwJD*ff{p;wZ zJS=o{#QX8Sw+Q<{j?db0|GI3kS|LQdu0A?-xK&#Pp5MxQ9F<!Ma%{Y0<<`_*yoSzj zG#N?15$4pBZjSSMeD-qLAP;K7v9#?io$Q=Mp4!`f0bN61)Uv`4+v~bW8;E)3LZzQ) z@GU`MM(+HEW;jA${j~|KTW)FTq;z@G$OdcjVNi~dEqu$u!cZQGq(e3wW{2gYX|c5_ zpn?41uajc4GJ&o4Qa-nCKg(co=Jhy&MrG#YT{~4zyEi$mGyt4!{!F!>D7G)PNdeWp zP#{7~y6TwTv?WrnWyRm6k1!C%)W9bKb%kI_K)_6%ub)o|HWlhqwHL_eyz_Nx<W%v^ zX6)PlY9kCps0ttmQKt@tCu7K?qM%y6aS&ju_#07pjLlBYQ@8UQg;EEZ-^TCh?BtIl zSLFBIr}={*3S%O1|EnH4b#)kSMYm7b@lz`X84Xx>V&7G+ftGz%yTjTMuH{AIp-T+- z6-@PP2)yTDWNptRj#eg-w(kc+;iNsKrCNGqtfL2+BA*xD%jmB3q7Uq~wr$QuH`@|g zAVG<{O&uGJk;~MnMPI<n(5Tmgy`bHfPEPNOviYcv_nyk_oGpF8J{W5t8zSs$o%NFh zPSQ?Sl<8bzpdj|1X2p)Vg{b@UO)3_&^(h-Lkv0q!fxeIs3upm>TqPshjGuJ7Af?cU z$b$Hu%e?dV4o(859<V9x4)G^~$Z9e90vpnB`-)LR_t(2cCHDw7^9TM8({r;aL>|(Q z4R~=89Sn}s$@`1at0V1eEh!3Q3G<+L<@E@n&)vnBQ;lmZVCj6OKx4D9Oy>%c$Z=7G zg(V@f9s=EhI<xN&i67hPaEbluXpD}MyLkDsM=o2D{GPA&F!0U^|2zeQ&nAV4s#}nZ zfLVgS-wXYovID&v{N`h}oU3Lf$3|lrgloX%gvn{oqEcLY$L4^H+P)WxxIsd9!D4zo z>V}!f=p>T|aO800z-<GKo`(IG7ofgK&OOX(`ZH%~T*C+2K<E*jNDh}c+x00{3bwGl zu+{H&LF}b(0*f30g>~}tl6Y+e=A>unCd_4zjFykLv+dZLQ9$59?LLsZL!mN7oOj#6 zO=7r@1HPF&tz+i=<?<b0RmVMHAk6EG*z;a#QaI;}nr^2CF%S<BCxtT9?_^@$dpw-Z zSP{6&ZIom8lp27-&7Pq+j)Drn)KfWo_)|mWp0^y#5B*bCii6%_#!;aKHWx!2oOm;N zjJ#0gdBM%|gJ8KvZ=WuYsm9V9tvm%lXP`@C0u25-miv;;@5*51P)xV_k|NkwjBvav z0JD*K!!f9XA^c?ik*<8RJn6@Wg@qD#RU1YAI8u}8w!T_8Z0(w*I=+v7bn&Yxy|zgZ z8{wiA8H~%Q6;EaZUOq%&A;3vN-&~d1t&P@aq%Flkg~AO15x?Ud?ui*MFu4h5_58I< zlTor}=&MQRytUt{+(xSY`c`h$`gA8^-dM)k(#K7we_6o-2y_Oa^W;L~;L~09D*WS} zemu(`ru<IiuCQW%->;oq`b05^6*wXw(%)e<Ln<-G^z`z?EOBLxE0qQQBdMUUi6L^0 zh>YN2d5pNxO;=)eU6Xc-Xl##ga-9tGp^M2|zL-MV_gY&0TGm^6ZiB=np@n+)6f%Jp z5;-b!pYhdu+WF<#;yLVkKSNPz*{XRLR_^(6;tzw8nJ`*xsLKQd714zUpIzS<`Ov_2 zUq<rPs$IHIwS=YYv&bnGlq)_N3ICezI~4r=OFWuJmQp2@4p4rCor;MEJOsq3koT3D zMZ^f2mFtg$`dtbTZ#X#ns6N6UtoLm>&D2OL1O=ZZTwPK~Jbzy7BxHH@Dc@g{DL}n6 z`nTWFzfX{eU-DrASt%(NC3w)pn1GA?z4hU5xpNO|k4z7Pl3y!-k)0JQe7z2)TC<Q^ z)1}%IUqr6{_#N`KS{@}U6&F)JTLhXZbm|J7ep8+rc;ig@wfS=<KP+5Zt?D>AZ4;?! zfDszJPYB~EYEwH&zM1U*2qd=Z!K!Zjq*{MWce+bx>o#U67R`bTffM32sw`XJZx8%l zfM<*rbByMfb;OIT0@OFUuW|<?bo8&*21F&5-}f%^!rf!(IzNALR)9Aya~u+&9z~e_ zC8a4r>^1VYhQj-Y{`(#herjUkaR^0X#!&YO>$VPeNMtJFOxKa&d1PxUCweyal?}r0 z^Gu@oA1`)E9ZJ@;6sgJcigGxIN<ARN<7f1M-R)Gkr2LKn&ocoi^AYSo#Y#K)oBTP? zwfnj@&K-uY-Q?4BwJ)C`5es3aqTAH72k|>kYuouj!gM<Y?K`g?mb8!X<@_z%J$Y@l z-^`BB)Q~21;~|{wcJGL^n#hA6ugFG2-OZk$7U=fKYuDOr)IU!VE9xC%oI`H<nRmrs zXIH&CYA;4!E?FGggkP0&srM;^vW<sxx-fW^l36QT!wM#C*G_&v@x~>cg7a>Lo?xqM zn|htRFV%DxIs%$ai(se5S;9%TwxSxQr~@}qgvIGN3DsrS`EwzTCl9wq9rw|<j_uk9 zhU7P_1&AiPFdR89rxHv4KAcZIRp=s1Uy$!+<(jpiGh!aJ`|iBe<;}$gf6|SJePwqb zyjIKyIF-a_w1WF}pfmk>M$GGeb|_fN&19OcCVwg;F}+e30q`!Bo&-oShRYcA+TMqR zWlo8$L}7AydJ~P7+OR8ed=pqj`7)AQcmB`~3&<W8&`Cg$s}ryVM)LWZ<o>PFsF~Md zNm80s)cVHzWJE3x3(0&+k?SEsULLRflaV!b^A8XN%8M+wfFnZP@G2b|QW<4-aHvt} zqc$qDe*;-?7CLw_0h<2qnCi0i%?oDy5wDGWEs$8$#AnAH&x1x~t5`9V$}*+&U8Aa^ zN<}qqXFYHMTAOtykOru&+C*u-(IQ`$#8odBOCx~6OW`3p>>Gz*mt8}`CMx3mvGRPZ z&~X?4BZzj~J<f=Xc#%ui763tqoA?v$^FNP0(1+<as_f%k*26Q+dP6i6iH7^a;==6# z2IAaBi<>`3hhBYv?E`{M-h`+g`JxJ^CBhcdNn2@dKnF&gbv6eS-w=-Jcn*vT9C$e8 zagS@jltNj3eL_D|@2XG$;mxI=TnC3qM=MxWQb_moMcOK3z?x09L(;R@m$8ZJqW#2G z3;=SF;LEv_hFcSjE9Y?`xIq}TY3||oUcS6+_%x4R7OQMHbzFfz4lZqzMdW9^L_l?! z;+%;SS4VLKh#43<QJQRm4PU2({fQ_l1o@{8JUpP)g-jZo%`Vd1M3x-p1r5<_^3~)$ z{|ZYShx3mcWh!P$;Tg9kAD>2Ssz@vcqo>a2MpgO2|J@0#6WFhs&kHC&HgcZzIer<M zv33!-=KMxs5i@N+0TUF;M-vxJ@p>fGcd^|#|3T1}T$k{R5~yWEk@qNweX{|T53Tp( zslWr5#UlZo`SAGYLdE$ns*U?ay=sKiRVl<j2MqTx-QM%>;OuAGGcq1*7gc|1zH6}% zwB#S&LX8sOEeX@+FwxtvUF0TG)#xK61}`t2Q6o&}LWf=n2$|5)?EZ|N2W1!=v^C`v ziwoG-<-oK7H6xe04G)K7Tfi;D79xR+fnqL*i0CWqwGb(8&Pv5)=pmjRqu2)mu{}4u zs`#1O#b8*l`&AzX5jq!bP&Qk9DslRRVZJjh5G8x3y>3YSS|QYV_hrD&eR}OzA(Ri) z@b~@#9`QVu&q~B=6NU=Gjwz^1<39+GWEhB*I&}`AJhqMi)UQA5dc%qa9~1R0EprXm zxY|teX~eDi(j3wkRS$@%@eFk23;2dY2{v>Nx|wq<h<M<=t?zj|jo_DKFlpD+mb6-} z2UI(1RXE_3{t&ZGYZv@7V}zQIa#+80)FL46#2^r<EnT!+*Ng}0%-CbCceZ^xZJN8i z-71buTU#??_}ET#U&K}VSHHwc=mOsFyY6w_9j4EDF?i`r6^&Ov5#m_xf88#zkbeVz zR>;krqtvVnqfUe3;^6183zXEi;*l;!eDxU_{M%ksNpl7NdEGpVZK03@A=GIdsv1S_ zSlAM}vBAl#ivZHLJKuoANNw#09{SGU;|G2Mg=&7V-~AxPx}os8x+)iBUD){<dn~LM zU!KJz052H`fT$vTW`J0^#K3$WyaWRMFKv^?4PGa6e(@?ZE;Kxw4BT|2$h;QspRm*8 zJM3mycv_WeGans-TouxXbSfHrz8^2X(W+wr7IyqJOQWjW%>cx%aZituK@0G1a~>3c zrZ3>=(EL(_ap~_i_U3;+9ED|Tu9``fmHV20XKEw7tmzF=)EUBVWq3i`HcHWggV=Z~ zqc8sQPuM8{0HGSvSA!e7Uk(H)`buy8vfE~uL-FZadzB>3481}s#7!1|1b63!&4g0W zR6rsu_y*k3?=Pkg)^$>~u@ObZ48SZQ4L;<`Ak1DPbhrV6P2Yd{)(3uKb~?I0raF23 zB<hcS1J#HGSTYG-^xTkN`n>yxQ$q}DXNa>I4vp%EdTqCt5g$RO3`x`kVUWR<#t8Oe z7#W^4P;G_M8*RtsisX-cj_}tMo|yh^xm*u0c1HPC*(Rc0ZEc;*ye`13;yWca#TQd+ zgIK4YjX+H)f=bu?aA`Fr1G&%<hR=KWjD){Izqq<ehEuK9m~Y*Co!|y*bTN9B=1UTr z6H>N9csM9DW;#hFv~FjM-aoDPX~`TPnr~qrtovOqnLHhse3&EhL8NRtyuZZr9&T3Y zEB(>C80zi+CR0^^i`jQP`t*PBg8!=qgr*lL007oq?YR6s+j-P(jI&=B`o@67*bh*S zp$S63om228O!&Q<Q9@}$VK`?raA0R_TkB-Y7`ylXY;hvu$ogM1xxGWu;;AfRxY|p; zRVUTt*{=RH=BuEhT51}Z$j_qH1G**U#MuQZ1anSysF!;`6I$$5>0-^f+IgtC2*4=_ z@&@CYrM_mmkMt3IY-Qv8nQMpU<7~4QQ3GTAdLL>O*YW5fz>N>#B1QW!8^G!OghBfF zm&JHPk_>G3&T=CopA<2591<r<M@jQh`o6gG&^fQklBox>u$TNJ;-)6e@QHfR<P&yw zh!ck+0j7g`?!JJuqJN<GLol?uv1{uQq#V=MP9?RqINq-Q4YUG90#0nOby1rK{wN5~ z;S#8N47T=nH+qZ|3MYk)$nob0@bGrn&N4$g=^<=N)3;1v;c6cLBRWsRtU$F&>3!dU z2;kCmRC5i|pPZ7hsI$V<{g$O%SAnr}!75~BVzR#${3%rsIUw66A?=d9RW=$2Klkgr zSMD6HORkUccJIObT@*9{7gD8YUL<MV-(bP19WB1pADle~;@~P>lVq5?5a}noOVt?n zps00YC&>Fc|9m0>r^3q#&3*yCfD7|}KcS*1rjEzjdX|58x>?0~JKN9lZ`qcl%7qw6 z?xf|87YUaHaMx+vziy3k-*G&wjn%Ppe|XEf;E8_dKl|}^RYC@>`qCzElD=W154R~_ zhmGD&e9H-(r4sX*IqIvpE=4Eac)LJ?9>lh=$JA5mn2nnpl>25gW-S746&2cPYC6Pq zI&bm>{=B?jMa>jq9RRaZ5nr^+yn!vhGse-z?Jot7v}?2=BI(ra{noM67IyJ{)ZR^! zo9l^*R7$zudxilnzQF?RtSg<s&}t_lR08sa>>2bMBKq;c!fW_|Q;n3}SSFmz{5_I) z*z144pK*C8-4Jb(GWP!@2E@b*qC3UBY8GYPoY>*{njScouRK;e40e3J5a^&D(=rvx z5GKJ@DDX7>urGNrjtDowSfPu7ccY|LRXi*BCtKLb{)Xr<R&HuY;y45nL9FeVgUs*t zYS(7#<|E--NOVRsc=%jj#hT`JZ^wC2P+7IM@^+uNR@G?ceXJeue+a-gs8ahIUqQyH zpx1XfuL7%YUM!D%j+X2ZF$Mk;(delL>iX>cKS=?_H8yOYiFmLEM#8>TA$s0U$$va# zB!_Z^BHDazb#y4{Ei?%188qI#qnH`>F}&d@v(Z74c>p$74ljz4H=D$pNz~QSeWw>= z`Y2&&j{lv0hIwXncxox!dI%>QbxISJ5BH{u-N2siddjD^GFQSi=>wF&YNtu=!+_z3 zqtqxF+&ZX)*BOzo))y1O^k#!lZ7KRe?T4_2s5J`Xe$h<T@K}-^Cne%f8sw7(HQ!Ka z6PpBIeDn*Gr#k5^&dK#pZ?dnG&Tn5zy}m?9ZoMt9U7f#OS+Y>-<IO~R{u{gdUnfH# z0$~R%5wwIMmIe$%cl213pmhFZeF&DJvuWiLtg~YT#K`-Vyq2|c*-}w@CCkmS__D{e zfzO+7|5?^D1kDjLIv|onZm85t4tVd?yA^zPd5FrtZkBu7k*F7Iw;=7MtPdVP<&otO zFSk5h9OApHTcM$!>wXb;as<D#pgbFc8y%fcm|?*ma<Utbv{TuT1AQj8O){;s<>xI4 z*T$Mhs;~SK%byjkMO}*!b_(8Xlmjo597#QrGUHiyb{jNWpsd4jd|gLW5noR%G}Qy2 z<_PX0>aO@X$J*)v+s))&OT#n6v@v*ZPSb!JP|Szjnkd+HVm1aqcgWWey~i7<VuA*R zauY9(Z%0uRFB;993Ok>>gauZOp@?3MKocCVu~V_<socSdvPdZ9^Y(Hh2xtMg_<MCn zy|XCP>q+9!4ecaQglSQgN|-EQQ6Dt86VUvNB6>8B;C$5{L(EAbSTK41gveS?@D{2d z;Xu<GNnpt8j&II5Ov^Ao>7X4+2MES4P}9|L<>Tx0U#wv$;KJ7PpgS{crW_Ao_ZQky z0(AdT=dfEFb}&$yL~T)G7QMl;OtdljD=BGIn@#(>mZ?TMrq<oJo;y|t*0(ui7X~{$ zwF6w2aUL`bfizSVHb>#XrM5|+no@tW<0-2fI&PXW!`x|8jqJK<b}W57<oN8szV{Y^ zR%OE=bR0VS#K{6D5<CWmc|3Q&nC2vD`Ziu~cluotiM?GQlfd?TBBDqe=KVG=u#ULT zO5t{%-5KmKwtUWmNxu4Ux!zWPxohN0gXoAu(M~&~i0rr_#+&}sj)a((jWp*2D+=+y z8QV4r5rsI&gQ-8He8hy(UY-7G!2gn`Wz=Wxy-OCkG2Bcj9hX7)?Xt3^KLLIouk$_^ zxM~!!T$ijbwph77Db`}l;j#1_XEt`s6Ua#_7=sc-WF+MqtWx!Ppye3XW&snqKbtE7 z0he4B#NnclJ;g0zfIj;>Kl88EumRj`nj;e#L(z$NT2)K`_w=I(1r%0bzC{1Sfehp! z*;tC7g^EmcFIlXOn6=0JTFvAk)mEP-5atv0X#x6mz0pBlrgRr}*2lpeDHc+Cb%)t8 zr4lBb7v%?4Q8`TomLr6{jwh4Z0H?8X#T#vzFAH(G<f6V|!x9_|qcr7B2=9tTArMd2 z?_1!X1IN8PlK(a|IB60<4b`?IJ>2;;pWa$1+x$5qSlghy`smZPi{xXD_quYM)3BOe zc<6SJcAG_8zk)wDjomNfaj2kd9K7Is7KOLWZD&^@4W6>ZKe4ovItmTR-8}1AbY5eH z#)K}}#ipMh$~rZhORZAU>#!~oSsfBz=~M4b4vcun^Vs&~-DBA_=4v9q70|%kR}KGX zo`J_Q<P^GJp@r#}^i#NlA6+z^XI=5BJC39Sxm-TU$CmheeGZ{TmQ9tM(qd`&jeO>5 z?Szc(WOU^Ac<^&sPmBy#2JyL2#sl6&ej{1z)%JKn!SC4r1=Pt$I+XQqAOGKJ92kWV zdRU0XlSHrca&8aMZkkiD$Ij8oElNtM3$5tDoAx~h_$g7!U>tuwMMS7rRIGh>Rr1(q zmG|#F6x>luJ3}V!6Ur5qTq>E&gu{@pxU_IHJS?`pLVLIO;cyKd6}jW{G-N5%+w~u6 zHMMb{2O@Z%<uD~my9QzHo>G8!`_Ip{gb@;mDxoj|%-25XXh!nt;V7vdq%B{Akp5%y zv~6LcjE6~lsUc~dVUb|>6unc)jka}$1M=EBteLo;s8eeO#qkT_ghbksHyTxMJ^t0} zJ@veW9+?Il9S@9{aPeY+8^Y+TExsG#)Y3!Tydi<=&<i>pL3{xd1Tuf2?O>1GeZic^ zpe^Fv;4rc{FA_ch{Di$yyyJ<XmE%;Gx;v!F_-xe`)OV{QVXlH|xq-2LP6$LpM=x!b ztapphN6Qdv#dQC$=ZkNd`*p3wLE8VFiMRVBT=mv}WjyvFW6<hI%mnG>cM3Z$k#>R5 zHCLN7ASf(pA4((=h8l(nwk(DWaZl*8Eue?8+%67mmrQ#<ursmrQUTw5XLFtSTC)MH zIMcYwRk^ac!7*$x2f=l$mxT@L3)G^W^64jwU2ACywI#yvmZdOMPIC0xO+-YHH&%<S zyWG8OyoOpbnS;{%`ckZG^?%3$mmoX_^A|6iD-Lv?x+^N5*Izdn#nMXX6CiMW#3;}G zxkfL$(VaSCHK575bXlO&xDHvjLXm#S7j`kx^ruZYNtLw~!~KqyNlg2-yCMIV)?5F# zE@P^kh6CQ`umnb$F9Tb5L`DARU0GUe4j^^QD;PvLbSj`?MK8Y6Xqe(CgOXZD3V#&L zyj(TQ4+LBf5o?T-+=oYv<wmIm>IaK$kW8}B1Pt7(zrovcfaf5_RYc~vKr<l{BG~;1 zs%mq+k27?IwuI|Y0Wc|?HOGR#!9adLA98C1|D&wVEl_>GAVdw!on)Od%IqzJ*)Va# z4`hHVXCx_f__L5ksx|@x-On^7=z+dagAq4iT5M#bH^7%_Lf_;%fo15UVpcYae$s1E zn8uwG`T)WW$W>ea{no-~4?J0?F{>Jeal#VHK*4Bv=BD)U_()KZL*h<Xw6uSc0KUR4 zd-l$5xvT6}$IvK_iz>Pk#SM`zQ|I~)imS5A?IRBwf!%7y!6kvh>r~>JV>O%8Snihi zzwC4y%uM1p=Vbqc%LqtdZnUR6Gh98cWAZWDqCH4^reTRU;_r*5gd{lOBc?jP|0)NS zNtEgP+X8xsZy~k|;?baX|1rCwJ4gDCQWWVVQ~tUy?PMU_Q_=*@kEZ&iN0L1shLvKi zkNnGE-z&p*@!%bOA1pr%RY@5ZHggz=&~-=7ZSTlf8C2TWul*gH!U*r8-L9y;R)&)$ zY$vKQY1+n_>2|3JsQwdCo9tgmJNm2%pHgC@U{_vYLjXd|c$A+e&cQB@$`zt!F)IE< z-Ub6OC33#-LJOa5?IYkrfI@_dOkA2pmMp2xu}h{IMfJ4q@8jkt)Qs?pJ&-S162$Cc z5j@|fei&LG8)(d7uKll$>i_~PY=lYxpj=NLIh9tmF-U4G5?zsJ86Fual25i%ok6wg z>>G}1@pd8?MZ6bEb_V_4j>VvD95Nn1H_~)Qb6!qHm4p9iqIW2);3*=!T~9knH7z?{ z6Q4{PN>5bXZ%@tOcLRHOSb5`!x~!G~l?ef<!9wXoojzv{lqY3Z{4Hhf+oSuX0XH5D z%cn!!O7+yRtB998boPO4jN)R@+^cX=8%`lfqY;OTdD=e@6gchb1a@V}>B*P#?nF%I zc}Md0A~BRh1sTq9Nfdf8+iZK^=z#<YkhI)ja6tsGCfnjMePw@sJ88F$Cm+ZtJ|y{O zxq27ajX?>Jm7t}Ml2L#~c0Z4+pvEmgwFiUE^zIfFt18U6SG{9y(<@?^UYAY}sf0@E zi*v+U@muX<({vD`%<!l~3sH$+@MTxp5b#l{&sxi_A{OtiIl5=KxmZAeAT#qzv{d?c z!p}Y;v|PfQKRS<z=D@+bC+C>zlGkOt)eiv*(AG8#DGr?g&w%$@Igka^z1j`h^1PuS z1UT=wwkB(<<-r7QJVQ!O&Ljx6EYCTGGmsH9we_p9Md<dTJ1*6%{zLK6y9X+^({h?A zW-a%V>4sCP?C;js7a(s;y!avLF>}xujXc^KRZvaxhIMg-i0_<u&Ho}KO>4|x=i~C? zFwm8ibZi@;BmUjH`CWqs2{-j<UJR^Qa#A+BPf3q#uxZEzETpc^<}IXi4nJ)2>r)SU zId?`Ec^z7aCC4G>w&=^4t0s?KT*AUG2O-0dlUal>QBP<XF>oGk4DHA(=6Sh!-}kzt zdBO#;U|sx7kNYW*YV9+j`qf;Qg0S>@7%|gA6C<YpWoL~$@NUz`n<@d~B(JhyE1vVb z>EH7EYzb*kL|2IJA~l%m<!ZMP@s51hgG19GS_7|xedaKoJJ-|yBggf1_+uF{Y#Jv- zwLAt#f16O7pB}D!JA^f;3&0IHIVvqo)4WT#M3OnCRF%^A1i2xifdFuZ&aZEJT8jvP zbTG2W=@Ds7wxoGxP0fcy`6oQpPj4nYLcf&{9d)|LM9r{kqTrke0E?ps7-f5wqc<Fw z#DIQG71DVjzlP;jYsd(oI`lQMm>WKz*@PDmqqc>@jgrQ!uKeagKrsSOT>8v=CGavt zP<a5bGYN!2d>jeagpw?QKkaf|nQs=V40YFOk+Pn4t-{`7f=k$!nO)ipNpS5-K<Odx zRuEr~`TdNDTUUI}cx!)Nbt1pm8qs)|8Z1kqFqWfPhV?qiUXj2;b`Lo8UTOLE{FK1E zfNBF1WJIt^23jG_YD50@X6w^D`+=7ZaN~>r(9ie(vslf^k^p(C6WWked<1;(mNdT* zz>$NyM0kwuVt8%Si4hec^_~_NC)>Z`Pxka$ucQgT2UL4t^)F3Y0&WB&!e}tfHDPdz zLo#1)U8_g9Jh~WM>%6pfnJ;DK`Fbfe5qL^wG%)Pl6az&IL7w-MudF10XxVnjq*y`& zN07Sw6e-4@^$XRXW?9ac8{i+KF**~{)rM_D6ADSP9+r+YRxVr~)3%Ni`D;s2xKQSn zph9C@L!90hrJU#-vAhj*m>WW@;6M*#&b>_6J>JLY_z-CmSDfEuui|f+HbS}bGMa@h zM`)#wLmh(|p+|Ip4F`9yWX?HLc4eni?e*issIL28ei#U}o#o#0?a*_~K;rFD<lP${ z!v9hToWF<P1m%pbdW~qf_9}TKl`?!0eD2%yB#r+)9K5-Pb*@n1U9RWDbADgclRg7B z2v;_WYAR*NvO~EIVo=QfwL6MV%n#m-44pgOJM+4wlYEbTujWAIbG!;k!}Z07L~VF* z;^nZxX!k!Y1bhb33l<c&E+W<QI#4abi=(lMSY$&NNa3!7zma?T0W1R5H@2y*FJdjn zLo&9bC>6!tmSHIzei-e(gSRid%bMg9;x!1lKSNvvNI7&1>;vyo7GaOQ_4WMWS_5u9 zUskGL=Q%G9Y?nQ3iTPo1C+KmT4$#YCXhumRu$lg3>3V9*REUT1_-0I(;ptQZ83|bj z-+y(N@LxDUKr2W$fX@;%tOhp!srHb&y{oT5(*{#8UR!Rl)u~pM2DjwoJ?;LN7l3$_ z@;iw~Eo8Y+IgWZ7HaiecdqU~eQDwf~?dLGonb7OXvEC3aNo8F?ulU4cn+X@?493L% zJcq-gljHtLXSHw1l9HrTrhC_znycV%s?CpNJ-$)qtPux>GbHE!KtH98v_EyEzyD4` zDucgWjoZ`f0l%b~xsfyG*CWQpJ)oKme)HP7K;c73P8J0HRPuH%fwgM|r)h71E_cTy zt4^LEwujDof&}_G#!VC|7F!8flt0H+I0l8UPyaOGpY9{p)S79&7=kMn7z1nEBxqA& zq!}+^<40cIRQHxNeR-UtQ^ZEQev7^J&ujnnJ?O?G{@l=XIB81U3H%NeeY$zx;a)eq z-<i%NX+uAIyLj{49a|6+KE7ptXL_V)`jM0ka><i-dafn*_8LW{#RU&00glEhb|W>p z!3`<vaT3f77(B$20OQWjXHYBx+JVJ;(v446e}zg4?!0d+Y`WT;?o64Nd0t<yK*4B^ z=y+V^d{BJJ<9p%2he@AewS<0#&U<TU18p=v0YEX^hBIYW%E1;bg+%ltz{yo)@+*}E zk83ED#yL&OB<Wu&KyFN{fTC0u566jXA}Is{KnM<v#yKl5t=F)oI*WU0Uq)R1B-hE5 z;ky_L%ROu?BkB<#^1}lrvR@lwT_qpL2JtraVah_*pzoQ7%P80W2nOYdW@0*e4L6?4 z0(K`o%81$;F5<I!ey7K+S7$s2$o$){Ly2O90Lg=Mjg=|`Wp~8I-g0EP@WK5SsfF(G z^Gf{-l?^Om1NEJ@e|g2IQCBiyd0)KWCBmF}8_can%yz-^gKz->bqV|)kQZ7bjNa*u zG@pQW)EkcN)?!49WO?g%s#&WIuH5l#<{)Q%Wu3>!P1|44AHCU#ePMP|v|jpy9O^yA z#51B=%qEg^#WRCq-%@JG^0&hTQqvaROk3*ZY1G3(kN7nXW7~?+NY6Q(>Yj4DZ#epH zA4URxNF(p}-q=O7@mwC}^|`fOeZ@%wxfbS_z`RnHWI`zpbV89#eU&9l$<g`zTDp~m z4DNQVL+>@-dN;WtBr5LjHP6iowxyoSCR%5k5vFF^$D2iY<^@DE`Nihl{3Lt}5=-Vn zw{0HYL}xp$E=>r`RQ~rm;QV>~`&s}{FFdd@kPkgjilX%d-mio@FmM_tk~CW2n~EM6 zZ!1W<pHH|ZUvTq_Evo;^?OgKVP^{zWS_j_vsP%eAhOZJ#H_je@iT|=w-7%H*fzc{G z=ih~COE^a=KV$61q0O1JcMdHh(T!#Jz&-|hlnBg3(Z{bXp{NaZfk}bpzrhH_%Seiv zy^ZJy@0(h*9rCIw^2!Lwq0QSQI#u?8o2R3{e81WSf|&1O`K^~=8RhK*mmbMFEOn~j ztKJX2@?6`j5)zBZb6#9dEr4;+g)`lSA&?I4Y6fXzvJr<s`CA4947ddVx9+jF&0!FN zjyr5M;WF%YG(&<sKi;=fr5CH!I{#_DQ)$`Jwacm4gRO)fMl`u}aWx{ih|mWc=89Up zgM*T@L%Wz3w#dPE*O``LctY2&^!w9eJ#O~<+kf1_DPDc(Gj-0jUA?E-7xQk6Pv^%u zFIH56W1Y*7f8t(57guIWNx!BaC=bwXr%S?@EcIc$uza^E!uw><QEiQ+JMx`mZUq`q zw!#URhHp~f6|9sq(F(3DG5qsUxccc!N6~VRrc69HWtsJh)SRRNaG9b814KBVx?0ox z1TYR_dO6K444tR^A-m!6{TE$gX*&1Mn&~|Da&M2hwk3bP&|F4Ql(uVeaEeG^E54Qr z0EPUAa)CjEGVBkZo8z=~pY337!vR<c%T3%o+4;U4vTD>Jb3V5{|BlB%Dvbh5%h%bL zVG{>|o69Q0rJJL*?dIH~oz`fM2KetoLj<V)D@o4_KR9%`J3nY-MDNSIjlJD0hN3YJ zeO<_kgRyv=Q~c0?<xcJW76gNsXswdb{^dY0*Y}{lg=M`p+u=DZHKYZFuEGBK|6=T| zgW7Dg?cqRhrxdpWEff##(3T=C))p`B?yez};#!J36nA$Lpt!rcyE}m|@4a*9cg~qR z^W8t68HO;-JUe^IUhB5LOms!;iRR6;vOzn*j3T?6fXrcDq#!YA;hEl13P6_1LKkLY zzKMgl4J^RDiYWx>^OA^nzx50y?_)s$Fnrem4&<B39cUIsgMLFD0A(MZ>FEIa#@umd zoF=$C#?Tsl-SR-+qagr{aWuMqYr0*qi^siq0;*j$1fPFH5j>LzCTvHHv@yMpAk4Y& zneNZHamgd`8j=Zhe2cD5b@Z23!xSegUu?ZK(omkN##Vw${Z+>vk2+wgfYs1lyWW%f z?2oS0tkMN!?nhNgOp%m{4gRBOXzpE);HnB`Ye;8*Z{>eXDSJwU2kYj6=;z2{4RHOY zsR$j8jlSy8b;;?oz0ubqC*9DS5m<9Cwbb>^!DJb#JPs8$4PL@Un{0!Yy$3h`4$V-* zOU3HEJ}qd6wFVFRzuZ94b`VUBv~iuGEk)<6VKZ~74FzvUJF(r>XgiUsZdEGYtxg37 z98r;ZUrGA!JE)1ni^E_UkkBya%BfU>_5n%0r-)a)){^qmgLpSW20HlSVHuLE0P6;A zWwTh8kI(ZuDufmsXy1QxllB~ewz%P8o~FPcgMiccQx$3ElElDXM32L3CgJP^Pa}Ze z$aMiv+8vKvcFsjh<>T%S?o3&s^5?WKXIwk*I;Q7GJ3X$5XzKr^3Hd*^Ey#D3)nb5O z1c!2TL1x7}A<Mz;d@85pk4G<mA4lqaYb)Pd9bMgS{rUPK+0txV<40%+&jt0&gDW@N zGGjA<b^5L%+YUQ5QjiOOux_W_%k`>1AaCq1$*rq%TLf?WQMHf##nXqXgz%w060&-H z@)UF{@=eT_+H3L$)9#eS(XaKiA@nBo<aIE2H2*&=Oh-&tZqXVOV24&KHgp?o(ff62 zr>M?IVgkl^wydkqms(hPKS!t$iY9(0-wMC$bNiS!&L~Apw*7Vqkoh})jkNx1`4c@J z37a6VX9Ou5%uRu{HDAiWlybnJ(3cbX6w^fRsZ7b?VBaI#_7zx3v{BTkbH!1sZ)a$z ze)DH$X+o8iYOe;Ktz#ymH_uz+&;wy>97gW7X1Zn9!I#+lINA3LL4#D}9rDUu5C8l# zvzTiGG59-Q@T<^#l6iG+bK8sPn5b0u+3ong?-vE=`Z6L?Aa=|FB7*UbIbF0boL_kQ zr0JDu^9%UROd@u1cU^r;ozX|5g(G`3wTk$zpQJxH?E^G4^%uhStzzP~9&GKO(V-qb z2e9MLf3laTvxZ+mltVOlDcfy+PV<RAyi>CI1=A9sctIA;(?$@2;>t)~r<dq)tyR0@ z60Qprei%r2j-d%W!fqM9b5=lJj?C#v_0BrYSsomr-S@Jz7z%%jj_>_=pf1q*H0FW& zg3RWVQ7zl|MFShVZBqPean*fmd2yIB53CIn#Jm0}p8t|^9Rfs~6+q%J@ryw!(ASS% zaFP(2xNorB%ad`YPjW67Fj4ZpSubzy!QX%Dj2}a1FUgjahde(|wN3v1?ZS%H*OjGi z{OYW~1c1SOZ}E67gZ6S|BpB7!zG{EQ&h_++vLR47nY@#CPbeGo&{#N^VX2);RFbr; zJ)OZCzPbGy$<GNDywCa>$7C203UW_Mjtofeznyv8O<+g<beMq-4-<0*@PBg8r~gUm zhUJ@&*x@EqiuWco4EqJ&c}OBc&3FLXm5T)T18*+E*9qb*)mc!03}!q>lw(DbP*?FO zBz+>DkI3M{T|3O10ltFo16u14Nt{y~Cum)uD%ombco-}4=1lpf4VmBzhl<U2Iz_l- zr#h`xC}?$j2|oYv%IR-o5g-`H2cl&&+YZPU=b&#peA#)wiX{@Bf<<OO@09&hc2Mxr zkoImu-&OdYbSxNs8u&5XI0=z$19+jFzWvgWSjU6U^t<qA-X>LnGI66Gk4k>E{;w<3 zC?q&W0s9jw-E3%~|9+Bkmf*`+aH{@fyaZw2;i>N@PYGp-!Ph+wgrj__%+&8GQ4&TT znAqcIPdj0Ojd;C8B5&q2(6v1)f8D=ig(!p0*;n!?db#orsvB}K34>Jz;q$!ZeW~=b zZ&X<lSdBdUUUSji<^rVvaH$~!<kYDodmtg+Wj$UQG*sM+KIuLL&*lBXbNZ2**-qDR zJ9+~rIQ!zhFNIc5c}Hd4-%;sfy^hZ+_|}b*Qe-=B;1%8fp@p394@?~ku+a4KYm>se zy(Y|Dppj%EE=G{b-w>iLjGIQ&o1mNA88ODX8n>rx!x2eAo{Y8<ZRhvdnp%bwX4~e= zots{x;Q$3A%5;sl!-H;Z_;~|k{>1oA%$J1La$HFbNx{lYSxYHN(pHId7`!?VN8daw zjrc4F8}iTvbgDu-?2;vlGrL@(16ov>c?K);L6zxp{&c0eBT+$5+&?}+b&Hoa5aOph zDpBIc`*-u@etd9m4}foN+Qn4@|LOG@DL<aw%GFb0am5oJ4YZ*r$KE(%Y%5C}4#z+Q zU^Z3~ND`va2ni-fJb*yq1bu(2@HRgJfL0nWhhc7EJf{g>S&?b2bvB!maz7Tp57%Eg zBRDA-$5T{zHx<MtrrrT!o}QL|kaFs@Z3~zCc+=r~zr+jOHH0mny>|GcU!YAoJYv=K zOF~!NZWsnjPG8E}n`^+Hep$+>rH>e4!=W=eHBI~)%DDU)2qJ3~cKpNRG*>ErE<CjB z#h5wCJ4y_B_sVI!LcxX;pu(VKj!{iPV`t`kTeG#TBYeFZm$k|2Alca3>mQ&;=1>n< zu$`H89a^AHL8tv<77hE+ygX8S{Q@&w!dvh4#F%*v%n!aEDA7#&+I}M8p`>M^(MoC6 z55@N2Y#~lIcl~R|N}1-1#N_MlX^2?R#nFXW;;w&_(u|CeFW3Tqr;W)f0A<;8a{}t+ zyOGi(tutEZbF<pa_Cn76YdF+VX+-Jy(JO2kWw<*KDbM3q4B|+w15+~dL<OfJ-NHiN zuku7S`88JRmE)g>)1jbl3R-2G)<LHHMb^?eB{l84qmC5GZA%w1rZ@)@j;?+hvXK;_ zqNh6+0Lah}sm`N|o_4_Lv)udHP@Gf5*#<Yp-6aXaNI_r04WM#=z9-=|?dJx<5G$3L zb(IuchyY+O1jlZh{QTiUS7*j(WOMzu34>t;k=!jYC@JNw{PQ{}t^@}|-PnPs(lH_1 zzHkB=Mwr=<7x<pEXLUiv!sxy})h<FhuRNr0WMI2Oslj}zRJ-rovDg$aV)^(*qnG?3 zYrk?}c%D>p*BEtoCX#C-R1q6U37Bn*E7QweP6}DE(@c2_`#Ex3Y8Qx9Mvv{->L4Wn z<Hga=IM$fFTJqYK7@N6HyEon`O<-pJ&z-<76**y~)yex=BF$cIR}TQ2e?kO4w#1@f z%6GRA9^F%(Rchf7kkv|Ml3&C}6(te`mI#_mK!q8rSSX(9@yc(FxG}dz`h-}I^9|*T z$bKdfNInM^8PksY?t!?xr;URR(4#axdc<*bxUDxSCr2bK#@A=-#`!FcRH(>kplFwz z_&<e+1TZ!qJGC96Q8T9Y0|46VF1Q+2ES-n84y$FAy36v$p+xOPes5BcLc%-(Q?gKR znu}hS;@^M2VrG`>k;0gO=8+<psX8O3?PxgX6U7;6h|A_q;e^<*&=5cm09eddL?o6B zrmN*-D0yd2YQ{Adx$63!ay~^t@`l^SyL)5)W25|cF7Lmd-W@TY)*`{`R48&O=j#qm z_vF&$-lj1^k{rVs`_5kulyC>vayK5IEz>TluPmTlOV^3yyes5!3Pt4R_u-6A=99lq z>bM4FFP6A=y(D`W?)5EhG}mx2e^5kZ)5a;K?u(zlfAvWD8=c|^G3chn7>9G~i;j<a zX5zD$^cDqq8!YS~R3;01%bzUOkIaANO?s`$^2tK!n+%TV*JSPV4mjCOm@T3dtxJuu z+3;bUr9e}+?kCST6{yR+>nj`f5qP>^UoI<|)1kGA3h&??l^d)gu--AFDR&RZKF1Xe zjV+mOM}z4zN!sl)9hqS3@p0n@m54}r4`hWFeB8zUBjuX-+lA<Te7hU&1H#7>R^hwN zY4N-^Bz8h0$XoL~YA%ix`_0kUl#v8ZDfc=j=F|F(Bg`<vTp5nvu2N?@NLPHBnPrCV z)|O!9&u-6}l+cl;%5XfN7WXJOgP@`+TF^8m+FN@vynF^u0<RTG(oAc+9O%iTgoR3s zk;07Zs|T#MuWQ01iHx1Yt$uOJt?G>xP)<qre5%c3Xj;<>v)oPQm0kok<8Nu{V~4x8 z^N~g=OOIapGrSuWF{D&uFUfLE^1@A6x6@sza@dirGf79^(B>BlOmb355h8VTR$9{X zvXTa2%14FOdFWcjpeXh*Y*c*fGt1D8_T65<wj4enqeiFP*;$#r?{C9j8b;MU5S<E^ z%H!@MYl)<e8+a<=e7cZ1`7TCFglYCrx3ww*5};Xh0WGwCbm3&ozcCKPfrz>Cr}qTH za`K-~>%kXrY*M8cnd)gs`~VQ6<vEHXPlWP`ikaX0nse8&1M&EW<Go$S`Z9&9rHBWy zwWYr(!`C4>#bu9@H@9A=z;51kZ{4d)VFh+YVdYfz?`cn{75&SNd3GPr8hvYlFDq-= zdB^H!^VQ2JoM@*qsr@SB05IOJNpwGlqP8T)*7J`BPpMb{=^E#5H-Ub|UvK$U`YhJc zthTAt=a2wY3aU?gBY&!p^leeW6!)Y-m9M9I8V={jD(sA4ZwcuNKk_BUB8aO$*_ifH z_X*gBMEc5*P(;COURz@5%+F7R%WM4%*@b5+zSV2Lw;R4|b%s!hi3r)veOj}3^p?(a zl<Ib&*sa&-(<;nWJqShQhpiIaix3?P=;(bM>TJ?*>biSbHgb?KgmZbm>x*$9w6(XV zC^%QwHXWqS_Pse1E^=i7f#grf4TmBB>w4jR@e&c)d$t62*js0eQ)~R_P5<F9r`Pj3 z(Ss0Ej4EaeOsPoFwPGI+pWh=KM07t>cY!+wO(h1u&?%wz8N+;XSEIyEkv!b-QJF3O zLCe0&r%aAA+YQZAS9mn+$i!&gksR9{t!O58%cGc^UBkIajt1pXW_FqW)-tHkihG*k z9#doE?agkXaOGXFO0ZZs&pzsRqM~<k5fx|Sh9TiwXVXQ}1=$?VmB$UEtno`}+dj+1 zlnAzbqw1cMHQx`!Va~v4e9A+ZTGG_=#XOLFp~(-3M!~CXvTFosb=g(fTTt9R`4`jB z@8nrPl6ru4$8l5n|3Fja5hoG@D!x|8W_LK9eD08o|5Y#+5J&|g<;d3|XP}(sAWl9W z)&;*A9^CZ6fNIKPO!FGCN!`ctRQu(*sa<Ie42_y2dPy5Trgqe+xDi=Ha{4p|nZFAR zh&ft~`;N_;vj3<Y_-cb4?uDMI9~&BD^431J4|xGu;JTbd_93hY{wDXv2I2;(31YX; zH^CmnhrvkPO<KT1kBw^&_ivbmn5wDWcXqLVSYxNM)S@a*7{1x0I2wQG>rWD{nhyA! zoJ6(MU?PAx0YO2$pcRU!JRwT@v6yU=hWh&IBET6OMBwFp5DWS32(75gly<<OL`LYx zbsF9ATY7E6lq?sao0G7VKt0Ok44cDO&r^Y>=Xyi1eBPs!{ueL!zlM>Ns5ZH;E*Wv! z($LTdIcG=vZ<Q<n7^~yTEKiT**{AVhg(`M1JnhXlPtC>g7}VBH-?!h9^xR(?hiyc< zKNrpW5r;|lh^&ls)+9wlVosU9TT1%-v0!miiF8V$*;3bLEx~?h%C(2V7}1?euSPQK zN)7Xh$ds|F(eW<FZSxAxyj=5%J;cPZQp25<F-%5r4RO+4_;x$zcKp=$E1so($6917 z7Ix?&UssmAqWFiqvR5GkMN#bH=x419^SzGi>V_WlJj#wrV#9^wOX*V0xD0YJogfja z-T%NlhCtZ6WH9_Z#m?Kl`=C`0GF@ghspM!s-<bdK;`uR4cV}GY`4s%Lcg1SNJ2PqM z=Og#E6aIm8xn6Q`@k^@_53EKuxyzgaKsF{y+!&L3(>~SQGr6>p#=2|TL#jX@gRu7* zOK7^>(QfOkcud(?*d_PsM{*HX$J|RZ{VadQDDh(f*8P%@1lh0ilGD)MCLic$b5Hta zdgg)VW3M0ckiOyBZ-70=LGx8Ss8d$48>-l`?p13p<@mxW?5l_d4VSQ%`1`p4P*|8G zKa%OE(2GQ12n#X{(GC)f1DJ^9(-iFWdm6b&Yy3#1hJ^Ul2~HSXFnfQ#kCi&9O8aP^ z<$pfy_YVd?@$GV|GobVizXYZusZ$23xcmy87;0pEB+vG@xp&JOEl*ntKLQ_p%<@@O zV8d2_WqhZVc2fF_U9tU5i6@G<RwPPLZ5l_y*#U9hvXc`4aKkUw;=M-X2cbkkOIQ3P z#EBLBFC*zx;h&fmh+CUP%(Hy13WxONiHj=wt~%wjS|(U0`S}YKEPetisKw1#d-@%Z z6WvciZ~_`g!msIo;_d&`6-^_;`1hEBl1JLTi!iB>^62H+?7DgGYk!L{-05VWLy$wL zH%s^j=c%`%nXYh2YFnoYSHZL}4T<dC-Y3(!M@I+HQ<rHd|3@y;{=yH$tdM9iRr}o? zbjeeSycw2S4X{YDIrCQ7ZEA?a3)AEo<KCk!szFX!*{uV8)Su^BRQ?%R^65e{YwGly z(wCf$V|_ySywR=TyXwAAyrygS*Z@T1#MF*kmr{+M$XxNT^UL8CQ7)wWnTH<~5`=dJ zJB854X7$hW?CAeGr2qB*^Dny=Uoq?u+0TZ2PTgrktGWI}T+|aaKL1F!B}rCg<(xPE zAF_GSBSri9t+mC^yylA;{jsFGD#uuPo;sGx4=sv9ILT<!d93Y8Z2xRnH|@?sXuR|9 zk+(6`P#mzd^a=7U2=Wnx$^o}SsMjB}VGU)){QeoRZn+8Qo}Nu|#j`$o|Ejm>tK_`H zEV9*(yd&RC<}0r6*qh6D_YWl{XeM>Aa3_IcjWmDEtlR7a=IaP73=%`Kb5cWn8MP|Z z?kz~yXZxRsGI4f6#K7{CB6Hsa>FXytHM!sxm7)H@g?OC(*?{H7ra@5Ao*bKbH7ZTa z^)HYFhMq1C6-qfjtnMa~tt*y+QApS1^?oHWEV-_pCOL4fOs?_O6a=cRx4&bmI	n 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%0AP+E`nv7 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%0Aa-3_hs$Bf6p?V}s^~0K3 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	iq^JN}o3CtFzGO0U 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%0A3iz6+xY%emnZ#wGd6NsqVt_ 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%0DRAa1RspJk!(zwVvshH#a`&()(p=<hP=<M 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%0DKTsl(^yO?W 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≪y~wVN9QEUCzqY#u*-Im!+l_Gv&vcGX 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%0D4^}S`E;<tb&><R8nxEoT|`i*)~%}Ra%08@<I!-I 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⁡Jx zjwBTInG%I-Pi;^P-bsn4PP#}aS=(9@au^?W*f#XZJnIlUU?b3>MNOS{Dvnb<Nas6q zT6JG>V(amaxieFrU!<4mK90R4VH>gQg8f&jz6=4~nb21tU;lZg$&D<NrIdX^E|mQ> zX0`pgGu>&`$r&odj@ML}rU1-ZXC>w;vLjK0gOq@Y@9pb1w6n_SLj36%QeHhO(=Cl8 zPWw(e(bw*{#BFi|+tnpwSeA#M@V7@HJ=aKNbo-|w@-Unoz57WnexxV`gE}-?`&irw z>{>feeL`Ax*5o^L?M>`H!>KonIB4%b2o?}3?&1md%yXDOR|AgkNVHq_dcuEla0ue0 zk_&xad!&0nDRUE;u<Gz5B&}5m8V;C)4{pLrV*xPgz7Ot4pk!3^zKH=?TvN3Ao6z%= z!6?odTFo^-r&>IrtE4)*9@YtcTk2Y4+hD}~4bCp3P@234J4}S1_xKEo?`-xRUyZb# zOsp1VBtb>`dO*wy_2QCZ4xzdQ))xane%<W{ygzKd<m-Y2nTh~%t<?XResf{9Y@m_} zpS<AXGU&8;ZuR#q7m?#RILoKh?``;Z^`_F*>lq{#=?0GysAeQ5_mPIS(_zq*n%nl5 zW(E7wiU>;Qq-e0u*?G=#xC0IKARt9hlt+#21AC)|oI*VyQ6!jc>pkCXWZyPU#zjjK zJ!<FW{u=Mmd=O%1Igy<AYE)qV*J1X*_YAKHTIvO_`vvf=9!B83+TMYkO9itD$6+A# z8>&m$2H<`RWbXlSZ=<}GQrfOXoig0|Q{FR|!pbanRME#OPp=GYZ4PPRHlFsZ4NcK! zxTFGQ&ETC~EZ`^%x|SRoz|w$YU1NhKYHWTJ_@ofp`{TKRRj-`hk}$63E^s-LBd^hZ z7TEkbLE1e_9=Xq}G{!%)&WSqE;wc|7Of}lTNGaTD<*21V592Jc_qN?WRppRaHkaIn zP%>~SECOM@IbuBEjbO8p_CEIOAbf>3`+=9Qb-~Q%(AN0h3-$ywtAZg;ux-JDJY!NN zKTHO<dY)RF{lq?oV0#uWJOwHN+d@5#>Mtih44ecDgjS%qd!I&0M;w~pF=icy)NRVr zU6Kg-QSt^yG7=01U1u#thVz7C4<<dwU~f)spJ9YUYk6!|ffo|nZuQ&E?%k+O;7#nX z$4kBZzrGC&8_n_eoicji<X#JdS9?~%Jv?zBGxVc!cnk&V$M<DQwjiULXX0cK;-x7? zgW=Wrh-}y}<%_0~S#ms|I@^%bY-mo^R_sMUck;#7*#;CLteGY+YTcz^sLB19@g<uZ zlz0f(pB7-zW!x9chre57_SW9kl>no_VI1nH+bmXWcV6AX=~R4s2wYxecDVF5G5!p- zwKrqivbB7eOY*hI9+1xj-YgC&+&u(nGYGct6bAcZ3}{VOzIGuDc`-)tm;;9f|JsOP z-<+DU&d0*fNKW>$A7lf1x&gk2@N-yEL41dUNCEIgeq3!f-x5U^bN_pgbt8%BT_kO4 zY`!PCrn6*{B`$MGQKf?+w&hN-H7v1NeNB5|av5%Wb?gu7bJ8}tYkM`hxgtn6>&10u zUWB`i%!PU}3L+-OMSi@jMR^EA3^Czh^z)kzDXofJN_s^-`1&IKZVw&edNM-R3cZ5H z;dAY?`gp#G+#;(i@weo^wM3E&we{2E*lFv(uhf_1(o*o>fN7_<qwDJD==1b6y@SI@ zq#SO&)tA}fI-&spZ1<Q-o=D!EMs#(J?TJQUHYTDx(G}iS;xjG0LBG`wB$o2fB6<M5 z5=YV7bplizu@r>&N6!EO)?GvOV;aKZKmm*>&2_)G7&2Tq$|!tQlHusFIGIlPZt^cs zcqMDig$b;O2<vM&5Gu;kJ>-YAU+k8%5T7>6gk-!4lW>+~m(vovEZ?fKzrYil<$*~k zj9qf!+V3GAIK*psv+A%wL=Ola(DoY)w=8<tCq7E@A7`BReaDnwC|^4e7zHtHDhVpn zDMK<Vk{Fb1v||Vrl4;kkl+>}SB1<6`<kze)DVEFTm*e2p?U(eILSz+P7Y1v7oYwc* z#ZH<>$zGGdM=U$jG=L;X!;wXdExA8ThDEY<ghS60u7cIshLs#~*ll2bEZ@!uUXuP& z*xZAGK#|nUP7{e`w8k>{5mI)S`(|*_VZ_-zGy0?yq_6+pD)<?Bj3E2xn2$yI>?_{q zT8AS2!KmlX<OkY0t?8c59fZ))cmGKlL>)#;zKfJhCCQU-p*><kA!CnchVSqy%}kY} zMocdTAi``$-GuPY+?U>Z;MK`cH@RA;4(vB-WW;Z}f?r$wPiP%CnI5~Wap`GD5CXCy zDj<@)O|-7DPB*c=T!^J>wCHOD0XKeOU}N0#eq{&HYuo0V)B&J2lW@pqe<vriFO}-u zm^iNE-@Hbve9peV8QRl&M~iWYZBdH|!gYVgzQs}dTde*6uw!e0q~<05K(X5vhdF%# zfva}f(sT(^{YgQTLMOXuMcPJHHKn3@>g0L&m~tXTl>uEV9`S-hZrv;->5j<j$%qt1 zq8j`_#5D<W-X6^qga3D|nmXm;_azpIENE?n?FML`wVTU87z#$RTU7k+dBR%C8{)T@ ztd|6~-<XLW@mJL=XoCRIew7PI!(E|N^#54mC2Szd92MO^ZH9jx5tCn`j>|o7zi+-5 zp}gIGfWCISR-BxY@~(dB`mf)S#Wio-g#irj2=+EAk@7F^Za6>wM+?AFIG2A62vp4D z*gda9uDUD`I@R63f<|{&1XI>*uPI07Y6uALEVM-U6jAK7Cj<VXrg)*cg*?<jc1e(# zsim;WhdW*4!<Af<xbAK)znC&UGy-TyR+BdZME&O56HH$tA8o3`YH+-mudL`cDV6Pz zQpLy;zD}-&@!+;g5jIcaCdTiIJVgy;G!1`|g=p+6GtSb?+WLOXHD6n8Uk+Iy+VX^Y zl2(#N9)Czj1`2@s_M?Ru#eTbb(tFRs)&`#v1u||8fz<WoDF;c0OLFB4byTpOm7B~D z(O$e@McT)$DSqiqYFNT$wY}wgmkOiFAkmAAMVn1XF~aJ6PHhuPmey#*7yC<&Us`^L zvZ0w&nuyrp_9Tk7f&R1tYpD0Zq+&qF;Z(zzHm_s)ajLPw6A#o&oy%84JKSg4o(l<- zYCZqop4a&R57=!yPDxliIajS~@83GR`MklYL>|3~UFOG&^MBw<TM}vBN=D}~|5%k@ zk4y!P(`K7L{}4Rg^aaBcKvBWi?NRa(n#G*_O)tmJiL%^P!>vC6pzpl0*zb8c5nw2# z04#NlDs<p2?tQ^LW>dVw64i~*fPb4_s(#qvwZ)}MVLKWVuMa=IeMYh(27^TLg}%R- z!OIN?%zB+|u-&5|cC!0D%e)j}`w@?kZNt;)CccV^dlYYQ#GGY7gvcl*8wZqixe}l5 zOiR4KhWI?5_`Dq?<W>9wF8?=J-=ab*C2W7ES}*EkPS7k<)ST(hJF~}>Bdfmt2GaJf zYxHy20flpoBiA)LG_3707!q&~#vobq7}VU>#jOW363-5|O$FFU%pOBl#nQ08l<dN^ zju<<U38xL=ABG$2!<1jAwGtF)(r)(*SIgsZUcM1;rjEfBw;FV>trN&S9ev;Wgma0i zG_UZts{>~??5%*YJulO=0_{IyzDq|5y~dj%the<T-p6HKI_nkeO*3&5B=dKi8pH5$ zd<Xjy{^3F`5)d=?NW5!M7H!~09YFvwA{(L#Mzf!^tLSq>kWbokgifU}H1|(i{omyg z&j=0*xgABQFZP|J4`AS!gcP}D?loS}LOA+#SAyp4cM3iQ$8A&hw0pu|5z;bAw*97! zAFLbjLV8IoTG4GRO`bY*=;xZwS}`F4Qq=Oon(N{(ui#VEWO@jpkS>%AX}K!Sh`vd4 zZG!uJU5_);n_B-_l}~n4TQ@_H*S(6>HrU)|;T5ud_)5waW$P89Z%=%~xMziY$0z&U z9yuG{Jdeyi=X<&==jQ2fcpgHkT9*EkV@_dV2v>rI%^P-_{=m04?YQ74Kem=*m4TK+ zZnU(m3N0hqM{z9ctL2N!<*ssHJN34{S|1*N@h1;k#y~{r<`2H~)ctjPw?K7Fgz_zm z_E9p0uwl^=QB#^;wvSdc>dQ(?NPYWf*J%G>ECTnVSeUQoy`qZt!Zn6@%;h~v^g@tt zbxb}6BQ`YhKfYR;_4e2MeA1>KJ6WCC;(O}Bl^uC+CF!<?jbt?c6hmL7TG~sF+%uPS z0XbpP_ku*O+|^V)DCSnu0^;gV1I`hyGR0UguwYzkfBD0t3JRK-8#5BkePjNd8aRc` z!D|*CBFb^{q_)(hcRV5k-Sf#CElN=wO%Kl>{WLHU9eM=*4!JEo13ps+13cT|OqVL) zoEB=UWqH}IC}8?igO_4J5>)#|Z_w)IWv~OlrzKMP;s2GA7a{$Q-+%-gRT)COks%DL z3~q~bMx6B6dvQ+ldoYdaUiW5YU8Z4fyQ0Wm6har*zF|Gy2(9ewkk*&BE9Rrx=R_Pf z>9e@vKHs)+&IJgayr_NeK2OkA*`bF7giRyiO=wudP((iMxC_4e<-wFUgz#ec5>JFY zYq-Iy>k|cAne1J>7Nh%yY*%Rfb(wfdP|t+(T*bMEHUE!m_X>%8(hZD&(>B7z%e4J3 z9&duBPUX8r%Zz@*I?YTq4CQOA(Zt-fTy}ss)6Zm}ym{ETrc#g2p{ovqqo<#4DcW6= zIHv9n=s9JvXBIpeJ<`Bu45<+yL1tar7416Kc)jJT9V(v1>!-R~DkdAkg;Vo0PN7TQ zN1+Mz_NV4`iuO%!i)P<L#9^HvLx>KsmcfG+FaUZ;H7d-3A+btw6Uq0j*qW3wUMB|T zI-WN;wlyhN|4@F$Fupl_&X%eq|DDO7!p}P75L^{rbCIsV37tP+>Wm)GKAlC%zENah z`i1wvGkCi1z{dS`cm4<0B+9H5sXfJSNxjn1N&-32AKAOaq)0GH6p*A`7xqYG{FU80 zxC{)ue=yz8nek`{+4C_ss{4oYtYE$tQwl>H9ObSPoHnGB4|3DhEmSGZcIvfm>`#j& zIngrB-fSo$BloJsCHdgy6C)mvVSZ9=Xd8<U{N2*re}E#6jfA94oX0UYDA->2osP`@ zWn+kCcu#KVsc`LLs0syVUp(xJvKUL;oKtjI_e~AwDw}psQN;8YA&oeIwLtUGg>NM$ z_*02S`J*C6lN6iYt2>O6XV`BUB;JiZ_NlPJQ`AV^=^lbpt!4;y)nD@BYOjwgUGn>l zoOBVb&@yfY#k#tl8D%4YG?#25dqAzzm6g6m0La3vYX_ChPY4u*inpa;B`_&n<50Uj zq~xRUsJh|{4%mOlF9pc;fq!j}&0QQWazPQ*rG7$Cok2xrT*;52vW@7FBwFK$fIJQa zLmS%je4E#OCMO4Lvk-m%XBN~}8@06av4r;Z+Hr-r$<X*J)*D$r`CA)pP9?Ly!Lw}n zTQFQ`g6(9wGlGcd_Daa8TLvzoM@bD+iv!Y^6XNccFA1jdXX-N+c55aGu4d8BOYDJF z++#{IC)~|d;QOdxG3<`0j*^!mf_KVkbZ_H4C7bUe#ug`K(t>~fzAD~vG+06cxAc<o zqkm=%Y%9@Fk1s%k9xr<m{04IKv-QRN`eWEE8I}`BSKe0|Uz9ElLvJIlyXNlk))gcn zgZXm}&l#vCaXm(ltm=J=QfmY!N5Jn=%K8ng%ethb^bZ|W^wWdwM{XG*8qyT0dTWR+ z2?1!wfUl$Rc}cSdZW+K)h_+A$nWOwZ=wCr6C!I+9Xe&BGE7wrI^JVy6aA2Qepj}ZG z7M#Sc8Le0P-Ry21v(oY16U3D?dOC|f8>UhryYJ>-Eo{@En;c*j{8EjV`w3!olH|UY zvQi4W!*W9%GZI*G%hZ^V&rUj$C3T+0Gm&b{<K{(3W57zroc2R=a&j52r$%BZ&FFx( zWcE8iMKyZ~39q}V7bdhA{&|F$#TFfCk+*G0y_1KiRMEM+N-W(eeRR%4^sB!`vmRg_ zj*GQi%zVjb`M#Dx#n<u!Lbd0tn(0iE^Q0t5M2~a7wegz3FRx=vt9fc905zCAaQz8M zAs(+?6nWNR8}s$XnFI}FOf)8YzuyUNG`ENJt+(;gd+$~7ydy~64%bmv-p8v*iv`Co zV$}IIb-uIAr{~lM$Ys|G?bC$a9&0Z&^~p%pA67kO-2C+xn)yp{wb47X9aeTf+{pWg z3s`LsTxgpj)z>uGWwqCEAG=R`t^N-7<P?H>%JOZDqc)5_4@@^czI$yL^6>QvO|adJ z65qDIu@KVJ?yUPaM0|towny>}K3VRfT6!VlO?4M%9BoiIueTru`x%3@h^W&R{Xpx@ z3*)N)F?;ADofe_~la?5v2W-~#VyZ9V^5Vwxg3aT>yXQ}j4DFNRzZDVwHwpCbYKJX8 zs+!)9{Tijl5V?{F+g0+5)E7(Rr+nEu@77Giq@rUR7Rq7pb{Mn57se<mt#^H%_r0C` zoP;8R2hCroa+EHjKeaDV&7kT>PnL}v{B(9NO+hcYoLJ7s{23COl1eR*bGdb2i2By6 zlg?sgLjnnM>kXPEvhQQ_v?JtLv!5)lqH{9Zk6wWNMJxZuzKKBVjw#nI@d5Hi2+ijG zKlV-mn(J$4Ti5M}iN#^crmod^Nz+%1H@1WBYvLI|S8;>^1O@#HLi@^`F3o*Jey8k% zl?r5ZbDKPou#M6p*2q_r2(r`T=Q<9>foprEJFF2T@YJ&Y>S};RFD8#6bB(|+D|W=7 z4LoumVw?Oa95-Q5QiE-mCvq>^OI-%5pgwwa^aVT$$h;NRyWJ}J)`E`=GeEoBl~`be zY;0V>VcV%aAz8zNE>BLH4)4*>m(y%V{JZThgC$6X+E4h9K})Rs6Hf-}&U4sjnSGU3 zKO~VI2$=oQryDp=>!KXOViL$8gi<EO`#t)816JxT9G0gCy)QepKKgVjy6Y&<4v7oj zBv@x!%kY<VWj1O@V~??oa4Uib;cT-jmQD6v@ZPM1Mp+XOHG@n;xM|TP(a(ojPQrJ% zDfz8whlxZNL?lh_ra@9zs!tZfi`>WyJnhD=%b}mi(2XSXwB7Ro!@kONxVK6(!0+fC zQza<08&hA5PJW;G4UAYF7MNN|o+Kqs$%M6B_bYVhUWoS&X9p>oy8KpgQ;<j@cYZCs z**?8Ik~zCEzICtn@>itOBWc&wjZArJBL2KY(mkgeI~@jhN(-v9kBV`{cof45hWf#n zFFU5_I#g-K)on`Jdg&Jir<HU)j64J63_(SWHZMOxpgld<_le)#D-o>8{4@ZRJpME% ztqd)Gr%iHoo+j+h_&a_Y6X$&Fly?H&K~c|A61;Z!bG?rcVxvxq@psNX*#mN;(jH<R z;mdUvRsB(Ne|@oFDg|B+4@@I)CpCcq@trqKpKD6pw|x$t*E=AItq5AP=aK$zo{uru zxHu{S{}75C=zjeM7XmNE&)0vh$QpB=MVP%u<j@f)h5D+e$mS7YFu88Ewe6`K$J>jA zW&;<$5Bvb#IaKkB6cVRBdKRJ;p&4aR<VdglbYv-y(qS~Co%^x6x0jKyO5K#K1M5CT zP)b3KWVeJ?f<_qj*)An#ZNjK#fq7E{8~K5k@&6<29pfWkx2@6Gwr$(C(Q(JNlaB3< zZL8yS?20>fhaKCtZmoUJzVBY|S@+zJ|6hHms-&K0jycAdW3C0wLJt!bEu#OVK1|K? z`6E?sRZ4&KXolu(3r*;^%WeM&0N7F8(Qo_@>KYa7Soj8m>_185e`_Z}mMmbuhoI8} zu0UO#>OH4B$C!PI$Z@-mhLW{Du<<uP2zMR5p4mN(vO36|^iY4C-pu9uUG4nZbiLm2 zh*u(raj2yRvdUu&RLNefI%uF7HlIwM%=bRC^=Eq12b2$vz&3|R@>lvfCRbhYeVpLE z7RR*;h}Jcs>HYd#6r<siCOB1d0bV^p2Tj~dcA-)b(}MSxK-_)|dAoEY{ICVXBe+Iv z+p2|cJ_I~+$ojO#*=M|=<@YZJItBOg^@SQ~clg#{NDMOU5!SW4sN8R{)*37-xn!2b zCSHgemhChKd|hfKYC0ocUVUWA^%|6#8o?ds<nIP1W-r*3_ivWJ>#-*$2Sq&V-OMe* ze2H_znH@;>QmY<A2$7S<!<Pjab=7F8=`xjeBj6jqr*7CrMOT9{I;XDDWkK@b*JID_ zZO(k`5@gBQzP(QK7#l?xqfxm*wtJSB<lATQue3{egrdb0i;z9zC0Rk@=o?zRSw{+e zn@8bd56J8<@e0{jVj1ruwjR8ccnGAM$6;_F(JY_OJWsfdwi*3k7(mGbs`MoFb2wgl z`g;a$sNgHHg54IYBz7@$Pbp&^Nw7kEjIZ26s#uxwWiJJp0qHA)mWMxDI6Vi*di!S; zt$PdZ<*-YqDU1sd;aPDuX-Y^~u%93iahf9;Up>?rOXun&P>a}1jk%p6h4+)h3cy%A z$353MK18L?sSBhDjD)&XstyXa*=Vur+08vZN;<j4f|+_&524FM6piYA!zcu(8`uhi z4MvQovc_@MyoOLVNYV`|=nw)$p$xKy@>cFOXDUWaCiWw)g9&p4`+ax@h!)d{si4Xn z{<FvUzeRaqD|CY_tS9_Dh?lo}+~6?3owY7xr<`7Orf!)gnRA~o-?XsFL3th6?Xi!q zil<urAx=!A;;QB!`y&$q<2~`*W-m39ktH^5L?^)3Mb}p3XQx|}5}RJ*8uYyciHM7O zp3lzC8<OD@FoaVL?*exTYPz9z8A^&6$0HE$V5v@iyD<n{2Q=bT2*dlgrEv4xz2VAV z)H6bn&EG%vFSww)?L<>fU&88tP)ny}AWlNwU!umhZJ&Jr{CuwSJAMEIL8kzYlAHJs z6lV5ZCBxf}n$|aUXQDr%>%b$ql?hA*tNY^$Ofq^6dF&ZisG3!T9%3xxv944r267Cn zMRI^2r~Fk>;Ck^QAY^IGtB9$sR7A{))}n*k!QE_U1}B$4XnK!R=X$i4DbWGt;p!k3 zwanMC`rVspU*%y4`9b&5NzAn_m+)Oofxbop41xTzJ?2Fh^H|>X2nquL(xflZYCm7^ z1{Qr=4<X-OiQ#3$ZNX%Af^ynZICXlsX5rT#3O9GMLA~Yf=N}S6q)3^gi8l!YX#;vx zPD$SdVbH{g$gL_$xn#MHweeDC2sW-yoR$wM%%M8QsYcD43)oepO?GBI;7n9A+)?El z&nDn1RZY6R%JN7HTlHTTYEQwBgI?M$umtrXT#Z%bLb`bKpR(x=2TJ2Rn$T}$%8*RS ztoTJL^OZ@cQ!!vDH`m~`9LwDkO^9^N%Rf8A^EDh0&1ICPjP_afC0aqEVCLGL^e=-o zt*tCG;zlgZnc3BQ_d{<jTMnucFDX=HHkS$mj-Chx+aGC{c0<8+lJ}UfsacF*+BB~j zFoX}e`!6jD@*G$YvKizS$X<tW2eh`-+TVg#{OXwujE2?oT5AXRdhb$$2+-TLj(Wbd zr-xDU^zMan`zo+6VVnCD%1&LwPT61iZ$r3TK)z!C4moXz3O;P4(>24{{b55VfiSR- zCh6Bl(6V6S9aqIrMY;8Y+V})3kxqJ{&#EheU}tdU61F*x8E7qzl|-^r{PPzdN<(lH ztlu46YC1iLxT{XqN)Kp_r`l21axpyLO!W`FtB*OX56o4Tq#JDVoj^l`X#I`(5yB|o zy0|yvKDqyuf{>0Ad4Dp^F#o<jtY+{0$w_!<)w)+NpO?K$@otx-L#=}xWg-3^OC`|F zi#LZviHbG1pS#N<!JRFudsKFSZ_TEotp78C>?`_-P5xX6q`xaO>-Iz|^>mb!QwWk8 z%?_zMMeyx~B__W*9;=aT?S&F~2?tAr5_WrB5G-;`&tjy@ab&e)0XX`_w+kPrIP1Xj zd-XKHjbjQ(7m-=zf0}oCe~N;{f4lR;72@JK68Q&W!jq3oMfh#z?C{h5zE^7kUAYMd z0PQ*Q#)7{L*a8WGMG(3&KKm^NWX>Hhz;1J;FWytRg`F<LW~2Oo5@{4}KD*Uf7J9Tv zgJTQQcl+(JV1MwmI`#MF=76w(@n+ZJen7z#igRl{g|1LZOVy*TY<~|(-BBa)NyCi^ z`5lRBWQtm#3Aw2KQOqFYc63=U?$1cZd#$cfu{J{_WaKcoQ_9S6-JnN(vdFH!c$wZU z*v_{XzY=9|q{Rn6X7E`%V}7=u14t<Y7G_7C;c5ZwL~{|Sd_@u8`wLGv&d)~Lrb<#~ z<+Q8qa|@M>hT3Zir-SBxw(dN}ai8B|@SfbPA1m0|tR#CWwWscNKu;MDCYRuvO2-f! zCCz*b`vRSHSJnKK(_IN;Pn-sKmDrf?7g_mh#dsM2t|V82X8HS+w6uQpZB6s%G^S%2 z7t}dAwzOLiUXCkF8En&rYLsk7&vG~s4fJ9!uB@OqTGqG^qrzHt2{&kixoI7FxHZP5 zO2=FCtX?L`5|meD)+1Gf|K<Mi3Kn&t7thI&n?mqjsqKKmBths#Y{y_ZbwJ>1Umz2` zd!Q<r=lsNsl&C&JZp!nAXEv>&?NlyVB{TL7W9ao-f@9bty@C;M7`}Syl1rd-_SMhc zZA?6th2`(dT~;&l%K&vmoYL?bR}(@l3e?tyIyy5M<~B4WmVQig{nT3Zs~zeB-d%41 zX60#c0YA5{rxn6}!0hlA3NCqw)|ourr!D+vFa#p3)-mM?b4#h0%Vtic0xS2vQ0fWr z=u$o5V#*`r?Y^ebW}v-MfVci+!6!)cOJ?WIOy_0$0dNXl*lQw*e7plNrITM(yQ@Js z@Bn30RnQaHLr1`NB4@!rR0v=-aSB1<d7|Fb`dF+}t#|90Ek|)NFJ5V{r_TY%QeQW0 z^s9!~ig_(+e5<87CAHmH1Xezo`DuFZ_EtE~#;r&em&k#X7`&sl%$_uz1~ReksCwQ2 z+4OtO@<PH9cL%bU!M%zn!8?lAD>19)`KVK+-vnp+V*}`c5e_n@j{}W_Nxi*o;tL)9 z_Y_@o_UY3wDXIPv0P5r!V>Gu@eE^sLG50TOvG~8AFrWiL4n*i7JrL~go#tOp%E}N} zw>Le2WxwA6NJv-4Xfca0Ytblwp~yRcf5==QGI;eW4cHQKP-Twc+g%v*+d=%)xcouc z^Am%Ae-_*)6IJs1PUw|?`vmi?|0(ReM%kC+rFl2iA+3yV12V+Q6<gkpg#zrQn^a>U z4S3p6VtDY*M%Ze;QG2>Zb-hEhKn33E4G_X2EBhVNrzb{2Jd|Wt-*cHRBiaDUE;qux z7mWV+szS8*asMcCDUIg@8By3SAdgZ3%eNv2Fql6X$$!Xm`-6_0=pUc@INK4_nwJw9 zVxFs8Y9M|&Vtd~X7mjW@BV@2maf4pt2n}2JfIe(KaIdgB4Hd<%yg4bzKR0;#i&LrC zuoHZ8IqC=Dm<B=NImHg{@Ytv`II4$vR94ii4QOd%&fvtZim{ia$F+9zLmNbIOoSfO zJA{$8*_&HF{PAeUp4g+Ib+D6Fx_dU}Dg^%xg5uXD5hN*D68x}GLeipbsjr3H)|N0G zL9rB3u1J|@YCMg&J48$^J=_G2-@!{!XX0gbYB};16qm#YLBk>5cMz!-oSgl5=49({ zsOqnT1`ukvrCH4Vwy)7<TaA>MscATjLIY7E#NII<F4HnY#%y%@CZKyJ7dGu3)*2w? z;Aoe})eXiM_CedebpO~HhtS6W4F?-(JSs6HWo4m27g68R=^9H43LB$m*og%bqk|VH zf=d0|Pl-IGk3V8eKdSr{<`h^siq!X}pV859dEL>`(e~zg-$#TRSb9~raGaZM4oTM3 z`P`}e@Qg_X5|SFdkU;tH0}27k(fXSajAwm*He^QUm)3LuZz3!|vqhN@i`Jf@hG`?{ z0Hqh2T6?p=wn@Ltp8~B~FoJ%>g^x~Tzaz=bYeF{%H{fAp0RCiqetOz+{9_kX4ieO@ z<!|fvsYT<&vq`09FO<vh3$uIH#M>%$VnfF=QI<;rMto5@#ULx{F@Y1=Wke-lNJ7lh z)!HbZPocf1sRuibls84`2%<{MA+E<9x8^0XSOUglk?!~;$rXyjBO~q?^%4T9n~#f2 zk6;VApd8f9p&;OH-gwr3u2?*3$abIQ&-s;I1O*Grg<Nx<wmxj#9WTKEX>G@xjIyy0 zLvp~?@G){X<?k<1f4fI|S*3wO^{+RuneG1}UiHqS1wH$I<iSG=e+=B4#;?8=K@Pb| z7TON65*V(@S@$ZByVl7PdO#2XE-wI2A^Bc+ADgvY*!a{6L6ty5uCFV4myY_oWRRhg zUpje$f7DB~_`&-sUC-9M9AgjBiR1jfCtyc(F_e%W`wR!pSde`-U8enu_VP`{@pVuP z#Tg|RbFPZ>X$4@RKKf?x%LAM|2G+MXGn0vt2CJq=jeu?e`(FM~m_+Y{Q}|HwO?nPe zf^a)20NH8ug*R;Z+A3Q_yCsshK<LHJn$H#;+`<$Y&zPigYU5X;P&>z^MhtQETiLzt za^55}!NW5z!DI@C%(^ir4PmdgVUDCO7bLC2#17}A9QzTj3GD*~Hk$}cNsOIBkb?%f z{DK?V(!ufOn@LY4v`7eC^iYNBm-zxU_K6Z{H8xbE;_9#EJ%m3_C6+BmlBzp;5~;p( z?64qCdxxQj>gppA)`gTCZ>c;S-NlYrKDb36CdA1fx%kiO_S$qT9IFrwY;(5}e2=1_ zGL3-HXCZ^M_~eQpAe$HyUL^OIna^w!U8^39Cx0(O?=n<sUvb20G>_f9&+t^^=)GB| zW4K&O4w@CgelXhe4_W#6CJrg~4(=)jB83fi<wEjeMz+ZGz=?Tpj>m%PZTo=&-HfHH zpGaWi8Eb0;lZzu(aVL*f3xbfwtWcW4^41IfGoYOnO0bP2&q)-Crrc(mrBe04Bg&=w zp4^dL%Y(&X2ZUYC1NNcD*FV()uAog2`VyO28RQ`Tbw8NyB@IW=Xh0sOHxD7EuZU4^ zgYu`T@~Z8>y#N8sxCfZG*0eS!qG_a{PqL4h;H2L{$RlaC2<jcZ{ciC$uZHt|@H=M} zQQHb(Xh5IB`)m6C%{=_gyqO0F@y+l?51%W?KgC+`II@ghy!i)x)0mRQw@Ke`qm4@a zG%E;#F*>f;Rmm^(2ipSWPkln}Fpd>0V=NjXku5V*o6nG(Q+>+59iWMdWOlxk`dm_E ztsiV>hMhf&z_f@z=8^&NNtgl@dGYI<k3>|5Yu6{nno(i@I(NNx&{D)`9;Hgk)p>Sx zL-vs`a>7M_l4Xw=@x~7hMwLI>aoyMTI;MLb{@$qyRH4FrRy<Y{{XkOszdRT~!8^zj z2JE*uHnRU#Y&3FDe5KlG+SGY@5@|6yeJh@-|6AUB{3iQn*k?o~=;!)UW|Y9D&|u;T z@Ev+*$yql2?lv~x%CUtXFHY3koh?{}Oec8N9OIBCuzmnYCW$a4K%`7n*)Ll~Cc6XQ zqq(ev6$;$Ld<j{XH7-gG<Z-CP>vg`C=;5icGBey`LmyE(_Rre?3{XW`erUiGBu8m4 z5;rhQ55JS*Q@>1aO{xHB>hSRL^iIlM1p8k`zj)`S1sCg$=`%Hy^4Kd`;K=klvq@}T zpD}pgw`4{JV~-g#xJ_fFXxG>aL!jb5)F48KuQ(YWwVi84t<3`eb<`BX;*9c{(Zy}M zzmMI^QJ?Q>`w!(y*1xkY8*5Ef{6XdoE`n}ah)N|Oy>Au#f;?_B(V27_cu|o{deN~l z2VGdy>cl?w;KOKoq&~0hG8{n;a#iz*#Nwy<%%Q2{p39fi*~;a0V91&<Y1lML<H8M^ zubiRHapmlCZ^6Wcy-bbbPdjAK=wlf@V?}sSdn@4GCcM<bSDPc}h{q)sutUubH;mN1 zO&KIE$`l$F3PYzIk_CUMVgf6a6o|uhT&kTQqhqxA=wkge@DN#37AhsA5>hox-5Cr^ zH-na(M*j{>NGN!6X+j%Vp~I42*ox&EYo&N##)h-lxOACkXoI@Esj~PaZG882g_F{w zY`vdGz<7n6U3#hd;m^E!vrC9S0Xn=L$<sf$1!<YCM)v(OvZ7xPHv^^@G@#93Vmwxr zm#8?81>=W@gsL|5hYC<_VVUUEItXs10C^5yVNwck^m`^e*t&rMqGk(hP|*oWDR%p< zM-zUdmkX{?V22aJ&)x{$IIaJCPN9U287YXsKqc9`-)uSp+Cno^ItDZzyXW{18NCBM zw6=ed>{L<?^7cy+BlF%pjt?Ujm(b^^vYOFfl*Iq1p(73>=%w$q2H@6zE(1<Dtiwf_ zS&OjlUh`CbpyUd9pH7X&UN3>P&k~Dfo<Y~^PU6Ns%K$elcC$!9N&94d$^odYl~5|f zJ*o37f%uABj$X>-c6xaMCJa7;U(H(*%EQ@STDlZK(lR9uxVS&pr-u$qQ=mSaA800J zFMM{OCdBcR`IE{AZhB9h^I$;TYF$7yYS;3XySe(L8_+2&+4=X+9!Cmx6WPy7(1xV* z4=1&p9PEAo`P^@bz7m@F$n?{|bf@9%V9_NMs>}0{zfAaQAX%$xE@r;@mu*b>0T8v< zgZ(#r_1XL^j((ZlIWzH%rfpGl_ii#(VuGi8hTmY;GXiWS0Z0zp;JPIq_tW>^$4FBo z!Ti=vPu{)BYRO@Bkrk@Rwd`#DOlmr}_ZJnOg7EZ$8o@aa@IxFZG)-j0-Me;%3y<Qz z&a2c@dL#ef?zyU~CNPc1PjQ5AjScOxV;;oYyo%`2>X6~o{@!9chZEu&49Md=G>wY7 z>Z^|88LP38hT|f8ZOyhV&$_k&LYZhxo^$(__edLxQ?j-L1s~J<LoXPQH+4BrrWc_& zr{g`b5|zgo(w$(7#8F7n^umV6`E(~`BIERU>iFgnAz3l7dqghQ<0!!JozqjjqB4w| zIq|r4_8rfN<v0}WNaz5aAyJiEeFa4f)7_M>P*jt1GhP0mTYaFQDUb20pSTk>82Bg^ zq!wZc{R&`85{K1Wgi*k*dx$6b>CRcRP-S&7fN7V??P48ObX!o`5f>~$JOXv+4-czq z0@ErxG={2~l`#*n8%q}yXQC=WAqd8gu}{KJk7o+(MPZJTRP5LdRDgG=X;M{7*Go+4 z3W@|G))Qc%yx*ecN^>a;>}AkZg?aUupLpg>=Ibq8c?$K~%JJ&MZPZaw1TEU^2ir5y zO<m%&S-7mRRX>tsw)xy~&B5)Op{8QF^^5{XP-5Pj0Bu<?tUzGcNQ>Ub;M36A9m;?7 zOoP4PqQ-xi3hMi9VQHykh}LFLEGk~iC7*)C)Do==DF4{`v`6~ZyI@au-ocEZWg#&b z?u%`wkK+0`(VzMzIl1EvN?iuUC;yVxcr~HVfr1pX3;ENRcuyJ&lD{_yJ=lMQ_}lT8 zN>7a)TbG@j4~!^sTJ@{}Lpt+YRlx5&u=nEsP5*O)QGX1$AIT}54@o?=B3pR0*l(xp zHT%{ylwmI^Kgm00b5i$+<`tQgvQf=4L9R%i@WlITrXN<v;$1g8H2QR}u-jfuYh0sX ze)NMfS95re6wkDaD}C_bhtS{@nDBM_%FUorK5N6#n2<|&)s*6$MZW}DjJf&8hM6Z) z6*x2=IJ!{(k!>s=!FaFw65fZqhLT7XvG-O7l=|V{`P69%i2ic*yr^f}slUJQuO|Ur z6q@lN=uN=qyCVqnG7@d4nWy@IeO)@kWxLPwXuP7~EuT6#QNZ|kJYD1q(Bu{54<YjI zcZH5k^z^hw47f|Y{wCP*JA=JUfYoa*N2J>j#p<xR=9ez^-~#1_qavh#Uk4~F&TH8+ z^HCegy3x-JPR9H6wY)|7ZX<Y9kBB_;t=clG`ec@x^u<I~v*k)JbB28MS1p>Jt|W&Q z0O;`&d<A{VQo$O>v<gYAd638;E0rRH%Q!sz^48Tz7B{Ok0kxv{iq8!Fxrj6d4QKhV zEC*E$Q`)OE7z(#pHEgPkHzo1Udmnl`!7oPOl36Y|b(6XfjUBcy^BiJKI%Br>huQEL zLfJEgxsWB-m_o-1(KD2{nXhV4lUtR}-$XTygENlpR9!p!MK*}iTTgHt&PFPEBq zotK^QI8!O|#Hx3ujGvHmaflKW=!5Q7usj1%m>nb*PI;csoIQ~Aw}`3aP_q7fgPuHS zYw_QZCqKspt6iQr9;ak@+VfuBcEziYbznAD`Q+p@&59JGb6<!;nUyUW>!|Ae`L5@H ztsAM4ZeIy24pZ#=b|0-wd^eU*aaA{-{MIHm$b*_^KtHzp8g54EJQ{BblN_>TzoUBp zlAzLU=wnK@!QkxCcT*!$eUD)%7sXxg)!GKaH1^CUn{o0Iya*5LcZRjBhR>()Liunh z+ei&zbTe#|&$=IAW58kYQ1>PP{i7>~QsZ5cO(TpM*XVPR<~+Jv0E!xb##X6vlYa8Z z_L^=r@T5YG=cF2Io1=tAcDrv9#I+2FV^k0@{vIEsDP`3g*dmc@>8lr90nfzF78v|T zm<HR1dEDEyNn`!l5HsKB&`PL^#f^5HpMAW21wF!KL_b=eX^0;CwjZMa|5h4-h0NG` zWZ+K>7Ki5^m?d(XBeY5AhzQD?L4CkBtj<=j2spFd7Ku0;r#dSRVwWC`jj7LQs~`U7 zZ^i#vlm6ez`<H7HXmdGjmoH<C$nszWD!wZ;Y_d4R<Evt%oWzJ_A95)(;wOy!7OJP& zH};eVRNT57A-KxKAsE$NoCXRgNlGRrgj6o4PJ$1Pd~+DCnE-eWA93w&2G+JAxM7}- zVH9)9@`-7>sQZy?ly4)~o^%&40+YNmr1fgjgH^s|g~gQtwFopo)BPW6C?)5YdLd zhkHI73$qm_e}e}>rr!etI`%T+3?u%NtNrhJ%iej=pqpLd+|T~CgUfcK1J9P6RyWv_ z5%g3P|3WLFe8V<)UK+%wkwndi?;==1zb-pp<%wT1r7vG|XOBa!?JeA<GSDrAR{pT- zb{^~%74!on;v{ps5>xifdukb{ZPz4HStVfeu+!)me7{!FmU^u12N-`ry-l-yZXuZC zWA`%EtZxcK08V`M$N`G%9(md7-C)~gt$Oo98Sd~qu{-LVT$YD>idtrDtzvm;bZF(L z{I_`p6xMc7UY%}RZel<m4A4&3%2Du6RnX_AI6W<Kj-@k8BK%&~M+>Nr75w-|jehr- zi9Lo8mhr9}sxOBmY>8QZj7D*Y@vLN)-<NUO7Vf#43m>cTlj$L<GR0y<kS4J}<1g`I za|j^q)Udl){z_oL8LXB5s_j6V)vZeLiSyeanX0`dYY%M<N-1>hs4BSS<r!r3S0=JJ z(_AodVfHs2OQ^YAdyjb6>1L-+C4DWb4_liJ;ZAan)paj(k8()ajNvJ-{W^$v82+&x z5{++-`Ws*I{70-fUM|=nQ4;_ovm~u?X$mgkF?&`J#lb?b;A<@CBc*SSp)q?g)mx*I zW(G_`mF;_utY}#dW0$FgBGCG}7IA{$<OExSO<_<BHYEEykQ>Y#VejK9MmD=@{?@fZ z>W+fb0*>rYAOj(uP6mP3@KBEW4qMdxD$h%4&y<xcc@f~OI3KFG8PX!|f#XAHh$5q@ zL7Dr}jszC%_Q1o+MTT~}gxzsfFTLnl$hiLWE1^lgh-7zMdY&@>qq)7yRb`?4JNu?; z!1lZ4@cqqqP+QM{bpMagqCNs2+7Wm@=3AfRFvU=`CN};8^hOAPN-&^2w%uj|JqJVJ z+PX}UNr49DSj+d-k?bZYz7jBlU6>(*|C;_W2^js0D*8Kc{Ld$zFAz$36K%z#t>o(+ zX=jZ$Mh*3{WQw%5@F9b~?XHP$p*OW$MP{81VzMN#*uRokn|_-OGmQO)eJ`j{EEkXv zIauO(l>ms&s<{>}6)#?vI8)a=L=~WLWr{eP3oJs?w@DHmU??j)#E~29vZ5)mcS+^5 z0F)fGs2<dZ^fQ-H>9%5NPYG>bsxLq3#-K1-H-DDpR{ov$5y(az5rDt7BdU%2hg&76 z92aaH`Hjn<(W7f}LPcoIUVq&G2zd$SRSO=9iCTsMpouXP*t&6}Hspmt@vnO+4kzgO zg8cF0C7ap*L#(-3xF@;tBTgwZ<oH0z*+tW?u&J)};{~p}_N31AbH@)}Y9jLc-FGEK zu&a~`0HQd~>4L<c(lE)RkRI_EN^0X1=I>C^(9(~oU;GsiTEZ#6Bk|E6j<E$*V6Zr* zQ4plSKTrwfSb3k+WuTD4JhFC$CWv#BSwM`!OAnH|&=;e~={oq;@3Ty95K*}VRK=up z^S%~LE+yPiks%}7^Luyn3VtN$d$dw1{faoXmVkA$`Sx^%GETyuD@iC6akqjocNWdc zA)(1!>3uR<MdTu3fUB3}SW(k7YMGqcA{5<-S0x-gaBZefAV=e-2s%0a8jjxE-!T4a zz+H+lr=G;GbBy_0?}``s*-ouuZ}Va67l$tv!D#5d%>b~5YG)zQDc0|QujzHL>t2E1 z33w>C0pC}PGPOABjDg{W71&EK)oQ2t;J2w|S1RyAiMAfj#eYP-$;Er_pPg}RPo4ca zGJvzLG=SpF!-Y`@aOs+g#041B8u97O*dil{eKA$c5AjSEcV6ZjS70P^?$f`348dM7 zv{5<M_g(zrZnzC1?`~N5G$vi?7Ny72t4En}0aoxT#$+><vnTd)f3|6@xS;L(_>}Z~ zLwImdkqI-D&eL%Qfh3J76tDW4KK9&?c`;uL#Uhk>PEBmp?a7F>pAwC!25Hm+N$jb| zP=3RJ?e;D#xJ6VPDlv9jM4IOm$<(A11RVU?57qLpDAL)yGco;mN{mKcsY7&CD@<Tc z8Db1*Ue=jOuLKjCh35@b0YNDB0xJ!CUVv%Dex)BS_{!4c<nI)zc1j*1{brU>r;Iz6 zzMfIQoR0rM5Hz8@=?h#~7$6h|<dFVx;`hHM3uI7fF56#a-gzzk*fW)=J5%yG@6cm} zmW*4*>9Ke7;gR2^&uQecM&)F+@_;Eyqn#FK^eRDV=l1aCSA_Z*c!=-g6onDv-#A5m z1X^Pk`5W%m@6PsaWc7cQh9o-L*D?_)bFx<(1u~;YSA3&Oj9OIBljDgfTyts#Z~Rv$ zO3HW41KhubC&tF|Tzx(Z>m0r2d2bsxmGAxKZx@Q^F!_x4+#aql9^wC;L-4P;92kf( zm+K8frq4as+kkt((yMx2bc>rHEunnVLmJbNBvlcM*^o@pD<(r3DD%eS#$>>oGWTcp zC3|+ZH51)mm{*+SzpdEO#J;!H{v|y%IXSEc)x0>4Q&PIG;XeTI;$gm`gOo@t=+4(- z_&?k1pSu;__qk3(H3DSkaT|XBDA?(~qr!I7Zb^Z9*kCl_gqsSH8H9b%zPh7|ozZ|w ztL+`+3xzl%FT#??OC#9*0pLl&X8o3v(7lYkDt2%!R&UcQ*x*mYxcU}5wTNxz=$x*G zbU!N<)?dr`T`WAxg^XlFnIR^g9W>%kRgF$WE0QycZL?Hy&U>VFQc5|LH=!8sDFyq} z7J`M3xN*Q9&hQ4pki8w*9B8<8rI*$We@g2DAeF}vxWQl;d&!vZ{*+Pz{H);;;m?It zeiVl$Hr{cVF>I^RK))q_74S}@3~+xw)LD+_k$1IyaS2H+Nc^;wpvR7IFdvDXf^=LF zu*YK(a2c;Of42-hqZZQ;8(fA4M*<Wh4HZs4Ny5P4;oW8yRi%U-uV6&Ik%_F*x0v97 z&-Jj`Tfw2(#dNjZA4Eb5{SYRc!BSSaf)N3YV8nAmnd(G)s6!?VdauKm`QxO5{<a)0 zNT2pHj-bViG3=<lrR5#=2VWBks$I(ypof*=o0r1YudshFG)vE6q&_{w4Kd?ZZh<s* zN<Cp|XwhT5X6KZ+@%;y2q(m&_2Vj|fyp=#hz276|1n}i!Nl>~)uK<M=6ZBwpNTs%N z$RuWCj6q~lvg4=^HvK1f``p<@aE7je%6W$H=_s)h=&Dsc*aN32`<metHVK3-DQD$u zU$lWaktg*_Wc@g^Cr%Knex{29kZo`gMLhmWk{GsPfcJJX7ng(ah$+4dNFc=s76-*J z<oi7=(3_Q%j)Ak`qB(PSX85d?LJ@}=NsJ?OImA4?#DcB(zu316U<h!*ejf_CdK!u^ z?ss-s+BdR`91k9V=oWpLL~{%U;7G0-M{+>Rd@)YJ#AwhVjp)@Y6D@}1q_+!f=tFCN zBI_=pXN66!D9A@DI2|;5f24iw>7k+JVZ)>`-MQYIO!Q>?N@J<hmyl0H=-$3XG9XH0 zRN`;-4)v__I9LWAB;goXK;0@XaeU21l73p6gizv7CQbq{nEhS%cZr1^6!cBS=Ykk_ zI&^_k`frf;zfgLf4vf0tNA$D4BO`E26NB(o57n*PEDfGU2Zv{yvF_JCkX<WlOILJ) ztx4iH%OS=?Xq>9=!1vfgB{{jIW)`@L>Ldy{iszbQo`5x-%DmY#13+DRxEQry6~n^x znhSzKFRKRV^BR)fz0CEHD<fb{*{eMPQ*OkFDFbx73};lgBE}!sKr=3cXs&FlK7!*+ zqxurqXInKymem3((gk4(m%NKv`Tee^r+$gOH~%r3z8pH2F=$(p0biAPqO}_ppn6lm zer@pmN+Z!_Sl9bK*8h$p5b*jOu0_>>jZ9<aTeu{wG_!n=#{y#>d#ggXFX-Bmbc^?@ zp~Uyf&(GE;9?7<@gZdh=y)9H@H%Kumkr2C%#rO3I<ae5!7E;6=xkUtSZ+&3Yp#)3s zw6R?<w-iVI#D>5<>iIVImyZUWL-jHuDCcu9h%d;b!Sn??7yigAx3l>r?#rnBp;-<w z1SFHBY9HL$aPZyA?Udmjvq#xB(qGOfkKmJ2?&i4heg^2f4c=1;-8!ixinkO;n)cw$ z!kZ61E|vX0OrdB3Fce0iG<mc&L;WU#T#!Kb?}}2)<}78b7_(00;<aq4C-~A3bSOf@ zU}!v%B<@0+FIz&K<P!#^&`<U@1Ll>n+(kW^cX;QpC7%5@V<0e6cq{eC=q~tu9Mrn_ zOSi(Tpe@%&xL3R7+v2{9oSF727n}*CE>e9()er%KkyDsCc$k)f7{0|py$-<)ySLay zsWIcknUSoa$a19!w!xFP3hp*Y`V%II8RN~EfY*JX-SZ~Z>ua<#>ndJx2a9arl#rh2 z?X-}-?}LMiZ-q+z?#m87Cfu9c5tvvC*l<tFP&g}*`d#U!<~Cx)7C3ozsF?UF$>WP6 z#Z0JHQy6SaON_w-OZrbVgSE9}{!4;<p<8Z)`^tc~T}M~}Yc<q1XBfSnJC@*F{(#q5 z_=?2;guMT!<_6(M_Fl;6*%pW0`uHCp`U$#bt7=(cdPgsO$xjls4W1Q6dBM;*LA>c* z{1QMKV<-8`_C<<)@+dewpb(4dU`;4ieJ29F<m5n4+^|IYW>FlnWGkguAjhAk>|45Q z@sg9R?oYN4$rO2#xGbVW+^&kebcoUFdVPA*tQmXzOqag7%_ym}ptz+m<AOtq-+Ehp zg%J?vv&XnbT6uySW)y-#1BDMSefNqE9WFAYw$O}upTX#t0P6ptnEsR``P`cL872;0 z`#)K;-dQpgLEoQm#Xe)xeiqmAmz6y(hPwit{n*1w*pPLs?3Ygacp(Ad`eaiUjREh> zSf3Z04)14cRCS)ExWrx-OFS%`S`c{`FbnQp$I*b-e~s57fBHLDX1!sWPGt-&?iDP9 zy<)o=a)>0R()HX1(}9G9Hqw*<2iUqVyO3nMCNAA63^YjyO(ta&jdbsq@K>R58!*$) z?-vYzp_f^cIreWHeFI5i83%%wCIeAD4#pQm-Q|a=iKfb^CWX_i!R%3u$JAOC(2IIa zxF{Aop89uD=XQ@UpJVrxWoTT9zOtc!t`h6Pc-k3us0w4#wZ#aF9TFHEhUuhfq2DZ% zaSukfPQch=#tEc)a+^Ay^tlsdsFs^DQZK|Cx9~aoy&}kC$n^;PEz}%xCF(e)!;pD! z9%o0E;O49q_RiG-I20}ZK&ev#NTl~nzCSoM8e1y0r9v~S13}O<(&BeIrRi9)-!MrO zg}<(p3%Kx>@Pubn`^T3&^l4yxGja3Rvy#E+H~!sLo&2YudivXn!IAW))&LA!(G|kM z>^J196<0h2xx1nGrpA(erdEmw?y?&baR&<P5R#?vRA+a?FRo{slPH=?8%Fuddvn3i zZHSLY{oA1dKgo#1Cbh`3lcOLiGb7iOVhR`wbuxdd1ccquOL`lh+kTeOddsmugT{Nv zsvD^BAzdlJK}Huo!DjY;!Np0E<y@;)rNj2xTH@pC9h1Z~7&)}~G;p2f&H`M>eK7Gr z04k1jxP(H+A$dB{7tU&<_M=hbqsHa&=DkHF^axTdSY6Kyg(!&S-v(t=L-yeXwxYed z)L%O3urxSvWB2AiVXyoP$ut`x<jY8j1Do`+YGPyGGZja>w(uu^easZ_)SG@55nYvz z*^Mv34l+(AE6|672+e@JV%w)YOX71Fos}XMc9DR-YSl6jVIz)s6k=!pu^<`L2oyZF zbJUvl**Gw3aDUL_%x#$Hx;njTR_6YPLiX>IA4D!y;J;P1Xew~s;$Pr|_hVD{o1d^P z+Dl4IhdtwEy5)owJf|eu#ZdOsbT}5|<s`9`wdWc~jult(t}{+1oL#vbU&e*4W2~{M z38$SFnIo^2vn@G@eYK{;`$o}T+@2HAQN^0Db=Bnb)%<3bl6pV5n8uRo@Q5sG_JU~U zE3aFp^*u$!!8ug8fi2IojIErbjD*htv`K1ALC<FuP^-ag-Augu@po}*D}!w2{%L|W zO#C1DCsY!ZwDHb>x|g>@3&&T0%6+SIhW;}AZmDgMbb{iJSW%N!JQ`(d+fiCvWdzg3 z`@5F%zwNmni!nXlfqxv52%tT8!}U}8()%j<63_l3{;$lf!?k4GAAoSU&nYRydk-D- za%^8C73UuqPAWG`$u61A{Izf>w#VUfBT)znm-b(17}B+oNMR?Wfw4J7eI-Vt-6r(h z6{{y9M{8xkEpWdkA6hCuc7#j~<KF2#h?pO%x1{E4>~{~q9S||h&>`d2?G*VduunS0 z{D_>4i0g{im^v;YZ4#mHn*5pw=0uYeihj~TBh_C}2bYIS!9Ge~p6RoWD0M1GZ;f5I zRckH{QiRu&eSE)Az|t>DVE1C2nSI_-%NKOEt-i2~7)FLA2!GGMUksCM)ssp;f24MX z@kZof`Z+=e%+chK8pv;Rixe9lw;1Oc7Gzq)di=K+z-1AQwQ6)1_gUy<I?n+%@b<TR z*e~3+-7fA&Clm+6qM4EqEOsTvm~%TpK~4l|TG1LGi9#1DVlISV%`P#EuxinT1i6IA zLqv5f6*NufigRT*0D&ATMCf4PZ1k!M2;q|SuazM7Ehz${h<f7JNXjRflw_KN*^NW8 zpsh{rt%RGO9H#1%lB0TB3)r)IJg;#~s&3e;Uy@o?>927AbO{QKV<V#YnKQ#pd;ohN zgY0mgZi(w5YF<li7rGvpdg7fnvSdc~h$xCcKOOr8cf?QVgX>?DlZS|T^hFcz@)K2* zlu)h<Pc;;>LdfVb=!9EuF1dO|pdp3`sCd;N>(2&JP;juj!ec07TOh93d+B+9s;=;< zNywsmlGmhHGC&xRkS)e@SHRBI=3z03K7dQVeP7~3LEb#A)7W3&nhnt!J)>m-{ZEo) zTQEMg%qBa{mJ^gcERH6RGhQjmLQ~&gEmhDB;XcPQwAVA{%hNsn@Dj#Kac>H2Y*0a< z{G^CHO3GLIc(64f|K6eXx1RI=)bPLHDvub%m~f|upyT%5&KRYSGa)cKGKp87?LIkK zXb1@izWc>fbUl~%h3Tc+s{g?I;Z=O)ht53MxikG;ARlgtDYJn`<u8_if%YDw?2K`) z<zy>eGl+KKyl5`fMkY5LEQv#Vz{UD28{fb#R3YNWkcC^0;^i0^z+fahyN^Q7>61$U znrO8EamkB4V%?rqz^xVe<XHCXhgc}A9&-LW_{4qM<Dc$pn_S~5(PFm$yrkkN!RYg6 zc+-9y75v?g_^)e=hXL%~G#$zRE#d&U>XE%T>uZyF`kmP4F`W^HUnz8*u#+Ivi;&f4 ze@rM=>+SPfzkc*%H#UJ0OHeGm9VTT}1W;olftm0iZhz$V-`hFd)X&$(Iy@L;;I(~_ zqW(51oATByvFRNG{~UbH59+RY)QNhJ9kZFx7ya8zRRn|dagJzjdp6t>GFm{Tz=N%= zr)Q7ZLzd9U$?WV*MP)ag0%HLabQq1DP|A0!BN4?p(vd#15@56jGb;6PmX*;hHYlch zay{BjvjFU*So?(RRQR>mksZx@2)Vy1gGUN?mUrsaa=YQ*M{u;1(H{;<!*z=;f5mge zw-ClAb9JW2U=!e*!EfhW7KOfH>2Ky$gslS0@|=uwR&i*rZrG}RSOk3~?PkSHZlM?` zL_!xotrOosP{AmYmeKqw3F3Z)oFhzh_d{A5CO;B#j8z{}85KzZyf)M)3JT#G&!top z$iiHlqqHm5J;1Ez4b+ZPiP2A}u#mpc(>M1{o73~f4j|>SjN)*6d?^aL^Ry9gGMY_M z4VBPyrfDA%UH2mOT-iWgDVyzUh+Ckb$%zgStD_2dLg{P0S3Jyl16TdHIAsrFG~j{I zz;T%EHFoQGuSkTVRbkY3CWG|1?~xF1(R$8+X}DAE3`%No2&vx&VIS4>?!8}UqdAwq z_ZM9u%!czZeiI8?0mv7kH0G>wh)8J&<#y*gM{VpkX(w2Ss&BI&RDPmFpuRGDOupt> ze&kjBXkj5xlID_VZ~9#BEw-1`NH176*%iSgi-p5ew64|5+g2m;-8nXs%iMzGKbt*8 z-Vdr76KH4OWror$tgZ?NN8rt+ZT#hC2uFc76P_+nwvn0a>w62|@+jQSLzC~cNt1w$ zalOiU04vU6^b;M7Wk3uRFx)2dtpHRU4B7>c@s5cKF~M;8yY7@@F0b0Ux2^LDMr^+9 zI=P1igS<+yb;w<6o%e4yc3tZ%&i|d7W&rzr89-u+r^JG!XMn7jg}X55v8byl>_+3@ z(lTBJ3mke(EPEt|x@k;QjZ<ZF$(UrpATucvZ`A*0dk^Vy+|nII(EW!JfOC{PyZ3dM z#d2SRwN)ysD0f}~4Zg5ZEhDzIRx{0Dt(0KYmL&li8t*81!RfuNV)Xa%C`J`4A|+2G zMq_Z04$_!{!<2m)JsRZ711&PFAjJ_%?tuAnx}W1F>6er1bPx^UYtQ(OZ-1Y#BjARB zdn<c&#&3+%`ky>s&}pd1^N`PD&nYHNn*2vGWe0~@#|QRt^<Bb?0wuUs-kbPE1$1Jl z|M2c8y+QkZqa*&hvt@e67-rCJjEKe*@!Lcgv+t2~`ho5Jii_JEhUJ8Vvq>wDS8rHA zUt)zcxwR29hM~oIa2&q{6-)Q0ju>UYJL%E~rST7jtZkwa6Gw-Ye#i`|on!%(x|(-e z@Y!cN5qUImYBx0AY_wKb^_WsS5}*X+R0mQjXT?o=&us_asO1(K3|_8)+rV6X9Pvot zW;{B-S=QkRV3L29_hGXZ1Ts9&njcihl~3V|h?2nRsXB&XC~tbl@=S_lffp5?(0toM zl3ED5<Zlr_=n;A2>4jgnegk)yw8QTrhn>>+wh&q295`8d+skw&On@_I8kKRkQ{BF- zf5DJTMJ%sA)hViWKV(^>scBotb@{Of?n*UEbZ)n?Vl2h`N_%H;_+DP^zW=1)vMXun zm}7wxnxuw!osNFUS|WZq8$0Abt%oTKmFjo+-MX!7EBCodW+&Vh#aTp`HXSOA<|x*L z6qM}l21TIJL!8N7l&lEUhfXN_$#%ID5gn!QD6lztKxJpG|6nN3s`qMjn4oyT^Ehk< zLp8Fq;6u(|Y$mnkEJ|Zs!N_ftx}qs;k-pTgTL^n=|D?wvj)@}_;f$s)EsMXl^e@Ag ztd~Kbflxu;Fkvb@OT-YSxpqdf1u|yHHVR@%U(7n*d4&$kyr;kJeZ0t>q)#w`$hrQG zrBDX{q;9)Y&6eGnUM6}JmX1pEpVbBnTURgufqLe1PUh&cjcYw1W0aKQZoiMAkEzV9 z!U2k>w}<U&1GF)K-e{s=5lS-Bvfu;m5lg?|)&GROGr)5i0{6xeW=9_U%#b4#JEjqO znA@AQ4?f1w&Xc%+@x>(gmcbE;z$DqPy}9}E&tWdF-^te5B+q9U0LqF-fFe!q+^~fm zKY29%{S4qaD{nv+0j$&x0{==|D*&dg`R|I`O8jTV`!^m3PKLdZ)n{A+E`9?Uv-t^c zxh^N0*{J{*X&y?Pv02QlyC0I8iORyOGubfc;*~GiFtS>qLJ>`~ochGmZ7y3J5EK;_ z{Ki>_4dFj4Cr;XfRySH^+=0{rvyM)oLWfuMH&e{(=2Ts@((@|v8Q`X}Oh}W{!U17p z6!R9c*>4hgUx~8Jw2<0Gb5^u9=$Ca7-PYP!7LbIUp6Ej!Xxze%M(cm!=Ld@F0??gj zlf^NL37b4W;FY>Q^F*zGB>kODV-+blB@X*#bj0^hUlr&o6Fu8>TVb9g)lZOj50@WY z8w-QZ*Iv32KPqRy2Hfh7JAT^g3V#5sXt%b@#W>@^!6e?__rhL<uczqaH}u!P#!qLx zl+F5!mTdYp4uu7jyEd|Ns}<gR0|Qe*A0m3?Rue+t(NiB%zxHV!ja|WcaF={EB&%va zEoEtYvvgOD(iuI!h!oCLMzKBURkYDQkC&M9wTo5s5xGC&bvPQYC2UDi{4r8Z>qI=h zEhR;?VSm<4yDW`<t-<3oyPkJ;D_y#*k$tlYHouY>b35V~&^BPCeE%*<PTcX47eydw zlc-2yiG`g%aZ*jHQ2%v+i=@A%=_@bdirCg_!x%+l&%jZ#D$*-%9vU}aDh`jqimmKj z#M49!4O$p7WVP^e8v7%buGd(X#^LX5vm}31G}+xgL<lq|+Mkp{CM<!BZg|s7pW1c1 zJa|;kvf^b)TV;FVtyZ-`QCgAE_(ywWZe|lEm-BdRuWq!^$ELJ}k8v`BOU5v&M{8uc zJa(dVZhu;k;_#|h59vF^LS<s;MF~bIMRyN(!z~EJFbCm)iC&;`-t!ccq8i?mh+ene z?bDOUD2U#+?2|amG$^kgye4^!ctSOi^YpFGM+G>{Ppw89b5<Eg^q3ycGd=Vqpi3S$ z2XRmeDeH`UC31i?cD-Un!$-;=p=&>YO>@mxO*Aln5dkc8fo_WJP^~Wehr+02QePvK z5NS^9;23zv-AXbG=97ywNe!;g+U3=pW!5=fPM^+OR2~2hx63c0i=*QFPLXAOO`18| z{46j~PgRGwVNK{Pm1OM0AiiEn{j;;_!)TYEBqmoYj7+8DS?m}PX@_+QXxz0q-H>`G z;6ktj2|a!SqxL0%*a#|@S{+8wXL}rSbu=T|Z&#HyHT2Vd7n9UVXGL?DZmv~0LBcUk zH$@Of^dS1ZTj0CO+OOFCj-OMP>JN1yl|KJ`n*Zus<FJDE>ptOr1{5=9eU0gK{Z%OI z)5B6uIMOg?4R$UW00iPJuM{F?r|<IMuM50$qh;Hcb^WX*{oklKM$KE7t!I9R+QApg zxV81uffZ&thZ^UIYzbbRC=KB5gWZS2{7Q0co!AzZ>0y;&2bM<`;vgjt!Vf%`^wpOe z(dOVG`=yzp0yff4w&b7zVjMT~HWg!|aNB2u6zJHqdftV{fM)-v!kq_xr0m?)zZYwP zDwM0~N`We=(vZI=Y5kWL2Sq+p9}vN?S~_Z8^QBo_zU%W0P5nqS4ViJ5Bnq3MV<BFD z^)rZ@Y4dgbD;!UdEaWd#P?Z4Ur@PL-Y+B61FNv{@8rNdr50@@%pvNA+a(amvRv>?W z5HiAzf0*Od*Br^~VOM}maQYJpda5s)P9s89YeJh5G-XCcyE~x<`}QMV?EHcTJE^OB zk$*X71AyXcD^Ps*2>t~<SPpMi0Z<$@oL=rbm-Gary`P?dz(0pC5STAzJK?P2$rcO< zE=a<^IH(GD^Xtg^{1*19leec0tZwyqP3JIUZjKId>z^_{e>x5|)<mMQ+C}i$(L*+N zY~CEOK=TsHGF!I3eUpRk?6g#QMy?~rBhP_f&_Q#=qu}4hgNv#kvzScaA5H^U@u$e< zSj-onb>?Vr-4a39+-Zhg5ZkqQq{_=NDueEq2tKpl?OF$9Iy=*@Zf9#fcoZ@ORw(<l zx730D`K}qW<n9x}=+~1PL?Sy{K>i~*J8UF?UC#?&wC#!ub~6R!*OWniV$WoYpn%H} zPdAp+x5)J*s|t)@h>I9cBk@pjg1J`ea4wTpgZb>_P;mPek*4;ocq=)ox$r0grB$IJ z-aav;uy_2$gD`f|&9O)U`ehflC~5_PwK+SOd!S-fn@-as0A>iWjCCdngW^G}Cz)d` z*Ir*5NQ<3_gAx$cbNVZ+cG9~?RmI&9COYZpml*g4-ZW`7f(D4xuGvp+unNy-3$?f9 zGo$u+qBhWxyCHM+-w$dJAm*O9@ioV0mw`C_D)>RQ@Q-33!|eydskykIL1;Y*k@p0$ zD8!!M>&Q_00bN@tJF5aMoz#2!3AU(Cmt%H59kR6+x6cg%&AgI&%iH&RAENH_nIT0Y zK_*YVzZJ!Nw<~B>2Oo$0kLOHbx!gtpc1FQ11dG|(_mkZ5%6U10hg?nN8qMQlrvBwy z0bai%3%g>kAnjB$-n+rw)Px9j7Y_vv0dLZdW@`U`*61PM>(B0Nftx{f|J&RAcN?$W z&|-Y=Q<o!Z((dVApps{Tb8xmcX;;G@xA5g~<!3a@Nz%Xu=|~AK=&Gixi!jAaDvUUa z{aK5WCeByRK=f9w&ffH#vki{bsgUBY7BP}Z$P3nME2OSrx$C0P2{>uo+kwd&6K4<J z#Cafp_FQCi`YfqJ;2{SNd(~YF&5hOtM|+p>>`VyZU%C<HZAWMc4``>9;>LY0Hh?<y zjUS!H-zWnf3z*RO34+GLQ>TAwwfP{B{I3*&!wt~yW{x-<U+v^?f6|+r$B~Z1RM02N z45q?=ZHUXz*MJjj`_fB&@zRRV{K>^$2z?D4iv&8cZ`Y-TU-P*A&p$Q^a<yafZBN*T za|i@=@;5lCv4;jx{W4c{V^k5fGdd=qsm7RoAE$=bJj$c>%5WH2JkOD$dJyVnEc)Wt zI%>?^A<et>`H+fh_oama!;$s}A5jTuSfay_^}z+q<YBQ~PbI7d^zN~{h^8Wr*e2%g zhWxXk#+~yMePABM-b<kj342KGJ3T^;c_pOsCM8#%@eRcgo4K2grbaxJVWn%%4le2| zzS8N8Cf=eN(YMY}Sv+XwDbk|8C^TU7NOX%Q$dlli=D0>sqasTeFCls$jo3G%m(Tio z?*Bo0B+tSkt39X9<{-;6_B?hExA#EEPaKNOV*h>Yx1I?35;Ps8Q+kPXsuXx6!{!?F z(<0)f9@QOxzJ}?J2#MXJ?&`XK*4#zuCh1Yk+t^c=2P40b+cC@*wwv{4gzLQ$8=;RH z7oSXU`qi9T{}J)?-F4rGR{>wP&z1%@BC{Xzoke`dbU>U11;H?`q?S2lRQ8pS+M(NZ zlVm!Go<KG|U`>o{R&rx3bh=nF4;9>*4<0f!DRnZ|4@~280J>1OJ|No02CL;ebNVzU z*QJH1o$gA1M~{-&BZm6jJ%mx&8JZr=$>~$?7lMq3o8YOE9D7XlBuzO`@%+w6_82ME zFH~f1eaFn^8tG=*Xs$RBTyC=A<01Ql6VxOW(^Y6O>#<Ao5v)Yqx>)YA!Wt&Re~Q<P zjFBv&-$V8vhM_3qrp;*z_Lx>ZqcGX-)0qTBBmN)0-YP1tZrd6~gN1_N?v~&Lhv4oI z+}+)waCe8oHMm29L*eeh-Q6WP{Olw9p4|4e{aCA>)~r@zj?qV#i2DR6A=!a#O3=eE zs$>sqGn6bEC~Xz5U1ie_Ry8w<pt%y7?94HFTe&H?Ka3XEwhXq-9u9}KmfSj--?Z8f z_%+W?M$cb_xH7(VIoQwElRrV^y$zt6aNv!dwK*N1EVd^Wk2$y0GG|}jDySv5si6WI z9J?My0LWggU3c~E-WWs;#!k(wVg*wfuc5w<k3|`rx&P70LOdKI`R!#}zMts#!;pGl z?8^+zQYe$Z3Q%?WgQQNg0P-!zPvk6-1_SJ+(tT^F%^%6c?yA3wyKsl2aJ7E^#BU}H zJEip4H~R1cozuAbg#DA0T3chXOOF!_CgOa&)`|YuHcedgukIl>Rg|K<ihu$H|N8TN z<)`azb?ymi!^NyXxW}WdI$3lu?%@U4!jb)Q7Y6$KDg0`Hab;}~f(z&Q=tBwj2a2|% zOt?~tf|4Bf=Mokb{=doB6V5Q*;>y{FMpMuKPz>BHQPq8RP%bR#aUVsdO}GxFKuP&4 zTC^Ic9W_?by8)d;elB5~3i%ipYy4iPf54tkJ3MbGxNgYqP5iUUFxdw1+OJpQ9rw%p z9xnS|Z~t_!Xr`jOcsK@>f#1_r?7hqJoEL?@yfBD;m*29%)4rOY@)NA?BV8pSF({+2 zw{cL94N9lgk+};VAFTDwgZ{%<A8<HdI~4xARwV#d^;{dLkH{*4=Mnulj$_SEVukW4 z$$!%GtL~>;H9#<Cl!@t7o_EILhzAGlT%9vAVZ3;|ZkSl__?6Y#V(V@v=H(<<f64@2 z4h44j1G@Cu@+N0^JNa;yXL6-m;+UX>s78b)DtIW*<?A>llRYz^qfc)rmrPxc9(ffl zt|z_E;M{J?c(xE){JNJX@^o`vC36IR0Ukvfpq@5(G}#F`5Y}*Be>IuB9bJnYaUBZH zPC%bCykq7D4Ee+?(@qL(PT6s^94%OB0UvcSAufp=n!b6?Jcg1}Q}OaNAuVbrIHkP& zfqSDDWiJAjCJtZh4x&&j`;~%<Yf1dk{o|LmrgF?VHc)9fG5Bi|KFprGgond93;OBe z4C~6_K3E{jK;=T5hds0?Rf3K$r$@Hwk@Yg>HERRl3vFvA-LhDsrMw<Pif`*yLhQS- zp6031_aI0mzy&Q(Q`pF#$?1Ido<_z3JO@UG{i=Ds-mXzcp!<f7zbl}1`BpAfa>X_c z?gVfHYn_+|9@cUK^R21y@e7tv?dEZn9`xK%kvdSZoXTE~^{(p(W}j`kklG#fgCja< z8jn?~#`mO0Q1+~@pXqm#%j>Z_YP>EZk1NM4`Ksk}I<AJ~Ri2&>lAJ!6U7^VgpPnAY z@KAH)EU)r~OMxfz7zHppeA(vH_!nn3pfi&fU;PI^&A*k8`+R5GD`W&N`d-z6B;i;8 z=1u;s>?5Fun$7X`ConBK(9TRQzpxPcwx+Zzkua{#9sGU{TEVqs%QdtaO5mE273gX9 z{c!F@O+tTOyf4HN92`72o)RDH5BI#L+w?>0W=^7ecC&7zd4%1+q9}_u$)PZvFdfQ& zK0W;yUq)2=1KOK!)z(~|;X*5t^&8MNpWoa4$H5&p?b}9R;<?B7>Im1rP16XlVIr2^ zv|k)>>teqD16D>Zs?WFn^i-|;d}ep;DGrpzepapGbgioD?SLbs#x<!>Wf1Qh4ek^- z=lTEqXI|%IFfczuO>o1MIlgWbGw@#2>bXC6`SNqC`QPz$tiHQ=sEt}A{eiv3euvCb zv!WaB?T3GP(SLpy<xfI>>0R1o*qlQQZ!}b`ITh_mese)<N%ng@w&?8eN9;j92Qe25 zZ_O+`#h>o7fNg1ij5E<nYirry95?ko?Y4B`9@$Aid^pDrZKB?Y+1%C8tOgfKkk4#> zH1ElpM5mi-pz3;I_TARp{~*P;{P^vT8zq^w6B)mXVA1tk7YQ{5VJQbnsTCPUSY4nT zzqh7^vCWpq*8$pt09+(2%1z_cMG6#X>n%MrjrrM@f@_euZ5SXjW~C+fD4`f+1v15& zl?e%zpkq4hV$bkv8%xXGw-uF?EB~rlY49R`Sa_awlYY{Te%0@#4z<=C8gO-~HyCi$ zz*hoJ(JVFX;W98)7|)8$n0FwmGy4)LtSrXqLK`^J5h!GWKShe#5h#L;IDMgNIDON= z96m$gkxP&8-ENalO50$^d?xXeP8`i!B=(KT`HO^bolv#3DfF%3cT>h<sufKzHdRg2 zr+_La$$1#5+X#e<ME0YX7SA^2L$@K)KGdoo^qFhuyJraXzSAe0!HN-pKlrep{33Ui zB2czbRpUDAgHoC%Ge_MT5v3urV@4cftuVHwA?o};Er3yTm(E^GIN!XBIP0~iEsB2q zDC`1#F!-ZNGHkeAd)^8CEyJ{RGCQVUUKchrbyX-3Okq8^?f;7l0y34ijxGJ2g$;xV zuEcxZJRHxw7G(SaaSes_D*m&5R|&pzfpPfg$eLX%A!n%HorQ@0-1p*0*6jGQ2`3&? z#uUVmT>mf|>w}T0oBR1LWOq;1`?@*$^mLc-9k15HnXRC+D*gJg>E6Hl(miS_50*bn zbZAn*;@}DH>%$$v4|xA?E^sD!6KjqmZ_j^P$Fsnq70%WF%6R%0hb2Gfox}1yH84c= zuXgs|8?bjWb70^qsJ(a8jD>cV6Q%gId)J-kS5L$gi?{i7Ay!(DB^pn<BgW=n?~EQ# zB!(YkxEoP(a?hX>9^SZ6o?UUe4<Buq-tvL}pRm2wE!q3VE&{iTPRW@x6P{zP?fTRF zjH~pRps%C7QVCKptBPo|3aGuBrv~nZgt<GyBGN?P9su%w<7qBQg3aD7pJ|U5`H;6| zFAHLt5G{zX`6rqjEDyFU1}?P7kBOz#>|*yBa9Xt`*}nmJsuHuWog}>aw-a-oEOWF@ z|K_Q4vcumG7{`o-x%^XF1Hosg>pN|AuZtJvCk~y{NG$jsg1X}`;t4<8&-BvbdOhdZ zjp-IeKP`CnJb3wRR`ortApw|DJ59O2C44GD7u~Q3gD3%`cpY{3$*<lnkP}xnjtpH# za~U0FjLu#jde_5hp690$*h2%UZqUkAbxB7+JFvsgOS)}(lH!O^Uj;dSTydlP_?S}N zNtTJ1qE0>cMgLjM=O7NDo$lRpo&j-f0{I+UCzmL>FQif;iU*?I^2<JwYK(%H2};1I zkmo8<FKH?CD6=`z9bFjZD_|SnmR@59AKlmbJo9)(V8|o?oSZ$LTT=v9(@IO+*91@B zSoF7h-qVfnfN6^yV6n?Y(pzIp&fuQ3_rck8M29xd9QKGPx08}W_@{7#LHZGC2trQz z_gka$@vpK}Neig$d!MsIapZjQX7HmZf$7t%ZSpg!g^jvQ5o?exJ7fqIb?+W26~mH^ z^8)UKQhbCCA(1blyO1b?<~l@zORwoa{T-7wtO3rFde@kg*+4l}Drdk$O6VUuvLKyW z3qN6Z;lOZ$;cVWpB78;)D8~sPu8u-ZO`cctDg;6@3O#JrfS4Njx+S9Ol|`;UDv@#g zNHq5F^A(#<*F5s^O`Tq=q@d0saN17u7F)6gy$pvgMd(uW(+0Y!-N@)Js!rkJ#fct4 zO!;op2e4XGYsos#^@-k%=MkgIB^xGd8fMg&u1X$#=A0~MHTfAJ$=7XY?~b0&0<g^+ zJ!*LOG~%l(8Y*XRXICq3(E~8pI5lkE=r!Ow<}czZI;SUJHRkOO`YtS;EX?cz&hfqA z&lr66euS)Ub(Q@u7r-nN)m7j<fEyV<8{p-It!(5Ob&|^>e{yCc`y8H^KUGJ{_GsBD z`r~dtviu2dV-Io4tyW$2x}{~&!PX!^sLSOWx7*ij&CJ(iFmLPm$ZoUKc82Xz>!~Z* zOLz44ZNSTMwY0&T6es)(Quu@^tBeFh(3@J8-Q-tW-t_wYiMPSG2gc+VtBJJNf54~y zhcmKK@=3jIdq3<2-)1xOM^0UM^3p(Fcn;AKha^y#y2`Ej`mO%%tSdo#-&@^nV$}N# zT^*toNr40skwPSbtTZU0kclosStR}^Oh&wQ;YpJ<$go+v)KMkDanVHWIre*%vQjN= zRa1UK$)FHTaIMU6gL(qxl43Wi;!T*f5{zH~gdjxZe8+kF^}(UI&-z^!pZ8<t?{7}$ z44}xqd7RO2FInd<KHe>64f1b$tpc+1#Ve+0u(TlF_DNSa6VGhliRO$iP_WQZHNIo* z-196pK4Xjo9@Ipuo!9zySTpHBpf?eK)K2H2R+T3l-AZlw*R5Ub0py@KY1j}@Sf9l? z1^@B-0}FJlm%FQTBgfe=rg&Zcp~zc(`fYrND#4_!#eL@}qTEDm>|^g>UcceMCunv) z30gvcGfXJ$7GXy#T{$&4>D%LYk5*am-w1zJh@UD%$M2Yun7@Ns{&n)Ulu)zM*nigF zzTGBA+DtAe<$w<;m%0oya+>M%D#3Ew%WikT6nn1%e|u;v>8e?C)`txgySJVk*@^7y ztm6){3vTh;s*(AQD}4F4jJLCC>9_rRV~rfCX`ny_?!=L-z4!hid&J8$ZI+)364V7* znnJCf;R848MiEAhg6|Zpa_TzmFV{kP6MspX_A7>&^%NW#<22h!eOF4RuT%5ZF_UqY zbWih0kkgEczTsto>3%d$gU7?&Poh0azNJaTi5+d&RUh7&M4~&Z%@@rejAd6wDvA?b znwOCxu${OS+!||3x~;hy+ZTQUP#tw4NuEkTzx?}Kn#tayhH~ULsnCIXqPh1-8IJMg za|yp;5mpMSO^pMft1ey0$)l-pqY2-2ggC6uM##hi2Vwa}cDSzb)*&Ki&0LvL=fMM< zoC@n(aZ3RCS9=4Q6?@M9v0M%a!;eq1Waf9Ytu!JZn}H@G2kKhaQEGJggmpmmo?NkM zcT_z3-OYPz2Ya|q8yRVsgdqf|;#<b4S}S}TbNq4ys4OOCgkXlG>%NeXri71@{5ZdU z7?2BzTE5vjBxH<nm;&dl$>_WZ5Ytpkz}=7`r3M%5f;C967w%n4u(4`o_YIawgr95h zVD0hi-tBiq)=kbBqQf}sH9m6}`>&39Lhk1x3VYBN?h|g-?~t{Nkjj}&{#?-?4t1#^ zB#6r~O7v>YR=m_#@EW1mcMA`x#<&qYxA#MldvRy>N#x~lwKhx4KC(=@tCk1dmqGI4 zkCs3&EwllhB&cvHr73-<B2n%FI;!bFlx6pOunV0-hq7c_M5EUPu<pkc!u0VhT!SE` zZ4ltl*m@ECW5^^-@zzZ@NmNn~TPeuTj^R%$-PlJt!PC8{6xhMxA?w;EAA6>38K#$9 za)3iq&>IgUA{Une<a-bRQ`bRw^ok5&-YbjGPg3UI6zCYY&w;#qGIDF)ck9pMZ`%)W z;GQp5!k_N{kmX|ff!pt`od0PB;GYrO$&&N(5UcifhVl&bajcf#8oFxvxvCXdMbKU) znUij|wQBDC&7QOD5g&dz6h_-g-lnsDKA0&RrZq1nm`G<;F_p)I!g@?%LD8xupUr=$ zS&?bYnscH!`HtTQbrXbFZtH0ircz0w>Kmp~mH9mHf+j*O0hK!Fpw`sw3oLh!&g>z8 zDlo9OvCOI{!?^WnmX-kT2xE}!d>EQC=j^PYXT)X1&sjH>vUj_u2)BhcIy}a^Sb;Oj zp_R1g%p3Dq2vj+i?!*V8I$UA<dTxUsc@%?`Oa5ZiUW5qcp2w$gV8C;$|HCQ71PNqM zygka#g5Gg;jm<J50$_Py+|S4_wN2SR=70h=wNKi2Xsqf?7heUM`1V;^4u*rQR8mHK zZx^>>eb3LTUyrBA?e1RwRTWx9H-<TK?)Tna!ja@(9b10!dpIerCXaJ8pd@7RE<$W` z$Wz0vB_fwWWXdo}ZQY>F&nx(*L64rMm%loKN<3QgLuiA4i3;CK&B1`;b&nV^Z*3R} z455l5Etp;bPmN=79^is9Q?c68GbA$9dXLov@VjwJuw$hFv^MU~DO6biiNU>m{W5z~ zLe1)mRSc~i8v%+cjtN%_)pU$*ozO3Kj>GMnkm^}QYVl7*pQ8vtFDs-7442|prXRea z8``14pK|gly+VQ=slDvX8pn?w(T()YA>OF&HSEfoiM!w<R@dS`-~vzdaKyk>_pUFH zEB-+Eii;>S{>Rlvgo;p^UMUf)QLOm}j%zkFTbtEt4IN>E;JBrwjJDsTp%Z8tJ-o7+ zUA(K~g8>k3Kt}|MkTVF2M?p*3CP>n-WYsZ~1y=!6LN`Dh!USSdEkf=TS`>5?FU*Qi z$NhnmlfZJ5W&gTYQo?uAmk8jrvsln{*8)Wj>~2co##p|l9VHtu?U!^PuoSY0flog} zR=riIW0fSv_H$09qqpq>m}YZX^~?q78PNe`^_&1TKT&9-L?6fFdda}8P~+l93i$-; z@Ss2lh&f6ahA$=|{T?!+;XiQ_Z5*#M%g)MFfHmZpzCnv*`Ml@E=fyHM*-6c^^qiMN zOi_PG!{xoEd|a8}jiFYWD5{%)z<T@x0vadQ+n_wLk{O`oZIa_`9@r!mfhb^d!Igu3 zZDJ7CdQhH7JHmw_aIm_XE8f8rxKj>uvf($ajg_&@eBb`ttC<Fo_0JyC<8U0>@q*7r z-e#t|g@)QSfy0+1crg)@6ch3^moZ)vA4ZuC#P1&%!)ea13DzA)Z<8(I(Q}$sCqwc^ zSrmMkot?ioSiGE_KfUHWYWZH@q<xKPVgCmV?cei>EfrKB|C?Fw>n;0vNZvZ(vYYJ5 zw}Mo|>I(dy3)^Mj*GlPq_KxU)5FmIck}p#|^$SIwLIPGZdU<<jh~AbH`~F(GRT`^G zz_*W4Hu|u?<|@~Z0k{!ubO#C228(QmZo7r(XDziWw*v}JHV9{EQsd?HsH;d3{;)md z{E7y85HcU_=!@jhubAM(o1IR8(_zIS1TDge!gB-zAul7rzLH_K9;6XY&Wxk>cWI4c z<}_V$35_jWVGEi=D@|}5GVTy%w<vF#4`u(qt^YBG|KK%W_3wD|rN6<&|N69I2y-R> zt>bycE|r)oy8n-Ay~u!`ngw0K@O!`qfEJ~~bn)PII0IcW^N#CK%iu_JmJ!VAeG;hk zwqZs^{A|y{-92r!KB!U!?}d*FaeMc``1~9x|Dxo{T}?cA{3I56xktA+d^|+94Ap3s z76r<Eohx~1g|wwN?-aR#O-oUGN*l1U=nQ!ed!rGcMlSD^S(Q`NvsdelZQ61({p94Y zmv=kO<KQ^fY>MCQ{@ximFV&k`e(kN=e34QhyVGp313gAs1-w(ZQ9I%a;kiE8xYAFb zO{<7vwY1K6jh9h2by*X6o96wB)RE-z=?(V=HO1IVG!OmOrM6+67}j0ZY+hjfV5Re% zIZ`_kc`Y{C7&&=r!sTaD34=FpTi7RT9FXgsLnFxNT>!r;)Q|2lqNlUVw1nbhI_}bd znuhtE>}Uy=pP<K2q)lU`yL8Sd@+T0@ATXP61%e7SU?6r&&@<D0__X5K6+Vin%}TcT zcB|jXwto#+&eH^?&c7)`V#W~{#pAMBmeuZskZga|VL03@d^%BldYB`6hBNi2%e)Rv zZEf*{YQ?md;p39E{^zbu7<&}Nwkd`$5Wx44+uYKI;pq@f4pJU0t#eR5k9s(q8d<3v zXFdUdi#!(^P-8A+_!SSmN0k>V0aeHJ(4TVex01n{964nI{Xr8`ZOFz=04W{C+UgHK z;@1*FVTR$8prz@91@;p?1&_W>F|NiSgAM-!4Z)8Fn-H<XedeQj@b2huKfdPJ&TwIq zeL&_Yy;R0bZ4Q7)$f6qIP1BWgWpedc1L#4dklavNB-3?XwWlbHChVEG-tIa-`COZ0 z-?!9zvET`Y3Us$}_9~Vodg$ur<b&QMArM~kL0p~l#gV&pLMFNaxNlA(ZS=#A4Rk0e z^}l(RC5-v?hA%%{W4X8$o2V#^=_U*jTh^j1m}>MJ90pH!{D!Ud=|UIdq<QZ=xAv(@ z#-zDjkUJPygz)v+!=8AvhQd3(r3s*C>gT-*g`x#HCRWHGb5?eJ*?W#`!81sOAYAu8 zI=UbF{x+odVs-v@5n4K4^B<QC>trw~4_7%p30})u9_DUmFaSrZ`JrJQ-@Cc3)!Z1` zvPas_!H<Spc=<N7yrE|T-Rj;63JlFIyN(mlKyJdyHrZ?p0&laDXpf3U7yRSfOg~NQ zn?rdM+e<E~(Ca;*+uh;76P}%y{1tr0B}CZV4XWiI|A3jtmTnPdVL)vW>Qdqlr~68& zxR4x-G-fa;#B}(rE+)>Wa1+(9R@aZG$GDT(%T0EJ%2pb|*7M@-pkhOxGiJV_Ia_t+ z=0lM9x3FFG9I$_hW!YcdgZ(~9-0(HJ+qj=I#Xr>yG?+3F!wL8ectnf6Y<@PJ**Hio z^&X;AvNwj;Jse!pfr%}t-|3|vJoIa6Vc|ZUzwy@X&BycZ8;6z5k@%;kWO!|l*Kj+Z z&3(PcVd~@UNatdSGudMN<=oeRyGRyr?$o%Yy|?(rOF+!=yP^pL0Z(WknFU;eBBSF@ zk+*pqAtVj$YTnM!hh2b0RE-&-_3qIGreQqE>m63^k1GX-M7K$>%itP(zCgmi@U<S& z`-Dh|Q|z@rJLyf@n>?nATGFMHY5T+wm3H9L179#NZiiaOx@s=gu7NZ}VPBI%GW>!M zFne|t-y{xVa#!>H_VF3klS7JiDA__}0H3N=v+fLH>)o6>`e5NR8o!x<*0sO*b7z+_ zP$!(Y0h2KD6cL^I=Xv1Nx7A-!F*{5|=H6=Bb(k5__Lw>Jp<l6t1tLirT+I#a`n`U~ z6UGo}E(W>>;T~jbmycyZdYTnRhUEA{ME=4YgHLdcv!=EDvuw(v>%l&Lc^+!}d~dvp zDiRM<+5(`gl9&{OKL5aaK4LEXf=S3<enz^6kbO}v++ab5y3oDxI4mlF+S3;770K19 zjF_6xc(WQcVQ=q!ZCnqbi0!;c_{^~^(=`ZtowAnJw0z~?i1wv15_D@+evin3lhY<d z&EBS0gv>#(K}IWxLuJP_VL2K88AiIK`$9Dx2~u4OxwsDvF&9o6b|c9qGQGo^M1&jH zj=qXm{!h&O6U~J*ep`xUv=sPWonId#ZZAo<-kT3T7f#rp|EvqKNVm<A3SuJhX630a z)F<xX*rkr6c<UoN#teNpwKm<uZ$efrpOoXJq<14I=^>f|1P(zPZQgb@Dz!gmY#5ip zfy5`!wOGI~h@!LP!;cmE>cVxcTwOrGm-9OH9qE}T*gnt^lyLKVQt;B|R(lCV)S5<i z;4RSO4MNpEx`~8ZSk$#yfYB#}rXZdkq~zre1V)yCcZy#qN~C&O&~bb_F~!0SN+cS3 zY5IwfXjJfI5~39pnuP%C*WT-IIWNc<ud}{~@cNHFKvMhNtr3ZXo3#2yHO=(szXtMu z3(f5*U?TJ$cKg;J7zbxonhhBLgcRR9gI0Ce)XvgwN<C=r1r>x}emPVIu%_cnnO2Zt z<W$ifHhd1&$rC{h8!j9PVm030`(tG^8C4!%&yEls5D)CR^R$7t{8{Sk<?6gdcwtc~ zC<5lrY|JJRJHf*J!?wDQ``jVdkTrf=F=*^PhUZ531Tc$RoQx1qYtHD5fJh1iE2{R( zNPwv((qlh)W?=vMVH4C38iB-Guf_41(dRG!zOu1CUYB1*t<ey_xn}b<oiDCOV9tiv z&%5f81?5WnF6@qSgX?2R&C@P+PwKxU@c*{X5%}a@K)S&%crAtx{zqPM0ZH8cHTd=W z?XL8xV^pj90b{sBki8CN8P#Iva=P1FXgvrOnieZTr6x$f4UjtGULe_`>dx@y3v7E{ zrFP|e(OPW2?isRt4-nCM{{@1nv){7hweOFpk55fJZPT*l_Leh%hYmHq`v|qZmr#qQ zX=#Sw6qQJ^kt>sKq=P2g>Yk0l`ry`*FV(vc!Z-&wvQ;=T#W@~!VI6f=JEyZDnl_+3 z8u`wr;5anshp@5@<^q#0)80V?JSIG%TaYK=8Y9L<!U&QMBHmgxXYKjk<8RJloZ8Bd zjKZ6u=z@kq_~qM8;$N}a;%_rVs$God?8r1cCgOu|0o(_YbB43uXI1M65pBf1QZMH6 z1h<(QzL7I;b@Xssn*f2aF@&Z9&PhZ#Vu~!pT`$lW!fn+bPXYdhT*X7_1?a!lv^{y| zoYw7#;EKx`zfKu0oR3m$=hL4GLmsU4H`qw?r)Xe&%Y|02kha-1+P6WYMSZe7^GVH4 z9kDm2b1&8zuroIanczNPW4gLTr4}InDP#xNLlsoK*u~Dy8)V<tofwp?z}oX0_jR=Z zS{4D4+FXIr*WqXA^vG`rp)Z1~8x)YGm=wB`eye$0v0?F;5v@{;VI7@_Hupc9@|cGN zidM@?gBWp|3Bns#L>Je-;C^Lng4uQBt&)CM0o^k^sSUQ|ZX@P_p6xO9J}OGInQt3` z5ITQJ^t08vier8Xe-Fo4P=d0k8%hQS-$*}Rm^KaE>x=o;Cdw2(pEt24hl+1Neud-I zi;5d^WtRR^vQwQ#goCxDeUCkBR|>Gt9=+4(7SUUZFb;v-&a2cAa<RU=h46ZZ#NQk} z&fuo}$vP?qVxbLNHm?Z>H->8Pc$br0`{YGM9ZCfl+`Cj9AGmAd^0H0up@i`<F4M95 zW)}$>a?uO0t7(68Awq3`W=NA(+E9ZURzq-1D55!S<;W>8J!jQ}GQijkMt>N9TPrnW zqNYj2usE4umNrLJnxmn6?>&;RVar}JuCAlaFH~bM1aMu*Xp)gXFypKeKy2spTh!4p z4IbH?Kc5jlP7SQR5nF8PeUSSPO2Ljkc#O9b5RK6Oo-xOd6$-Spa`w2?^1XB*m5v?Z z5hLp<y=u9sj>l_(#?-fI^$0~$jHj!QH)F_*^E}J!S5)TLzuha_(DN^)XPq-ly4dx8 zA3sGQhY2^j#X+OH&IYl!o5t4;=z!hX3g-xo=%iMlD-4G(MVNB+<35eC&Gt^OEyi#j zMR3mQEA@^YfG}2-52=YOEwuKq`vK=_>RmRQdakSLT^YwUD4}fqF;C#8_86^!ll5E_ z0F!!`mPJU$??gJn?K`s7ysFJPxGe?oIgSp@r`bfkVIuGS%CH~I|F@dF!<R-dE8<4B z+pKJC{{U#%QvdH5W8YP#kEFJmFHM_=$GZqCR821k=u33CPEdy)QDpB~@EeuVn(@+) zANruPH;XhOPyDnoZpK$ku%X{lvf(NMq2inK)}900EC(l9gANZx9p&p5R#xO)ix&aI z`{T!B9xb8-8AU18^v@%dzK5*rH=0bqwD};N6eeWOG2{8+S{%#Djp4j|JS}rX;?$!L z=#)c2s3-xs?g#mjQHCiq`pl9Ixvyw;8t!2I+YQ*qk5%*yTg2nerrfaAA&(=9%h;~9 z>UPy~x;>|LL&!SA`5@^A47D>+C6-#-mk{moN5X~&7#XfqvLW5yYXE-Op_(x+(<a+= z=4A<9EDxFoOSviGYFgHxa3iPr4T%$zkhew|FL7iG1x=a+;Y9kFG1AXMXX(IgyfAve z(~7H71SR^=A_5j9^|Li#1z^0qJbNy}(%Z_>@32}!ZqxvsxOk6H(I%|_{g*>uccGta zh||3%xRR^Yb|_otLn(IO>a8Qv<}G!|*CPms2HPJ(GSSC1`OWdf=IZVagKZfvYgK|Q z7bFF!CO`tXg{h0c@Gnv80f)ctJ>U(XdN{5wtpzWFIwGT%Lx>Mr6a9H%1|#I1o2g;= z>VuXLy)S@W%SlFf*&#b|slR@Z)RN$u-DmDNcEG~_RPJk}60?PjX6>UcqENKSN3{vo zt+5vzNHzqs^J^jFB<U>oovZ}Ye~#+6Wua_rTU-Luu+j1Avj3QAj{E{`$DF0Ulrf}) z7O1I-hmLbLQ!m8X>>gMC1I4{=fK*?TarXY(hPyz4Oqque!G31Mqbi)___MCMiaXpC zhxDI9Z6^J)g!jaeiw{{`h-mvI&#h{ODvEY8?(pt2)lyXxSoblpJr0&YbZzae-mS^O zsnSH2YO(E`E9Y?*0wX7jo=+K!pn9+7oc)ryNaH++%`QWKH&5nI*z#6s+nGf)o$qaM zB-E#}V?7{u^Bbi4<}#Y@WYVI{HN%L0KuEHT7;Z`TJrxYXEV?OE6qL8qrrAP2Z~S7B z7`@SC%7bLB(6GASe5Sv$cBfa+Qul%=^Hz(`j?Vexq`1!sG=Ig6Ucd5xDlWJ1NpI`t zn=ZYaXZdYFGsn&>E3&%`^|TUj6`b>8tK30@TamSvkUAS9nKsurPnKfy$`K34IKgdI z-C=PrH(?%OD@m3=1A>ull|iv+h%b6vBazeZ<pTwh3<dq^#4;dB{=^sOfYdBbH;y6; zW3;|Y{vF8SW8=E)bcCQOxUi2qt#a6qExLgIjIq3)SDS00fRL9+o)Q(US5W9AFDrRL zoSTeYvkpJ+Pqu!dvJG~6oUZFK9RvX-eW(HjCXuEBes&H|=n`WW64Z5=uDnTITt*zH zOIq;H%f`1gDIS%7<39gYWt!^WV<Zck>j%mU{@(8XH?LakQ;BX1(_5=Ac~@D0j#Hhq z_t}@E-a|UITACSu`>fsml5wWkK|-q<S4>DUb!l^#M=W}Z@($L8GQNdsT`xhd&QF~x z&KaZvGwW~r`+Cny)W=31j-F{N$pMc%W3KNw>5FG5(wnVcSF22EKo!ObEG15$K*oLh zZHb`|qh!-cRo-hu??w?QwX=e1*SAkt%FSYD*zj`~8KlW?C9hAS&q(fkx1a~6y{n}B z@pTwnyfwxuJ`X7`BH<SkB?Uk_fTJW%w+F@)d#qgRR;}fP2Tyj2SF@?n1-re^?i_7X zk2w>muzgYkmmcLBu;wL<c4xPFJ3s5<snbYC#B!@z_N2mteOjdnR<!1PSz^CFfD78E zHBPBAqLf3GSnxLR>B)i0<D=-t7a^DVT*gl#;tVasFV(Ym;6mNGxu-t*OECGGD}Vzj z=Kf5;`3G~qqc$miDvl!~Zl-)|r4uSLpysGfK-jCB76MAtR-c$CV$P}O)2%|TBp<vC zMKt7#dI*F-$clqWmofSYZo2IO@80j(h&@KVH@dgEql>AqkBjhJDM0&ONkVu<2Q@K8 z=WBn|?EqgqLX_clbA|Z%kQ#cfu)3j~TaFB2a-B2#6`2xldU3x=F_FNnh#>y?wlQ<V z4~~pw&~Y7t5I;4lwzQ(Y=gp^2Xy<J+B*@<6S1@okia^U@>0fuxTmierF|~wI-c`~+ zqCk<KT)9Xnsa^aGVAb+Jqq$1A>A{Ojik@2x-3B=gmVXZFr5x{U7)valPc+K?W)wKW zB8k+}G*{x*DiL9!6wu5qTSkd}9}MN$^=h(a$0D6V@*=dL4810bA2(dlNqzruah=Wg z_>M}HyQPJHwHU?a;yrL`6=$<t?j2pVyqG?hoEe&J?=#fcxPzqHMi}gg>mEy9%oouA z0_Od|)>tBS;WkpYl))%a6x_&NSS@%p5&6;wMb=A`VTW<goYW4|O9S=2A~DJlc?7|Q zx3rotFLquMPgR#IC?Y1kVWJq>|Lh{m4jhw-+xDGwo+2S*78eG8!xDK3=FY)e8G18d znl$KOUXlp;g8Ti`Hl8?APg#PYQQK`i|H~!ueJ9-d>$qEd?SBMO8WH{N%pUZJ$Q6AZ z0wr}_XPWvb+_FyEspSQC924hyq|W3+AT-r<L7aI{8sl>+wmdw$3J+8`?EJ{=DJ>mU z@=8`Oo{;!`si&y)4fS!T_a`684{Quu9_|M4w$565J}zHO*s1}|S%rxShraxhBhjDa zxw0i#QA4)#<M~3!s<u1nFqX1;k#<MxXg*m!uJjy`Pwtjrrs5!S3>#SL3O83j02aqx z&z#!iJIfcT)Q@NkEop*_+6`cZ#l;~*4HQH<%f@m5IUGKUQ`??P#6}I(Zqs^~2mCb( zb`r)4e32Jgx!j(C{F_$xU;H=wdeqd{#aQ~cS+nIUFav*=7S}OdjlGvVB-;G5X(2p6 zt=jiTRVjU*wze5FPSkkW=~bh}7Zh{CjSTm=*;!c;eTR!9H9oFH%Hsd!0z5S`dYvZD zmQoJysuqh~uV%G-!p*FUwotMznM8QHzsGIAlS$4+sZ>Y?VExz*f4YTrl$V0xH)kN( z=i%RzZ__%@b_<%9)c0zXU!s$qG5;`*OO-y-V)~`Qis0jAVLxGpv$~gvh4CwT;@l-B zpWarZZ1yQy8=hwsLm47=SljH|s+Jd2oTgkMlp!ut%)8WA5pe<d#Z^(LO?Sz|0|zaB zzFuC|d|`f5|BA<yAfKW#XMh-OjQl=K`}i8feq>J~mh1Ki8CpV7T{byPQhZzc#Crt| zd1;+b`V?%yGTBc0Q`j&4z<Yu>?bWBp{IQB7y)C9W5{&s&tVFjG@iAU}e)zf>ieo_a zpn`=VwCo5a>A7BIef}$r1mJ271diuHSQz!sKvK(r%fQ80QOp=__W~>ocb<i{O_65q zM7bSC=uV0t->4yk-s!wHBT6O*5lo$2HOUx~luhrm-2ZeJx6u2%Nh_jl@7dLiX?o7P z2y=@~Twori{hoBSbw&lJoUGR7L@-a_wOW}3--+M5bV_jLEQtx^pmP2xhN*(z0He>k z5nfW1)N1gI7|)qA%}@fy&%Nl*iE}R=@?sQJ(cHRYNHoG9s*p%|k|f>r)hHIjE-8PO z!#1FLDXKSS7k1u)M#oJh%ulk@pw#NL5CNM*4V@4YYpz_Y9?Zk~EC)hlUfkg}rSFoU zk3j2Dh*Ro+?nmO`6=u_7s2;^ucj^AE49m#3ncTx;cg0AGc4e?i5Zk{9zw1lt-|uDj zHvDyhuIP6=wjPWV_Am*`dB@Z0qK=zCuQp@YdWMbPXSowS)NqpyGI%M}0@>F4*Ptpy z@BkU{x93bXr$2%5GEx=^Y$wk7GTRz#0%1@C5&@paNx;$>#<hC9sExa4pzq0)o7Y6n zV>my!_H&XIZgdANR3i_R8be1EhI|eeu$8*(;co@hzsaJ3@XBw0?#$i}eKYAUpIl?I zf#_(4ZU}2CPP^IfOI#zR6P?^R)$hE6RVBAvweK+n$HOBcA-gSg(7`qGXMX<p8e<_D zdZ#huciBoL#WTl+;&<aw9#+d!7WIdmZVAk?PT~rGxQ!0*0M5a3KnmH4xV9yuNm?qD ztWhAFok%6e1ZFDt&_(qA!AzJjFDDuL?|Z1cPHv|6`k#6%?WBk&)=i*4jg@$z!`pm} z6u+a+%6sAe4A%mcBZSaT@9>;!oQdXzV;7(IF|~Dxb}k%m*7kLAxx?z|Hy9V8jO?!& z$DacY>I!uX-=ddW^{+4f8*j0N@V|O{>Aq_8X*YRmsalz>wr}s#<2M>PxLQO0F`pi> z?|%zDMBM@)9fFG_>*xAdpbGtIQREn6Jqfy8&XyZWB@KLkPUL&k_;&2IJ-f5k)&^|j zXg=0-<dtVPJH*0%8dDGfSw1_G>iK+v!_kp>{N<(34Hx7)lI|Si;tuxe{_3R8IusY) zA@(~JJuuwIJ|ne9xj4?VyrSKod~a)5v|uRu8G8u+$F2#Bh4ky$*CDu3@=49khb~K6 zUH#V$XDq53ZH5bm9WuH_&G4Xj^qe5C=nDo$SG814?{+Gqvf=?P_sXBy%}ADx^bw!& z%ub2No6lR8BtP4mRl5tyXZ*OG#Lge<ZS`Z9t90s-L=w}7iKiedgSJ?>eV}oW^Qt70 zlQ24y9K{6Q;V~=Sw7^ZtYB|EgZH*C2Ed;Zsi1ktgXvoaCBmMUKgV<OrV^}vRb7wbP zr=i!x=V8qoLzg~`m?7up{8}MldYTL26->(kB5FM5{sd*@c9Jda1_jT>l&<@{<Kp$8 zDhncT0IqnmQFBx;HSnl(Uv3R&Zk}uu*L7E$O@gpjB8hoM54vp3%Ctlpf!;7s?3C{0 z{1qEe<~<sr-SfdzVsJ<XP_3Uea&X|2YH0zbQ$eVcB7ig%2+H5l48-;%^+HXv6tRCO zVCU6vz?me?+byjky*5%;>Cl0zi9;@^eqFD-i0#cazT#|$fs3sf`HqZ7`*?4oh(($m z_Q|vN6|$mmswvRgekK`8fP1<SUy=2SQmG3$7IGiET8Q&T$<h^LMCNOsNWz(?;FdU- zLQ*<C43<uYsNtO>$Q%VFI2^QxT9mW=;Z7Dh)e^HABw;T_5&)AgTy7}!_n8+_N|+Aw zeMyHCf{vnGKPKuv{FbAg*>-3qJGXxPL^^0lx8WqyT)%n2jupL~0QfcozKBdJD$Q{_ zLHH+7uS@h5xZ3++sIRN*mzti2oEaK%D51vWk9TWD;%7n6x0gh?b#1+tq`YB44F)}L zSd+ouPWvP8W)QNE4MFG1N~t*LQKr$QH<3k!uR<sfbR$rR1()z95v8My(*<!?&cyIt z`rkl{G*A9_Z{dw?yYT})&l5Jb`B%UGV~4U%^p4)Xf%u;0rGw6p+3;;YRMt0JR(Tk` zGhk{xbgGi)V_ZeY+O<l<(8e@^4Aj)7S0HTKI6q}E@WjofdcOGM|FIjWfvvY{McbL< z!oNB_?sPI^5<DNqiG~`m)cCbodBw*2Yww~VCbXdJmw$JK-#|KzK2}=BVjf6<C9{kR zUgXY({kLgLH3Sl+!P~Ho-Vz%+h|RqI&l&0*!T3cd+!gTwqP{@#2EkoGt(<Ps_mGKF zG;KSR#gu1wQ~ialx<8kPcMiSTN2QF!Q%YlhBP(YlFeiy@Zj-6bH2<*d@ftxL^u64_ zpz&-4n1K#fFzd!OF^jkUNZD>K=_<=6&1)D(05tMH(!EI-D!xG@(L+mr_AZyT&L`M7 zP*mD%M1stJeVuxHd?tP;{6^+X#3a`P8&LYq0Mk0kFIgF7;6!d*EvOok>-Wu%WhY=$ zHMIqh(OBdZo7&PVVZ+(;xfzX%7ge@!5fdh8QR|aYco=O(qVfh}IISvKV#qJbM+({R zliszFLct0onk?{AqZfJDbE?&WPu)A}Z6Z+JF{>uvqPcQ-QNwo(mF<TCY$R0i%pygj zzZJmZno`Nxvs!V?WM&Vw-86kcPIb<SquP|Qjhn}_J*$qJu+CtcSsl*^U(-dpDB;7_ z^nqv3Ku?fg@1d8&vFg$zmob#Rf8YYptoD)$@odxeE221Qdpo*ti-Smj^^?rwPF|>r zg3D7N%#T)a-h<X!4Tr6dj{;^q(*+a;ZNxTME=rMvSxjz2s%vUHJPXK^Cv=XG7<ogK zd!$s`tj*-SSgeUa8}4mk^Z6Ciu<O-tde%#%oO{f;fc-2(UBd-7#QPe@qnqJmbW&@K z65OAy1vMaY@;yB>64xpYbu+c}E#&isQxiHZ+Kvb`j3#!LX0>T7YV+muA@dAs>xJH; zRkV<df#6=@auS&F53*5K42nuyFSaQfp$F1ESksIgVGvOv(jTyb9au1_nAQq$s?E{Z z8g>0vGG<}bGAZpyAkI<Ya6T@yl!z<CG>LuM=&N-Wo6-9tA1lTDB?MyhM6W?J>f$nL z0=H<nds*%qVON=ilvg@APuS%pJ%Rqu5o4d^9HIIO{pV5f?^hhKR@gaL(@1X7faEvP zE?v&v{x&^j=#V`~2lp{5f{nn|b!~Z9LFFQ68ml<tL*P)M7grXeV)EUvBj9d(%A94m z6HYf})~h*_5y^Sc?(;=hL9m+Q#=2bA=U)|NfgV0_``dQBz{6wtdCJcMPTiKN0Cxjd zfv|p}C2YnsTf2E|2Iba)vi9SGtgM}zRVA|2s}ST4_{l`A-uuGG_PC2c?F)q>%vp$# z0t^!$Tqt<)`%)}t3}utl4v`traKug#Sf3HC_17-q#{)Osi<EQkbrenYpYQ2gQ2+3^ z`mcu<Hp01ODd1-$A7|kH@AHGRW&BvwY8%56FjMWGmwf3hNn?gJO~*GA_GSCAsRl<z zWVLnfpO3nBxhpI5y8yGAXx<x%1phS&ki&9+%t4dGv#XJWbm_S2Lm<}=Eq<9$m182e z7PeN;Ysuz|nwU+}*=L&aYrJU*W>EL9D85K06+S3e#9#NtMesE>zPo>{euo5e*-sW{ zluHQERkj033foPy?Y#mMJMo|J0KsUP+Z_%GGP`j`S$wk88ZF5Ng#3%6bq?v%gr<KQ z$huH>I(lkjcn86cM~RE%u~kN8+<(8h+ZU*-AEQ~^+=QUNW~2XJlX0N?U%BNB^542^ zy>hfD9Wbh`GCg6F+k;At1&%AY7W1UDp=kxS_-{TNg)^Akq>-5Gaq3<x04~Nd<ByI@ z;AQTzANJ<?E|0$JEwo<wD!bX}c-;3||KyQ%ExMfxC<Tug7Yr{Mg2SLa=?BTQuRsyU zOF|u}QjB1vN;Qff2zizGGB$Dk;Ua;Q!UaY)`1y8D4Nu%;W<7gJA^=0(IhqIQ_nTzr zJVE+i;}0W_!a~V2BgiQU`<_>#=d2F9UV?5O64-penqIE8-uEMxd*KLfeqb`0vkT|6 z#T1BOcs&^u%Gm_#Aj<RQ180X9<?TEN$zAW}k!^l(AQl*ZU)RzI;O#c<LwuDTuAK?@ zTyavjp>?FwOCh0K5raxd!7!?|1eFutM0XTP<_LjFggv3cn<TMn)N4aZshQ)j+@Vcs z_pwc5l_R2K$nIt_<EM`7S64YB_xnz9xo^h<Bkhck@|D-{A}BP34zV%k4QA_dOi|8b zPNXcIDqN_}GIfM&WT=Z4^~0*Xjq{;rJB{_-ght}ck|?Du-v<vk!BYA_^2K2`tg4M( z*{01(H0MlpVWYwZ&YLQ0EZPV(e4dJ45x#XAGK{S1HZuR))crz9d^Vc&24lmITrkcj z2c4dx38=9bi!vwLBddjYZ8CKxNS=)Z`UV#X<)*@<dZou!>xH2s*8#sGk6QX?n>1w- z9$Z=Qi$#Zw64N^my?l7bsBdaeO$=+}CaDv?834A0)7w6EYM*20Y=7T7(}ZFQ656dy zklLvmQC{286i1&bIby_Ma_Axx<AP2(fd;1^lNDg++`s1%kU-^EFW$F4T2Y^u5xF~G zKX$nry+=el;HDr!rvtz5h`3(0aOVV?M!M=uU3==k4OjHF5=e|@m?#c&AU%tE>nqRc z&?$C+(4mp<7tO>?D4no~F3^PAwuANEi<ep>MPF}z-}9tzazZVR?Q{SyM8!<8UOfcS zL+gKt*Ro*TQ|2@77&G#tb<cVqGj}AbOhV3MQ|zP<!_J#ctiNr>KKF8tt-WNQ1Fy9@ zehcLJ{(WKp{mB*uCSv`W?hJsuOXijo!WzJL7gA^>H>1}|%UwmaBH~t%o=q&-)$VlM zT*oEW4x6_Nz{jr@L?4gWialWK;%-0f%vj@0u*rAWm&>$u>YPl%V}EoeKM!djHLT<* zxzGsnuQ6<zhOwk|;T%>-@EaD|Xn>ne#LrJvbl&!Gx6&3~+|;?#AOGch2tt!>*E><C zVrsb$#@OvcM?p~6tNPy9uA1Fb(B#s7UpZ7)vH$UeXgd-eK54^d1)@3}-<qZ?b80Dc zWazELJW1Y57ooG!mdKpq|BgAf(lBjsPPQWiY@h${<NrB^_xDf9d00=}ovt`-mUf<E z<J}?9p>{$x(N_GmNh&TI0s>jDbhzYpxX@{2M^-^0S6GOG7&wD=A<kcqz;YAW_(Uat zzCdw&@>k1wJGr&<+HJ1(Hq3rj^yY5&JgIu9t$!M_&9({n#v|PjQBiuF5%7|samH}% zQ~zEF0s<nj)kS;v3e`eyBCUnj7%6fyQW?ndFBVgal(#_|U9zAVn4<6F2f1A^*qe`< zTp$3|E)>F#ZOUPcKn`PfunUWHX&v!BuMl(yFb_pAtjz&7F4B+nM6<e`B?!6s=vIf@ zosKmh680?(UdfHUdANo|n<7Qdkw`a$pr>k}%8B{pi*$pdfi<v+wa~gssM_h!?@gWR zc+DkpQH(r<nAmEXP*`~V&6DdU#(dJt#W_RvfI8{E6y>x!d_utM>rT3d$G4%d@yX}d zy#seGbh47ZVw1R3p4w1J@ae*0_$>yqF?txF1SLmdF-M~I>x|}*x|e$v>C;-bdme=V zoiZtFi={qyK%>Ow+*b}hxMTl;c9$2V7nL?q@N3?P36(g613^pT*w0qcnN4K#$UZ7@ zHcJ3pYLM5A5FQg{k1Bgn1`2NvKE)M)4fhj8V#V$m9uPn}oN`0E)~hW>e<(@CDYg*D z&b9M#5@#EXhVieUg*3gRe4=#q6zI{S<{DQ~|20J@zuoS8!eV=qB67s%fJv*D+=X*n zmcVA^OHp^49(&qFez9()?7I5B9S&K!84-x_>Mnk}E&O8o!Ro6m`3q0ELeFxOx=gCC z2NzcO>(AIX_bTDUPo0e3xylR?5P^sM@>i^BJqR+nJ;RYKixA16$cOG8s<Nm2&I`IU z16{_%(~w=QY;KjdbK%)P3=*S5U4}p>Xj_G@yGQGI5M@~XHeH}}8{n$&c?8;8i}xa^ z$&qTCkUUvOc?I?mdqSF!4lA--JL&@Si*TMkXS3Jm9{vjVIsxKyN2aOJJR|JXjja4Z zXS}=?M%m<>%2;KkJ#4-H>5vz#f_uksJFVXHzSu(j5^d!lJKY1YE5?#3n{eL;*WEf^ zvWTA+^qQWkw(s~a2+hV<s27e~|KaZa-+Q{#CQQKlkj%v7oFm`nOx>|=jsCk@<+-h; zbzISVFi04BTkG1&Q>HH8X4UaPh|_P^Z(6XlH=eDnj@U8LO+C0pzjt|}UD${WN9_7L z3;;%r1A)jpY)e0&g?%rSCFWK`h~43#0H3VBnIO#Eg1dQ5w~8UMlDSZh2Tv6vF;Ec| zgcXQ6`D44hS<ZN9WFBqUZMUmvUn24?GV}&O8J+giE68FTx;W`8bAUEywC-mPw>h4z zak+_3Ni&E}|Edm!V~Xts!(@HMIiwZ~TXt!LkdjKY73?$9A?n18UCEcfd$BgTPo48O z3t&v$;)1E4|G*BuPa##9Fq>cZ;?`gXGh3@2u84kawcSFrkvi+n#uQ_-^TME=PYVI5 z=kGzkc|{!=VR$R56QAhW`-#W4z4V8c6JhxC!I%OWwc9SVo*4O_R(`+LtTd%$N&)J& zpAN?b>%NY-Dvp4TUW)KX_e>n$g)gPDqJH0L^Fl8CJ#@9!sy|;_NrI=B5B$o6q7qZa zGNz%SWY#IEpKXb7^~soFx*_*Im`#TWBRz@;eegC3G6b8XeVW2HTZF2>W_YG;(`(zN z{Gm647Zgy^1^z}!I$%N5dd4GeG2@w%z_ZVG92Ai)cXLEtd-6ouly1N~0cyqn-f-w4 zZ@ti^9*mhbkO^!S5en<aYp9}SOmx|Zpkfp*sOq6WosX7=1N7^w#Ws#><2jRrRu3S% zcq%VIj%{)V3u9o9^-yu0_~y>TIF>23=AC|u1ymBgl2Ecmoyk!k&fgMcndT*SGL$)* z??Y1u5LWvF#HPXv$wO@V=FS35@<f4jEu_7%5WCby?VMEki-73z)akjz=1W`|X%69g z=iek|ypa@UU0+6#(dJQYhKC=x&6ReaE1E&z)<+1dcaLmr{I%X;q@W54`1l+}NOp2I z=AVi|yF4rux?M%6ZmXMqkF7mz+A~Y5`RVN<A41e<LJR#AA#u{F6Tf}#m!9fMkQLKE zMTB%O81F;$sVf_7lB=`#<oJT>H$;$bJh*HuxwfI2+T*Bv$skvyT`3=9rlIS9A(iaj zHAP6x#@SwzNi|=+A?}p=8!3T~X(*Am*bZT)A4w>xK&C-pmp);!(AX{~Vi&KU@#G>y z^h$8z9O-cgHGgkQ8o|b-4$g^l=n_c%qd8EsqgY<&EgofFYZ-?vO28e?%8g$y0ODh0 zC3CbYd}qpwRxSqAQ$aqQHe^#p*=L!fqa}<AldoDNNmzjGtI}ez{fXaa9NCqOx*}Mq z@E3H9_GyKp1O{Fz@qApc7nO)JTX5j7%}=^V-E{sidclsbhN3fip41ci&#Dx?v6=cb z?g1Csz=`(#c7DgR4x@9Ai97zAi)BueRSbU~Vt?BA8btChn06mUMf`95$^WF&+wYV8 zKfc~EI?{04+Kz2^Y;?L~+qToOI_cQ9)3I%K$Lcs$v2EL^*m$$gIs1IOzrDx#RinmJ zzn(E_-Rqufu4^(qKcH$V`byh^Whf6<iY&zwNV-0p^Q$$DusgWeV_Lt9AnMQ7AFeQ* zw&rv|ZOT%v(SH50lqkB9xVR=XvufppoN*|h%8MG+p;*n{%-%8IO#(+B{6==<^*IlD zy@Z%@KlZbdeHiep%bxzQEudZlXp3qjkk&uUM`e44wHaLmW39`T^(QvNe6>nmtR25} zH*n4Q_-kTswx)$s$42PW$}D)wZ$QP;q<>!&@*&=mb#}w6wZ`sJ*}VrI7ZjwP&pJ%P z$LunTUY81wZ)>M;>RZxg0Mr-zwOz@NE8hH0?w#_S&tHAXKjhjiCw{x4sS~aLP*k)C z0{R4>K#6_bU!0f31>BfNt2!R&O$mGSSd#LT8yl~+^J&Ln=V>T&JBvdOkF$}OTIDe2 znhH@0YkXg?WM>8hny-&G@cD1-S(dbz$<H*PP=bK;6YtB7rGST3RX`fZkH5t&o`i%X zi{Ig^2NQ`+;0fY1<6`^h+Zt(=-A}ikXDVuY9*lVggrR`Em4>fGspAaQ_%&w7D!7-* zOkLX16EAl}rHTkwD2TtJvX{KsaX9J7CZYqA<3AU}t~0{@=)PhHeW1Kf$5oAqw~Fek z3&?$1@CSKaF4L_eY_b!RxO>*A==mc1=JlLx<q7rEk(iwacecjzS%&w-HJYQ%IsFgs z0Xks?+bCqCg4>}c9vO93x|K38mQ^ifk^|?0ljuYJf>0V}{+AXm?L7+)ATZ)kJ@(#y zW4#V05xHp)GJmtj5{stE{E0uE>$#88L&Npg<K$reh>&|#XnQ-DyVj0N6tx#Dnl&VG zypjbJz!ZqW8>L91v|VT(nn9q4KvE$1?M+DNAfl{CD?;*9p1tlG9+!$e2VWr{Sn=#v z?ue2uk^A1*ZAR82C*#(2pb1h5g)$wLMNoT<(JLFFAYN)T1BJ_g?TRBZyeft?X7nso z$b8(jLpkyaLxdIVB6!zOTzYlG(1My3v}i*gA#%J47pXJCl;%1W)seW~hH^{1f6PgN zqNyIo0LaD}r9SB+LmSuBFtgG7fdkuLHqJL>FA}D#JMSt`=%=Fo)zFs>>5j#172tQy z^w<#<PqOqPY&qbqxW=3}e3QHUv@uO4{5>8I#rJ6(51#B&7k#1u6u4^lAw_pA__7K- zrED5iwVM$8lp^;5rD4;d+y_!f%sh(`uk_LD-Oou&@U(3zi63Z92pAAoICibyFJ$R! z_Duw~BSf_LuzZ!0BP(-Ix!}dyR6oaONE4m;+u~Qc4C8=}`0THdXYid^@nXTJnH(2h z=Hl9Ob8|<8A%SGV2^3Y=nZ<MuJuL9{rYWfmbGZ8LSJNRC66yM^nPxn2KB*`qcU_y% zn%X?>xZPCy6Kife;_OR9?CPu~Hi_SdA;KVT40nU?*(#~$`0v->J3y~nVZ=O$)1amL z`}*Jir(Rpl3Kjm^w!gm`(J(p(uKN4Q>RhfirD3YZ*Scq&*JZ6`t3vnO%tQGsno058 z186&Io?5W<v>Duy*(_h};QXLZ6D07CLklm_1Xqc@k#n-fqsQL@-EYg)@-aXT+dPM1 zkOpgt`53NCHmew1onHQ^BXZp)gJ{rV0V^9q!>n-1T$Nu9ONZMc!V_P@`iO(@Lq=XK zB5m2s?kCsx7$~x!vbC?~Pdf0|o?-W27t+k#2{4V>M9y<eHWXXYN%8XLvraaY;;ciu z+3eKy+#4fA3pqY9IGdYA`Tx}!7>KL(Q38_+9+|%${P$QWCQ2v=7jVh=+9#qth@N{F z(?OrappA7S5@x9sj-c0*BVM>}6ww1tKlHVgde(eJ?}vrx{gEg|Yhbq(&Bv-RiojDq zw&KgxL+mT;F!(ut%yKO;gc-BX{>B^XLeBee`NoU0%W)nLdwTZ9XyTf-D=JsRHPo4O zyzM4Y7ReSEC#4Sc{GWD%Fr-n(UOTQ<ZB=r2C}Nqg<`GK<P*bBLUk#f2@nHhl{;UO7 zg{Tp=Q;R^4#CK{%(R1kQf%)eUG(8bC3;`xeu9J`_F>}tu%w4vDHYI?mrj`IhJLP}~ z<?{_kyw=^1W;tnue6~%D8UISFc{h_sl(J5P`bVENC|K=*4o+aJK#wwoM5g~21KC9_ z7UgS&6z1}CrcwQaAkm7NqRvo{8_WSNvum=D^Fs1?3v^|+SN7m?-ImuB<ijUD*ysSh z-h)Xpon)iKRYR+Th#ezZrNc5w2n1VaYSbC+==yW}0$*|?B6@ti(_zC(6hu72)*AO+ zbqBBALb;*d=JNzoX9;PspwZu54a5(DpK>%hgNc4>I_HD)-phn@3~3j>a==k_!elsm z*8L=wcQ}Lz!JV=ux=KSAt7{z9=ZyI@`1|+N-Gww<W&$TS*#M}cxr12gunuFFB167* zgTt?62jL^rL>FseFFs8k;m)zxfWDeDkuXbN>J#~k^*_A;7t8WWnw%l{4sI<>m9#;u zQT^ZfH{|y11*ES`_8L9;(0?-eqM1?%<31X_8h29~r4^>xtNV}36o*RZXZ(af_m4ME zw$tRkbibrBN|(DX$_nZlX7lyd+98tkjwPUKP0)^4yU0-WwKoWYjABso6TXDL{jlJf zPGBrw?KX<D1i-z~;W|oBpm*UQoX&VtZAyfA0;C;7<fj_N<_wxwmot3sc@OM-okBcO zykH4-rrcT9bH~eDVZt=Om+LO%Md>BI_np^Opy0R{{NhO~gksbhDG)($4|t`&F8f^; zZs%dI1OnlvGJ*h42)hKMZ^^&(^QjCXg$|S9!M53Rq1kXgR>Z&_$88;-x^@>M@WJ42 zad{rTHGB!@j$#zRd{S@%J%S$I{N5?<1??BSl5glGwKx95;r&0pF?W6nC7;`&%(zZ3 z%mlk{A4n^XmN4u;E13<B2lGQBt-X`%VL#oPFfm$H_ZM5oEG$~@7p6El*ZAlTCY?Rr zqC1XUV2!gk?=sBAEY}Soh{}39B3KnVbhiEw6z^;(0!K>inxugjKVXRi4zD){tya7F zl3>LQev!-^*(aMIKn^`g7As=UAi4Q>L~C_0FUq5Y-XLc0qq$O2%3Y4cv0x6OmfxB- z>^B#9Jb7&NKjXbFJ89B(A-?s=ar140*_l0<je911*O8Wq#V7n;UaePIt*@ZC=7L8t z_cxBPxe%=;c4bw$aJuX7yVHMtvv)%OhhF>W1u#izY!BhNANMw2D>s*(m=P|>FJgQy z+vky$x97^Era(vyv9`^rMB;93pK5Bw)EhV2dz!YI0o<6o`JFXM+IcnDt$x;of<fbI ze!D%$c}jo9?YvqJ@lz(LmZVAS;3Qd@7@tTOqjK`WT}t_S7ugL+xshG{w(es2Vmv2L z+52pB*i0z~5fkiog3d)V-Dj><IR9l|75C7QR&+3P&YA!Pgj-=47s<tgO&|t2#A-)V zT<2?e1-CMw<Sl%<^&1dZsM(qqp_f&;*vQDOV^eJKu3G}`jAL~MJ?0q1s~Ng4nQbPO z?K1QxK782NSA}-JlHOb4u_20)5LM9}V|;GR;upaqH;syWFVgkwRmPc-Fyt{N*e(JX zXQ|0`+U2VJlrT$sda(#$t`9->n;wV{HIpSBL^w-Yhz;?+17g}~3}Wx$i#q$+&~57) z6Mi*x5`tkG{9~zQVI>#CF=hgXvEg2NgGtY9uqy0LY0Gd_%T&xYA=vE~D(~y6)Jc|G z_~Df57P#g}^5CKx^3__Q@mR4@+z)55!GnhU`V2yMV=vO?M%O9ou|qdTVs5@R^Q^|? z@cH`FCzDfRL21Q{qKd4YbAr}9Cjx159KO5~W`X2(^sPt|zD;O_>f2bDm`1q#*wEAN z$TZPzN3xsmbUq3B$iHo_W6I9ZI8HoS#We%;-@uWq#lS+Lp!AenIfuEqdLBl_!{WTi zOwCvVO0)5i^gkcSLI)t)JCQ*XxMfAhajApBz;czx0gZXn^T!aR;wZ(WLKRx`i~;tc zt!<<?+t;4)qd3yg84PLxu{BQd?y6>Z2}k7G<ln|MNFf;ySHO_Ez*DXOy;mVn6R<`= zvxJF6tMA@7W`=<vNY^0q#{?lWSUE1f-y!?O=rEemmPwyrXm{vi`4W5%bWX-TkQG+e za9T-Tk%SY(`DgOYui^rFfseAuzLzn_op5kDOmBnWHBMojI|cy#Q_xpNeJD_BbFX`G zuX<>_>`k$qG*?mg8__jIAR8=(S^?OHsS)$X%eiEto{}F~H7<1WJ3E=fx^>Y3iTjA+ zTRNb%F<aneas||KP!SaPe{Lh|Z@_(sp*b*{>i}mvWr>9`Sjkltzx@5yIvdWE2L6aP z`dYDVDhd(KVENH&Gzp`z{drw9#v%~@gv3l+=|HxECSijD))ks2Yy3kjL1_!)p_Z~+ z8||kDH-4hJwW}X%l(59X;g5E*SFTr4zgk&ZK^}0~D7OpCm0P`=A%e9%pN7CPnx{VY z!B)<F7wa3eVgGzYW7Ic=7>(Gp=F*E$Fw-fMWG>#{)<+`&(UBjtA$d0L{W%S8bvgkR z$7WQpzgoxdA00??w7YIHb2nkCD=>6lr*I_&9|G(=3h@7j1oKZIjH@`%3+BL8UiJF# z$j<+E->!rU<s7{4n!kor*{_Wxi!EG>U?P3~%r|SukLoj`pi!yVwSUTp!Y=(ZD?HAk z>zW{Bg!K^XiGy;H`!xCC?dSB|JqyEc{R}WdFFU!~Gxs$E^_lBG95WKn8jPP4eWhM` z45GP<9P{X4Cpp9Ur0f@>_#yQMA0jrV(798lMSPMu#V}jA2#9DyBsyn7GE%0fv;C>g zDT;&xJylV*OL#P*T$6Fez*v@=SEI#l>>h2Ft%pQKxbRGrA4*b8=}k5Aj2(lvPS(Y% z8c{~ZX!I@;&Wci<FvO2Fp*=$dpIc@j2Imr8;^#S>Ze1?W4awGnN#L8UMc8hBqMT?Y zRa!5p%5qa(wJsI3d8uQ-Pv(7a5<T95B+)G{foJ*&j!7%^8TY0sP-^_7nCQt``KXJA zEke@nW>uf}USxRh*g`LQD-Z5mai0m)!xiOe<pd|AD9dKm$g;xJcF1j}+8>-SGsW7w zTCX-8J|SU>8JVjDnQ~}3tQ2;w8~Ulsa&9WbXy9{RR6lFr%Efb-`WdQasR0+1*2tG= za>#uCq;3cHDXy(Md(M3Rch`mQHh?eUtN~7%3N}VPJfelQTv*zt(xDR2#X;GolT=== zSQ_L+>k&Wp@nRL^D)NzZr>`p>OyXa*K)qnIfsjeP2q1TDlo}w)JBF;YRJvjn^BX;r z(u+QHz0+7;@CLo^YUrL7d4W|u40<Xaps=BCRR6-ODIp6EI7BFt|JDtYJ8}WZ{eq_% zu8WIyPO17*7Jeuss3Rg}E4(a^I2lnoz?te^ij@A!+s&#<dqGb!8MoC(vOV*oZdLIk z<+7j?4`2U}aPAs>&f}7#wlS?!w1H<W85hu<5%?^=r{C~s1$Nk5M&b=EnI@R1oSz0J z$;cf4qb*qRgpV7%NjxPV!Y*0Ey$UWzfpEj?{(koWMAC7ia(A<E?KMuw_i|w&_QeD! z<HRc8HTzY@JAG46DKP$r`dC@7or?>HWNLPx;d_Bz;Jj7$G|7?teHEj==P&o$Jt%+D zi72{`L7d<2-;kUj#S8?RS<F&c%=4(7fEuqvLCPK3S>8n@DBG{Yv!8$OuD+ta?kc|A zWUf1(&;Dwg$ZA=T7S8;q#{0iZiT@+g{Nuw74I=c58>WP58Q^^E%gNmOHA_=dv*_|& zXW6OeeRoBEW*)ZZy;|jjQp?Fe%l#Sb;cArCYlCI>^FFoCG5giw#buk%*gUh_wHU9Z zERS!3aI-`J$Q&i)g1p~#Cuy0f<IwZ_&ZJvlKJu{}hPGt7%L{E)YFZ*(3{!wJm1zNH z6Q^>UK*jHoH=B`n^3Mrj@Tg>c)y%`OLJ62D(>R@?cm%1uww62XHL{<5H;_-OF_)bL z<A%`NwGU2~<_U>77aatB$Nf*489thui|j|6eaN2lw&dJr7b-BXFlD!Y?d04=$>Of6 zTTe><(`0@!Qt0i0=KK4j0msNU*GdK3rj=Xt`*W}6oP)K@R3&92JDjjntrodP6|&YF zjK<?<b2GJ;4I9_<c1M3ykF*W@kD+g_&l|m<+wCJ`=T&#Lyh8GjElaL7sJIRG=={ry zaJqrL&#z-U(LHF+;*VqW&t3J%GjyQ7ykW_+$|wEQJgd2~_{rayH-Rq@^4v(|!a6c< zb*ncjxK1hGh_;DUI}DWkx-9augn1!qCAB(9uRp?^qoFl@dLw#n!9G}SG`P#7hy|&q zfyopHsr)08;Y_|~4O=Iv>VLMSdZzue1%4&MJL%BlWpB+f{<%=phgrzibgfp`z$F9A zUJF*6$0dL~q6Cl&ikdjBx@DG+ii*0WKYnBvmv`L;p;ERfd{W=Yt`}r`C1fWoStpzf zz^rQWB6Tkv$vp^jI9&O;BaG^h$ewt1zq&EgtY3-Fy*D;W(m-?=m31ps%8W+4%_Bcw zv;$?KIA_$`%1ssww_5MJ7{HwXX_82z3;{jFM3~eO<v!<j=4~Ig?+1Sx5lC67?q1aE zB$?l$yW;is$G2LEo+`#AL=Ts_Df)ULM$H<U*$peD&8l^g7wbZmz)_4cPB`!A1DDBI zHpS~;V?#;@L?oeY8p)w0tFZ|=kNh)oD}JO`)hrvO8^H)Nd}kTqgk4Mh`7~cfp(Emv z72xzO?}btGQaoMH+g-)i@Q$1T7goT3)weuktM=;Y*Y4++G}KoaIG`Fm7hTc19ZHWk z;8kh8Uy|9$P5DogK4l+U`p5vMkdR!kE_I`K1*-w)j^c$Z?R6%N&cmVkRn082#17B4 zP+->gn+~WAWE@%wB$`dp9i<@bsDpsbfNVJ-q^g9GxNF<SmPG!S$-Qe-IR?GuHrGbE z`pZJQ>Lw1!m%+&ju!zMhwg;A=D?lJI98i`Tj4{Pt12m?L+Wc9`xoJrZm3k5!R%`g3 zT=XTZm^#k4+-hMsvRVnl8+gP_UHj{SE8vxv*~N$1CuKK;l8Zxa)=dudY5!x5eq~^K zjFT#nh&D;xar-8{ZJh67C-ybO>0q4pXn`2Th8Cg+PPgTO1xq1!YIw1S>&M@bz5i2O zfM=1w(;Y!w{>S2Ri~ui_`L>bcbyJttpGP6C!8tK&A)PCKV9w8!;3{=!!?tuIGE3>3 za>VhR+3#syV~CF#R~s|#)~TWM)qc^VEhFLU5YOh}XS!P?(n=*@XIB<Z!h;td20?X( zjlZE4b6DabPMuJe5Z=mks}EzDC8Mkj>N#E4o^YOAF1Z*|OX$HLX}Zd1esBR^t>A!c z{25!}g%@jMWi(+5)2?epcC?V9=hquFlHme&kUt2!GKog~D|y!g4x{lE+8i=Iw#ObG z`ioZA-+C0^_F;)VYEU_n|0dY3F2T9Ki*(e({^#`}S~!2O)9N1{vbyJ0Z8>2U@qIPK zTgoaYO|=fsICx_D)wnUtarSd$mQ;~$Tix(UqVGPo<wc%H-8Z$UpJAKd^Ew^8^k4VQ ztNnI{?D%dYUSH@gd{f(2W<G93Bt)<~xU<^rjCD5chz__+@THoRf2tTSeY;MJ696Sy zjNchD(?q(MtPvn)etfYe(c#gm2tG0OXxEUp=xLXwiLm!y(Z8Ipi|=~Q{!#>0n?xXX z$y)-Gp4#vW%#b3i7fzep#b5j|r<6P%+l~HyVIy9Xv~HMeYi17G4HoT#`{D!34lCf% zL&tcPg8d~m)K*Ne6R^=7`DSJ&)_}VLZk6i)S=uwzf*@a!SRP!2OmwaH*^;He1+Si7 zg~-3>Q&eUPZwM2o#sf&Si2lR5Hs3AVFYj+*v1nXx(IGZ!O_O_C#JcFB$L5Lrhhq!n zWb$&~2#&XWiPQXN|KkOC@Bsn7NK)}e5Tr`ukCj;WOg|9(91(E%i1Ldnu5<%`5+4mr zz<C8;{}{^D_-Jy((n(R+BN)VXA{G~?7k6XrYW|kx55Vs!7j+oJ02FEht-8ACsqnEB zj@CmLE4o5W7Ea_h+5j4YNv?y)cIzt9i58};${vl}HQ|^osp|HiL#u<Yl(y8FhVLaR zsta}ATcX3)fiR~CA+NHOM*A=(xHgkMO)3S`2<CXmHGy4kA1%bMS6M>Csfuu>D2DdP z-mefycOcVFK(-vGaJkK&XmqX4M|ekQgj4tKBomoDQj`n0To2W^54}YHQ94GvZh~a5 z_hVBC<eXv+p-kv`hmgVu*RcsUL#jmIEOo`#(!c3H)8?Pc|3sGPm~x6cgrSi}bJa(# z__+jDb_i2z(jidsv1E*xp(N3=7V4IuZf|^i4%OSxiS4ti+X0Q@CeZ(vjsqQPL)Tj} zOnNPSI@}B&fX|@Fti>OK_=x<q;qwr0qgW;iBmY~-TE~)Z@R74%+l8^qo^eP^{2WD% zxA0*fQt6P;I^siI3k?ViD`mBxF?W-Q&xlQez+1OTIr4Ffod0b;Y~#{I@F{g7i`(^T z_Xw86+X~a*|4b}zS4Jbf17&1(ctOAJ&s){H<=5{TxlCHvP25d-?!6@wtg$=v<e!~) zi`kYHYz<X5O%^%T&vTv_z5lVyCg`A6JdPfsis(;C?s)D!&y!z?={P%~{B&I-({=kv zKzUNWAhnTTXbzq1<8~28GGwk!O(f)*B%egunp;t52o7aAeGW7)?u`7tVQF%{)OIOv z?(VD==+)9t5~BfpxP=EMVPY}spUC3ppL8PedwiK-m$!>w9`13Iy#m|yP(NsAsxe41 z;PrWz^m{M%>U6#Yc;66eC<%JL&9*6=ttN=Eh5t2`2igSugXH)XC5Zap4TMc!A@)Gt zM(;g>78>AZj@cDpOT}1iLT1>ed>Xc4xH6O2*i~Xh=F)VwoE3bN1YgiUy(=dk;w!4L z9;dK3qS(K{bzT<DSWS3e4=J8@T&!A6__p$R#H}XpCT4e7ACNBT6=iPj1&T)Ea&izl zR&U)SI4leY<bFMl9QF{w-p6m3FE${DnSuZEkqwlWp~oXQ^#_9otK^~@>!BDiVBi@W z)6=|ZEYdi@wwL|qK<`Rd1Zk1M3K-^MF*qh{+JdSuf(QXJx7$U`vL9i;wT0Ha#?8yI z*RaqFn=QE?YTs^fM+=fGPRY>6*?`v;<|500pSzwsPkq*Z>JKFH(U@<afxAMT%M%e; zm_)MCgU_mn=$}NJmlBn7vpKASM<cir<byfabHcK6cT~%w+`;5^UO??@C5Fg_Qc!}` zA$CL4O9fa~K4bn+)A&)5dGT4W%by$~gLpoc_0QoXkJFE{!yeXNL{shp>V+KIP;%mv z=ujQ21Xk{O+j%Gv5G9MAf-{>qEogS<Mn+wKXW)?;`Xoij(1#OESA56V-+nQjQejMg zB4UloPF}`1vd|_QSW2KEVH6u8^i$6*YCYaEnKh9k0V_Y6zD=HJ^RgL=E_J9?>@eA} z({SaRtF6};IQZeY8ov{W4;?}TSszGE(yOg*TP${&%;2bl367_ccN#d>rl(l!e1Vs{ z#pXO*GFTpM`GH61x`hT`oc}~Tr?!88<NmJ2B96X{eBmbhyG_UcJTeFxHj+|s6UH?i zG7Cg?L@Ws1NO{L-^Ki<LfIJJOA4nj(tB-{RlbM>86p`NT9W7mznE3dGZi*`R!P~h= zhH0=L@qjJ=CSFe1%>Cego%MOVNq<$4>%;1%uAOW?E(dtdzO6MesXCFJH8`BVh5Ie_ zb?k%jqDt^feQr)XM}4k~yt-yiE!?g57D@@H`OA@x$e1cFa{DHvf!zKk{I#t%L%lg5 zLl^LqNX@dOB>?v~hZAIj{-M%GThMWhG`nruZRY#yf>G5Ew~VwsJFE3RK$7_J;k^H0 z;O)l1`!HY9M$fok`5$Y|Tx<~Ez#k^#eg*vXulnESBp7TFPzEOVX^Ow(dtzo{-9c4N z8;`cgtijULjggi7>Yvp+1RF93y@<+oFT_`kG5Mi=60gtx=bh=5CZbnqosr=tBMed- zToEqPX&f@a-w2~Ef~UyDAA7olGSI7T7d%=G!|U2os#74_tI7}Sk$q|*%miifCW*;9 zU1X%x1w!flW88S@mc8CSEHX#bCSjM6hc-h7MVN5`1h|9h{o4v({1VuOjSKI{oD*)^ zxcb&@fF1@5{!IaFPwmL1Ve8<cZfcPEdX2VMu`itO1xIYxn{A3`-iN0V9@>I;z@z(| zb^dxfE2fTzA7OvJ0^kWQ`0MZcCw|wAmcJhS<K3(xKwS;^jT?N6tnwmD?Zg(#{BD6K zGf$Fe&f6YGI_$#(*}+m~{|HW<&so6|JVK)^-+XrY%f){o7s9P*pPu&ac{Opv`|7~_ znkKRB_wnNS+e*LJ5+v!^c;Z*%mq4LR<yr%}3q-Ww6M8lMk>}#|*{sBr&Jzp=`AnC| zKfdm%3h?NG^c2V*O^%lSy(5`3eFqp*K{`!@v?DXo&<pe**YlKZ`d$4C?+Xkg<wS^Z z?!{z;04`Pgs-eg21mEajR-qKGXTB%G%BRa=1NW-h_-Ai_^k%>1J`;VPn4J22Z7rd+ z?V9R+d*>)V4g15IWH$IAWt*AEWx|#yo1J?!&e2nKJ8^~V3AiC186{^}(-Qj$Jkd+C z>CjrQ4gnV9u}kDc?$#pMA$FSlPq<kZvyD2Sh#H9kmRe}0lWBR(!8RJh3Aik&a&{?h z9&n9>y9GS7a-`i&XCn)kR)(~x)eoo6Yce@%@ORudx$~*gUeDIapq;(vqx}OE@T$0E zxli0luHAWL8N0|^8JGiUP7wN}_blRkGE5ZQ&Ljcz-$fGJc_&EG4>TmF<8DUh8b76~ zhvtoGdwy&UF2oF;1<*655G6^jhI}id+Y&l)&IjwmZM$;{P!URE@Hg518JLHd^R<-# zpDC?%v-MBsh4eDcgZPj^RWIUCM%1LAm$p--)V>x461bEVh8Dn&l<a%tKhRUDSjU7x zFk{Vwbj8um4(;obxU1b7?t_P<f_=s+8WdQ!W9e;Paah+y8C1N6P1}RpJ*|0q-jIXw zQ~D~3iOv~v%<)X7v^6Nu;Qa2wP@ASXrs4?<iJt^Ix?)2i>c=I^F1_NC46#NI1jMeQ zi+<sq`sQIia*i;x@7U;=f5`q>(#pwARn?tmHsKVM>+p&0d+HZUnriH{U1jI=MH>yY z2P0I=n>X9$3UL+BfdY#Fyd)$D(4cYrfvz~-s^NIc;Eee@ZMq^jX04y{18x{5g7YfD zUG->+a-ad1G)Eb(0qmqc%QJ3<TQ=`|%)R&S`C6O66V3bZQax(C+y9w2g$2Gk{xs(& z!*uaVTR-F@wX}uZVoz~wx46d>5WNal-)~!8N;hnjCeYHNiqCoxSSRDu#I_yN+8w}V z&lRfhWttQ60z0aF{DS;+Lu>m%8Ca$j>`R*9T8M;q@4^nrX}Wxo9xTvPmenz*d+b_? z{B$CD`uX|Ppw|hj8z~A3kUr?<2tBG)8F`2w1mtV5A`IXO>y9+uHk{K&uon|)D?!w* z5h)yNMPW&>+FXU3@3Lo-{yB$hOmv`c47vUkYEN;+&PpheM-$Klc!{pg@`+q|>?>Do zCw&|+@PY=p*+c<OcJENL1tX@r-nY_sWZ=)iRr>x_Nor?6w<j6$&_fYQ{14>+O`R~I z$2P^?Tu<+i_wVq()p;{a#naT+Y$rR#e{J=_T%t8bGYE=xh^HzRWK4nAmN@zsF0OWU zw=x(!^;he9oy$&mKl**M)m`V(o&c=~NGZzCWNX)b3=h?I7MNUE*;3S`Vrd&io}hp9 z)%bZ(5zZQvY^t>A)r64!7`{jlTc+IYZnt2|i726Wj58!usP@PJmOgXz!Ssp6#C+fq z_jc{$ZIy-$(2~NpM@|jm{E7;y$zB5yduK_O%(_u+oLTBtWftjdu42U2F#pt(j)sP< zwNshlds5(E_4B}#QkxDWw~4Goga1iu`Xp16ia_r{<}K^Cp@T_$vG1Hu*9#C`{Tk^( zEG4(-35gI!P#E+=hWSH<t3aFgL!iOOJ2fKF!pjIYO51D!`@qHtf>Q^OB7LV6%@FnJ zKq1PLcM`v<2#F6JD5l!rnbMtRS@vNyV1Twgv@ejcqm^us8uxa#&Jl3q0S;pVdA936 zX>QPFIW$q(pY5<=K!EHOBAD@|kOEAV`fb*xwTH-1dn0L|va?R^!0F;6QP%tBLxseC zj5HFRM|el(#ZV_|j8P+(3Cki41@j(tNR#*W5;Ojgt8-1G=Hz?n+0VDZ%#stj?1OP~ z3tHW$;IR+HH5;Ld9CKHleH%-wpl|f++Sx+@svzL8TheiaH<NcAT=6XtF7zUYLaF-| zgVUD<fFa#6Qd;EgR%3xn7;OzX#^~LN&RRCOQGYD)$(e<vdQge`D`V}7wYn9ouLwtM zIx}~Np<CW{!-)IcC!Aat36MfCxmqbDGXp(XDife-+wjnJ{hvqKHcbVGE{c%#?+)3l z*Xs<wv9<!K7}Ci`<(AEoqXIaUbg5y>h`$)X;L~5Cwt|vkr1Wg8+r2>@duwhavWY=q zBnlD~4~dM+HA0=Hu&r0&!!RS%(PrBEU(20avJS+aiVHfuwQFV#)ZWFxnnfNBikNc8 znB`c*F2dlh(uQ_Pf{hG=N&(ZFohYqNjeWBQgbcG+RL{Z0giyTrpdHf`bWHa;=x;3W zsa#KqyR$wA8;`bezKVXkCW1b9tD^EHPyZo%`Cnja_Gozq`MkaJ8n2BK-Uj9M$furq zOiom`3{^Ue1K>1k46U5z92@=4E__WqF-AK;3;gVGkuOTRUm;p@iMdU*PiPBg)c)xO z$lob1B#E7-6nJT(nrYQudd}(TU(<Jlra4)W>1Dqqm_Wa)F6u&HCd~dab+$O*V3M7j z2_MW`8=s6d0>V~Q0WB~EY<)WCM!XWvcL%IZN=#(bRLEf=Tv9I7o=$PkD&vqqauasx zDC%=6zd#y1i^hVTas#q(a{=vPxVwI_&%qck=IhS)`pUjHtH0c`S6d<;%jo|yumtEt z0D%;IO)SXK#s99-0?)#Q-V}W~v>C<%qb9MfGuA&xpWWj0x9c&-BG{3GK}M=T>e<?E z4M!tQ>d^l5#58TcEwv9QvSSZnPloiyEbXy5v24Bn$Cx>{THwA>mht8KMo#_g`vOQX zC-$6b+O96bO=r2uhRF(-Plpa#4r?RHq63eD*;lpah>Ck*?JH|5s7u%2`#ZjTjh>W6 zThSJRxX7f3sUfvk!0%ah8Y5X&g#p?-MCjl5h?YuIUmp?S;Y17}X4=S5rZB!NbAeXz z0a;KsckPKVG%}fP*pBQif`39dVp6jHTrifJn;I>;95vVB0`>1Zh+-t?;Sr&OLK^4K z%3Va1{PDg-YeB$US<za=CN^88EMsIq@`N2)V&KWJIJ-SG=#gNYlqBbdSUq#s>Kpsy z;%5g`Z6WxIjnvWd5|92cG_`urDQ@YEyoihV08{RoVzt^G7#7E0!wskj#ldmyowdlt zw>j|Y@&6hY@0q({q=->G5<z)mL!l1kQ#Cf}4)gl$*;2vh$Gf$OxSnoAZ_f^Kh2Tn` z5G=~fyt8c`mB=7gY2NwM(;)b;Hoat)!&5I;KSIwvS$UE-tlptW*f&jj#kPXNmX7WB zaNY0QotR~Qq0LI;`k_S_zs2-NH2yqNx4>)ouW^F;LVI4>V<>1Sm&;;%3uf#ET4l|$ zo<9&=tFYc|;DCmA8Le&I4}A<+>3fk37ZQlxoc>VQp2fS>&cX@mYzlE+Ml3^0a(In? zLv#CA{?5}FdKc0eltsh9!7$60aU9ap^V7+i%OPL#B}iCzlbq74BVEcpUlzv1Ju`e# zOSDW>s~Z^tkO<5;=0$S#p4u!fm3J4of-p?gVL4b@#{(J#TjcIB%cqau^Q8k36zr|R z;R925?L;=f2U9+u1(NCRoQQs#zYS5P8G$9{ay`}ZeGzkb!Gi<NYA)Pdpzs1UE-w>4 zX=1Ud<jhO!CoKr^j;Cs(l#qhON>a2B=2aO9RhL{aE&{eK)6H0w{I=4u<FOuLo>Oz6 zDBxdk7G+1A-yQ4P6YQukk-%pSxDN|W15P=lAVfII0PKpN<Jy&v?$1C^gB>&q?{HFp zZ%3)Mv-1BQTJ^t0#t<yv_^1@d(+2m_cW*p7eDyiqR_EL=0%du=*QV`KH#eufTK2s9 zV><tImTj`?d9p6S(R9YsV;lXdGkzBS<TC2c`w35wfiyeZHLTKemS+g>{$=3k0y9Q3 zLdq+>!AM|>0yzMH67P=uIv>#TitmmDJxO@iE)!7mt=I%K8G5M~0c05H<%a6M3MshR z)LR62_m;si;Zyb!>!b%Qd;aO1tRK(U<0f>7PMkH6vNW#xR3?9k^QY6NWe;=J&%kS^ z$K6BQ`)!+8-{QTJQ6TmnB+zo5|Ew@N@>Kh*2)Lg;PanJ3ZghoHSNn@p*&G5_bfW`m z{g0ptC^#&|7X#Q>A6mL_U!lwj^ksDh?c16*ea4%@6C>sPhmXZ;M=R)_Na;xeCA>p? zrl_heF};xYRirtXj$-o(qIXU}>^(SG!^v$3&>56&4!C1|X7qJ>Ken3~Nln<fb@sN- zvCXR>!2_6afY)o5)vNdGZiKeASs%ZOs05t$=o+Z*FMPnRr}P+5tPeYZVS}xsJ1&v0 zERiYWIv!2P6wW`&x`QnJQHEdeX=Y3#KfeZo2Wdx-gieN)bwL^KUn`l!V;I1-6_8Sr zr<R&4{&ep#3Urtr!}-#?Ok9XbJE&gH%VWj1Xs_FXstD{y-3Ia6+N8E&oZZ}iWk*SZ zBbHmHJfJ4*cpIc`cWBIkmB2y-?XX&`D-+KqDfys1MpSGKb6%nZ?+8Bx2PT-$A!ZzU zsQ+414DT_;6STB)*Afkpa+l<$AS8XcnUCP{_r+=zejP*t?V~9Wa2`Ae>#`&G&Auc{ z$2DM5kMfN69&0(pH^(M_biod&y54Xx+BCMQ()3H7sCphA8EY_@oLTV>RN&SHbO;we z@@uZZp;nE4!lHTV`8<Cl(IP@0b+;+UboYvM<Mde)Kxg{pR=P0Y)HIS!f|22dUd6~= z97!aSQNinP!kAFpF=`d4J>z(ZfWZ)@{^;oKOAhr3i$U|BS}gmu$cWdja*7KQ=f~*2 zkl-%;+4bXj3?tb~9GRr&a7}K=1G8XM$q~1(dI<XpeXLKoHdEo+)G6K?c<sacyb`JH z$PEtOoJGURWL{16%iHzfrkwcdQ32bZnWi@KXXkW3ZyF%Z@Inp@M*Gv}Jn)@dbOP-< zRhm>SOaq5w?Sye@;keO@3KW$chotZ}sk;vk-4t!d$<5uGIgXuAGnZ@BDo?Cha@od6 zTUqal9FM0vqCm<BdG&9rYv|$g@l@HH?t9|^M)C%DaJ)Xh+DP1ey3UBa>FVs3mvGGt z2a>+c^e7XCM!zYTa_*sH&z4j@Kbv#|86`b#D$2vfZFVCw!Y64JMcP~wH^GY-H@}<C z9h!z|MiTH3<G)TcFgcQuV)uyE+|I=?y7b@A=l_xtkf6Q`J`I$Y0+zMi>+V^%NC0=R z$JN%3VY2IM&~B|n%SGE96)~&S^-Hb3t6GE%+cLZExS|VC7zDMKpo&Q6=R+Lb=0+Z0 zJKla@qDx86=h1mk(G-*I>uUSx;avgXu|VOAV2$1BGird25%U8V)SArg41uRNIX=C2 zH<?l)ZIES>m?jyD++nXgiA`GH*Ptv?rV-B2S9+z*Y#*Se4tUzN+nziYfkNQ&q}4te z3XL4Au1Osar1BHr{m@qZ#EKAv<OTH*DqbrbQn2e>)~Mfm7wBmSaJ3Oiiyxu)dNddA ztQ4_{xk8KHUSatU3RDd3FR8yO>?ViMrj)_GZBRQq^k4nWe^=ekMz~#%H`KR}J-K%o zh4bNpF_zC_cDdeTTP^!jAyBkpdmJ}Hb`6M;saq;yY(KvUw?M*wRFw|`zw?EOpYZ`} z?#Oty0Vb+?8}dJ#Eyd=3W}p^xeeZo-l<8_UH^sZe>__QIGmt?EX54q-r%G0=+cmKI z)bKX3!$vHF&v*2?8{fh^<yKwjpHylMIE=U}t7h7iBXOUph?0tXhNjSb_}8mXG13?a zYA%<kh5CGjImXKt87<gCse8p3x1X-OdWZ@*xVX4{g2j3xrbF*B5Z%`H%ylBCe=D<W zEiGs*)z|s7=W#<y>TMURa}iEWNl$nMc9}9*#bPw@;t-qFXunD<xggrC*nJ^rw20UQ zwxK(FFV9Vdiup9R8S@8SO}nxliMj)WN4+2-4tn<5hjmD7Iii^eDYqoSZoFXUII{#E zl@y!>WMm*4RO}`>YAu$Dm)G43sqOKSWw&iW=rD)rTnGM9#-z69o@~BMgos$CK8hSS z#JpZ#0uhtEl3prW`Q|R%LlTE?aVnG7ASfygDV6E{KKI4IMX$xLlw`H*|Hh%U<Vss) zU3-<G{$nh1CgJCP{D&J>dkUS>u|$~}a5Q9rNE~j~<1sKxOi{zS1xBr8&l;@Sc0yzm zU#L{0CGB1w6}tD-U5e(fO<QD87IaCU?AtZcS4uOtR_rU<<pK{>+8pjkVi@e8U1_7T zbQz-ZQx^L(`jhGbI5`w9q8lT8Vnf}hz#{HoXmqClq?ZuhWNXshKwkh)K_eJ~SpWV! z#{q#o)c<ycClS!y%1Eg?+nG%rX>~Ovx3mB&&9kTI^my8jmnxl1Q^wQYMETvWqbRHh zB^W-+G%w<F=OT0_jwoGXyIj?m#IInHxJd`S;J%GA=Lyw#CU2!e>FsQvh(={z`iG49 zs@7l6Z@$_I;N?#`nPZY%p<GoT$*Zc}cd!{yigS-$2U<NAaE?rSYm-teo82+qMAlW* zSu;yw5aO~Hq<`&x3kmLg8!_!KEuMYb(;IX$Y`!0}^k62!eb}z=z2|TaIEoHJp}yuy zH_|oVxSNW7ZN$thyzc-h=CmBhuc062{F`9;ua?vr1_&+cb5*M2YA?b0mfYnGp~GSR zY=K0kA`6Mze8ORqr}5~{D&efBm8Y{+GUu>UsJnCWX}GBG1S1Pa%|B6s0_<nKQCBB) z%*D{zn*^uVctq$$=0A?XQ__h;Rb(HO=i41{jiby4NOnJ0E`$y#q0*-6qreStA~&Sw z*OfOo_Trhv{57+8W8C^$4DOQ%%Lj(Hg;6pfWgwHr?d42*d<;dze8eF)b&{tsQCFt> zw;6j<XGIA+pWDZrobUOiO>Ip(j_WCKIK>}#qQ}D)RWJ3&RO0pn{!&-3uZ^OASC)Bl zQpJ<i<uv^N(9;F15C)j#_#I#F9ry<Mz0WS$m-@cyl^<zG@O?gQ6}-uLKw4;e+O?(5 z$M$?iDwIW^GK;c5qfsNc(dc;i@1gU<Wa1VFlThu(LFW@d*Xu4aRsT`W@w4`M4C*<5 zOBo0<AGcb(PCGXIhQ3!%XESxN9XVNZ_=Saj5hEy~l>Aip2-}khCza@qF}c?&9aw}K zQF}a0VAl?2B?X8s5n5ykkT#0a8~13C3UB=&T<F3u3B&UjJaEkU6n~8}_+fIUbSPRE zzQ{o33g3FS*kTpku(@3CA)ByRY&10gQCFhQA#d9dDBMfUPtw(+Y3$_hnBKO;y!)fK zRRraA;#GL$A`F)zJi>>(b59Cq!F3I_>4EtaRW7I?i~P2hG$BVV6O@i0Xi>fB&SM=% zQ2YzYhbS`?U%?%}vbCl!X*mz~_G6<^64F_Bu#Rh09!#PdRh~j(RpkQB&EYy3MK_(p zzIW+@YogI!_~3!}V{nN<B#eTo;ua#FW;E+d#_IFR(KVguXDs%94wn4GDxwjJLfAa% zQet(@KK{&ud%R+boLcWd+|^*NTL2FhK<qmy%<<B96gT%k6d6O)q*No_|BC=sFABo3 zeI*o0qdgB%Q_T+3$3rres1WNdIlM3f50Dv2PQ)64JLe-@*B3^D?q7Vz_|U5RmWm<4 zIM~{K#E$J#4*hvTM8U<!A!DwnN1^N|WAMA6mmM+Nh|5~oT28v1-!sH!04gb10;xDU zrBHkUM`Zk90u@Vx`cIp_pG9hF49VF^JCuHuzbSvKTuG`VI~r?>#}I`TVZ|qm$Y4n` zge;W}sz?{4OvVYRfKeuBMMQ(Gdu_0IxgEHTxA;8Y>3QyZxr5ba_2&W3ohDrUeA>*{ zJFYW>d}_roX<KF~2&M8jLm_p0w&<LMrbbFG?8aO|Td<huaLXXuD+aKyGV&Cvtr1zd zn6THgr-<MN_AlZ--;;ymS8iSsXFT~+9U>23lYhv)o0l457VCEF8^WtLoDb=joGA|x z4p1uz&2<mlnBGWW&-V@zTiV3=eU3~3_xz8jjxkYG+%QIef8BN85Bf9j#V7bmTeK0g z{$EM&;xp}E46+zGh8-cM?WDI(GS=ViUk^o5H6i<%W26QP4Oud0NPL%0R<jDe)I?Qb z2=pQ?pbU76_OPCnA4Kjs-JWkjxcC_jRvZ-$f058}TfP0daoq**82Ob5>bw`lWzfB= znH2pG&A|T$b=dSoD?`0I5tSSD_`@e^RsJ^orDWq6%fyH@p1YRx*CGOf!l7cuPo=v6 zzP;Ye(z}eM$=q(+=^rl38iEK%#m>E*bE79vL`|h>HVS4Nv`s_7-?FdOVp}gEuB*CS z>ik|iy{;SR+ri6sn<%CqOabiZV)-5mzD**J<414;iw9V`o|8vGD+FN84(@st%DC%{ z+MJ9DS|P&1^`lkt-4SMlw&Ez<w3t_mP3p(+wHU`-3b9RE9>u%;o;shZl)3o1xp>zB zbzYwvfFU@9E0H9>EBxMojhB#N4>oGo^#&d|UKas^&ND~i>aQ1j*C4)@pr2hQZ7TAA zy_EohaDQKvwgAK5e@jFEXr0`%NtFby=8pU>RbLu?*4>3`*8-)l^X3eK5pj1HB~=!q zh0I-<scp5W(BCiXloS}=JijH%PoMb1CeKFU3g+PyrJjB%pOXw52G@5PGSEAl;J-|_ ziWPh~3<59_@hRo3rrDm3ZaBLd{~6h$K7Lh*{Ho-d3hiJKG9P*Ba9Z!-u$tiOK;t~v zF$=XG!FmuxhSTsnK=Uotd)glBsfu<}?f7+?ZliA+p9sjkg2QIMeZpktk?0OknRV+T zWF<d=YBz|5M}n4pY9ym$dbYXO==DqcWzFd^yQtc9b3`|2b4V<FPLmZxpt^cD0oFKC zYoR^~Slaqj8vnCs{jTtK-;^$)zIy(S@vOszm@uRkXo(<B`qhPW?CGjb@7IonJ5US^ zB&kIx@r&I-<JObtVE2Sewr!jy3gZ&9Ai2yLTZPygYTI=y{Lcc}JlA)GB4X~#FlPYZ zK?C8oZCvx@`L5F@$rP{5i$Tx6&(LX@({eF9ck|deuqxiqk7a3|ov%%98L4Zn7q<&v z=aD|I1wBn@qRnSpXD$PG3l@)0?;>XF0A!FIoV)Mqq-(Lk0mkhw?m6okoLkN%Zcr1( z0+&9Gk0dS<WF%5v<LW@l2*=q<D*8#j><Hf)LnJFaS;`&o14p;gt=62ntd5?_FC8Z8 zs)-bg7v-Xk3{n+yup<vy)T2HFL$Zln^nn;z2_bC}@DiwFjD`5DnKe>~QtU5`R1)Uf z0fmT@&pBo~5H(?~P~=?06jmBG=NQU&F|WHIt12%Kj>E7%GNmfkv&U<Q!c;XndI}g^ zlbD9=wuagYU|zUr6me3@Si;NI#B-eVzXbL@^TGj(e{JSI)P5((RgNS73^t-8+Vj>& z_YK#nzHE&3g$_@_g8t`{7pNT6T<E_4>AE{IT+7xDdHvcp_cc=JJm}iGrM*=Psr)G< zsPHiXrq_aNk&s+_7uA@JA0)x|r&_+`p{=P_nB2SAnu{>#RrZ&v^Ry7M86m~jEdQ4_ zX0XP^XoLdr>*g|H7RC$4g7ToH`g%{l2KnuyKinRd<8B-Gkf{o}FPpG_4`1zC6g>;Q z{`yz_uiW!b>%9b-lF!}*q-M$!y-H3yLX#GrlrePkAbjFgQK!W+9Y8^a<!H4(Z%=X= zzomM$zrHfMt`zI2`Hu#7HRN8f;(<uF=i2u@wco}V5J?L+ZA<*N-WRB7`*ZVlKlW8L zYyA51^U(cD3uttA4AdxP;KVd(?C14YxvD@G*{gZEU}K(_-+tl;&7>^4sQVEiFUrJ~ zb|BdMulBBcNJDMsMAV&_hC_4SKp4w&_YnN4#AJq>PXxNSw;AzE^FHmDcD}UP`PeP) zgCV7)h;-bJx1lz`R>=#&hwe@I?r|f<AZ8MP_}lK+a23YOpI{lYJ3yo7o(k%+fA><w z<o2QhCmpktv-*EM_^)>qpotAJ^L}Wz!05YHvirTsEWeM+vqH5NK`z1Pj%G%cJ|th+ z_A6x*))YW@b|%9)O&2kOedo4Riv}da4crp<yUiv!^Sh0J74&$RrBD=nI|;&+oO|p_ zMl3z(k)=)Ht>zR8(?;PezF_2H&jWW#H^AShYN(bPHWs>B4!uMq${o<brUlBHB<;y# z!Y`@wZx*<GNXfckaL}K>H)u&8)rwXs=rAnu(3oi?3VHL8qp(_{1s+qJ8qht_?2;@6 zMNo)fAq9)M15W!G&f41Mi2Sn?cV;6Lgp?7_?^n+l*HSvNAL2unc3Z6qZ8}=0bQM1t z4(`xy<<VoXJAV3AK$q~C&M_cGdcazIPS4BhM}*&<msh+4N%K;fOuoX-91Ksm(x^n) z?JORDd3@A5XljOLkl%rGdQi+gA~wzy!u8PVU!AsT`hAr|w7q|G!ovxd*{9m&8Sf<A z<4e<)%KbM6%=isj@6)r<#{*(v224);J>WvB_fr_Xu?t$btv%Egzw-@2uqJ7`Nc7dN z)^-no1QLF_Ue5&oD~Fp=b~43D|HfearWm%F>;kT!acS(ud2|+72cDdNlyCUzJv=<L zndbE8k632JP<~AugsZ@-et$2$CJOM<I0{-W;8%!gMaBZQ=)5*83`SNLWs4@d(T`D} zfF8=2R9c6~VV@U$c$=syydvJmE4`+7@kIZjRe-&ZH~=0RQ+Y3Yx?N)D9YV%P6G_A> z{J5dVDonI#tYJG>-&OZb;ixiAz>+ZVUPqPNAT6*hlE1lmRk@kKaqEK+Qtf{dc}Yr< zVy8q)OqAA#{Tot_1U;i0K%s^%kx4r-CKqGHs-HoG2cf_et!$158R`Oj-uu>lb{*S} z3Ns^{I-2b^9kyNVjg6#Vu>S$(y`4|tBU;2%-|%te*`Q5*PK@x*wf>`}p$<*o&IB=- zwFFq?_-X71@sss3u9iggmoXMHOmwQiRXE04^UYD=2Q<@K_%$RIxpi9%@;gB7rAcT3 zC2UUfAhX_BEw|+&Cf0iwl(kOS@xCJ9dbw>wsPup22YfU$n`Xj!Z{4{(fRv|`68er$ z8q=2tx@N<2UwnKvg1<kxCk{34M=6MhchvXQR)dnnSqFQqlIa9u(5G!POMtl9Dv5{( zO)I<jL<?A-o8Vmvf-T28rzU8FfBiY{$qCEI-qp;~s<Yj^^5mbVHOtBzQlt*-G)VO& z8Q|JuJypuXBp+@md2!|eFOM-e=}Tk}@nbHEfFwlo|B8$UnJjk!cz2BNp3Q`bf9B>I z%j2czO=xGU_B9HBr%$>J1KhyEL)0KL$kJYV&SWe-Dhe{!mM5MU;7l;4yx%)5T!=jT zJx(sv01jr)!|ZrMNDN*hRv6dazC8l1j4Lhwbv#Z;5ODIA<aR1$`7hfR|NH^a3L@Yt zR<P-%W8+V`m2Kckr5E%Fb{CTScaJai8Vj4~iiOp&Np=J^QIzSs3F?ZNA_wz^36A;< zA9b2l|2^F0swxSRko@JC%kO+>;#BZ$bI0$_Y2i1cjZOM?Qu=zWo0@JK>L20M?2O7^ zOF5_<>8r9P3d1k`A%0|APaQ#_OT18-xC3b2!&hD&wb|HZ5H-z?7_xg*(6cQR&h|?F zO9WFsI(EI!#T7hn=_W|<!`LbieKle}!uhua(~Ky<&8{3g0P<RD`MWj|+3PS7Svx5T znl0reF;xK?pN@Bl!9Y;yf$cjN6ggM_H#`9@JHje&w0PsV;)CIg1MIv^oqJ@~VEvw6 z#LU(IN7z4hR~l#A!*FcdwkxSPl~j^SRcsp-+s=+{TNP`^wry6lW81#d=Q*dl&-nK^ z&#UVLTw~1NT60afGoY=`BwJX0LnmFH6TkK=<o{9)pO}7k_Cty5rHDL%F4;tFeEBKj zOo!H<;E2rpXf*N$!IDQ>k9Z1gWGMB8JmIt9)Bxi-3`TEOrOHz{6oi9Q{+qxIqh-Pr zIdPjv^N&gO0H4oo^+jjnkUVxxWPPwaK0gZebch2gHt!%fmHQEdm@w{I6hV|@O`$ge zow-=V1XtmXD}!{_lo8uHbbOUW^zy1_EHaVc2q7kE{cZ?Y0q1wJuVF00xfd*?*;_TD z#gS4V&%rP0zfoz}GC_Fea|7|wb)APG{kq0^Jz6Y>3a2$O;quGytpayBbOzR{9bf$R z@rwrP&%61+mwUTDk!`S@<pppP5!M-xFfeTl74`9l@GpUMtB5RLR^#PNpp~FOGycbr zqMf`I)BVz*{W<2)hB=F+NVzmod4N3|o|1yrw9bfsYPIx3R(cP%(w2TODiI8pTC@=> z)A0j~?pL*{SyO-OmPJG*e|(*^^6LnaM~tz=leb=GfypCQd+#e)AANtw$NuuKOOiJf zWv~$iU&qn`7*ILl7Oen-4vDxCL!YZ{(Axzha<kWN-0_Mjd8uuuyVJ|rG$f|GuIkR8 zKOQwiQzl-B3x9g-c=~_gjw+o~Bz^=jKIV*@IOGXm6`~5t5AEeabaAd%bW8Ov-L9Cy z``Q^lWuZCg(G#`Pjfw?n4pK1%KjH<GM1}-}*t);yJx_PtUu5yuxL$OSw%Wb3A5>-h zpH$H0HHEy6cjs$F2-+W|JKO{I)g#!De)u<|nXtPo>oqJXkIdafWBN!<QDlJ5(21W) zpO>Y{$zzQy#%QG`t-J`wv5MjlOA}3kWMQJRwrFbM%(F22^1yi|_mRRiKSm8Q)zCa` z^cSvsQeBe+Qo&X8)8EP$jQAR?Pe5y)l<I~@bygD1ECmJBh}KB>?rIaxR9-2#%lKDE z(91O!tSsXSF={Ll5xzZWZK)L{=i3JR6;Q9;#3OZfs2%XJDDz@wS*(|(S>xar<a@H# znj&B2d|k`+-c>F1zWt8ZPz1P-GbN`Kyc|%Ps}=DEeQN#Ms@>m8wM|jyrT=Y!@mr#Y zcy2j%_AqGB`X9vk2Q?3f%Lo3C7U2Kq;_iTB0vt4*vd7$@0X?DP)$@jMWWZN;Jd}{n z;>RGrNg>9&INUKVCEhlgthotO-zU2k5`iuq00EOjFM8guTXG}<cgv1)Z#N#c1}+n~ zuZvbr=g@Tn1)FCp`dU2o%44{Us-S6%u)%B3ntj@S&DBvWEi8n_NIf-IT-XW;5`uJ= z(Mvw~vXv40FJSnC8wx#s<=bPjf7@gg{R^(R0{hv0cu6%)D8pHSQF$h0D519}UwkBb z9q7JeQW2&OZ)XBPsywUCZ6@~P5@glvw(Cqalem>-Ehu?nCa!^vP_E^)o~;`Was?#O zIYO@$?uiC$KQPbWXFOtthNt0sIftD+{(Aerc<Ga-fkhFSmD`TfJrzh8>bM~Hk(Jkr zX{L`;Fk@Byu|y2E6k^YE%~Yl_Jog&hFqEJe3;v$noFs5YraBulrRt1Oj!dZs#+)KO zg)BwmAO9hPaKVTt@s(_Rz+VW7x#oK7VkB=4yAgd)8*Z3iqb96CI@pT<^<uF=f{~NY ziiJxH71sT^@>Fcw6y0L`d>bESm4}gV>LotVd%V#~UGeHAVuuGAm)pIg!l!8mjZdvp z<yGCKa`N}rTp~Llxt2BxY%~-GC)WG=&UsHJ#8&baL4&d?j@H?OVZ8!8>r&FjUX#S% zSC1~m$)&Ru?$3l}<iV?af=sK!9!17f?7)e(wW<TUjW!juos_4JWH9Od{	awyW?b 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�=vcFnmycv%UG~ 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℘@-ydnCJz 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%0D{Jbh#mi2Ob7){R>pgdpHbFf>>?a|pKTdl)#&L8w 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%0AA@;%Nx0Tr{$P`+~aURACZh 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�C*`j?Jr-yWJDY&3q!u@%Yk;4 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%0D5Y5V9jZDhK|p8r#ZEzgauaP zv>^)B!7aJ*kn^KPR_svLx`L5`tP5dt@9jh4;o~?oI}T3H`YdPKPDV5*ubrWgQD!Vg zw}5+Fm^$AbF$^f9kq)Lph%kgDarnjN@I^X$_a(IeBx+<yRb6A?NnX->nE%r(1LPHl zozfz8f91zT_Z#2RWotO)_s5OPDXGt~Zj}-z_+vpgLH>-U^WPWZtPLNYrvuW=sw+%> z&GLwoCN+q~D^AX?qIlItosxtQ0HeBlnU3@apGLyz3EsEBYj0%FPBeEeP3j0<5qz7u z-_|1Yae+A0`yzp}Ixaxdt%r+;x1(79qhkN2H7TY4L6Wr~!@+?+as|*(K?U-`20od* zmuJ5Nx87fivtLe9FekSgzx9NIWhjgXsI&uZ9{6NZNR)cP4JJi=tQ&c^2Pu}%k-V*o z#fXgfZK*b%935EK^&ejF5{NIFyhrOAQy-f6Hr|ZAXJmLeKm$-lFlJs+xcuhR)vRoE zS>GnnJgM{uQdkPM%4QLog!>npumrTj*kM#NR`xh00FR?>S=l%J_yNAbIK!O$48}Y? z{3wR^x+<&+q+<ulNxKV41$i>{;+cg<w;e5t6mFtM81xQqczD0LX~U8IQiEyfoF!Rp zdl2&{`!xr;8yUzqn8eInWGF@G*1y_v1vzXW#@?0F&ZA5r=^IY!oN|ukGzI6UN6+`M zaIoYAkU^2ifsN`<BU9iN_cVRgVP5Vwy4tlfBMl;3<Afo{K?DxTjavYG^4j8H#XKq& zp9u*=8SS^z@Mg*vXBGsM_ey!S%LWNjB4pb*OduhyO7iEb+Ez6AN}uP6cVS|e;Fm2E zGCvI@)x-$=|G4v>Zd6`xUm)U=bX*30X>q(69RA|}kmOC$>9J!#Y-qIi9t5Fj(F<-( zB0kk-Z{eoH>CFGzW|-9wfg&${e1M36GrL<emDzU5BT#li8H}^6j17-_A23KsZeM@m zQGDLJ8Hc=a5o!#@9X(w99&ab;F1i`)Y71qp@r@-@R^4HiCD@`)mN0<kWr_29m=066 z#NS`k$E~8S`85y68{jd@OXcXXTs+3NRW@8W5|!${K2A2k4nqv2XJZfp$WDtQwrv66 z_DXYJVw>HQaC?7JQtl%n?Cg3C11p~FskJ}qxAxdMw`OAOr(Oy<e{9>TMNCAT5C1R< zzqukzb)|`7M>BC48JsU>1}XS$@bt?FPrJueZrEkl%NVd+Nw38*ka4{E|3NYQC-7GD zK>Y-J{l#a7QS+~ddgQ`{CEwm&nWMX}S0+A_rIsW*;{|mmr`xBR4M*iZv}YSup>e`F zjd>yJzpng+3HhF=K&cz9>OYBrXqD398DW=Vn;rIy*m%<seXb~#Vb^5SzM1l1L;9tH zqsnwBIv>xJ-F7ji8cC-$<bLKw=TegXh)K(uZ)|BuoO%TC87a#V(Y-3_O8-!(GqnF! z7X#b_fB-)sjaJp8$7}0HIIl3i`v(uxc!`qcv>mH)ANXt;5dR%d4UzQ2{6hMH5=`K1 zO53O+uo2V}Z_cxI`DgW;a{HrE3dYCOD*g-Zsq@`U)^0yPO%`Y$sH@jxvz_0dB2&JW zu5fX~cd)?Ib^v3LKQcV_hp?JAfYSS-a<%g`H1kELN^cL$cCbj_Eff1i88LdV^fGOq z_+mo2{QH3Q_G2|#j62iZT#L<2Gvv@kWf(d%KZdPFr_2N}*<P;P`54-cSJUfzDE(V` zSA_3kw2Zw4dpC7lGLys4=DqSAfoP3c@%6`EF|NgV1S5rnSw@D#Q3vJz%5}3bw_YoJ zKI~pRz9F_gFdz<H6C$<kFy8~NoJ^!`rw-WxE@-gvIQJKop8I1_P|{s$#eNvcphg)C zFDeW5qd7#4L8<tOuJr|RxuR-g^}?I1{vvuGis;}kTeKg!C~eFMfv`4gA;=(7BvVSd zrhC!zvaOf9>5Y%U>PE$-%2}^YSwE1_$F}p<N9Y-@KQA$z>{WXql~%8}v2TS&!vtRY z0Jxy{``l4@NeAhjA`s(`AE=4{`)I9f%tEe#f4ckv#==$-uK+3Q8QTl)c%1>57#?e} zmpWtRP$4q*<Ms-4wz-_^!;8>e<QM-N$S(<r-2@~n|9uwGlKBtJe%8HBpD+s*IOue( zoBd?jeGl7xU0D4NU+c-4i{*JKZ0JM|^+qML8f<SlBQa)p07i~aq5_3ETC{O-jvP;7 zKn>KPw(~+HpZl;!JuF+htY~6FT|F&Ko63RfKR2$fU%EU;SzGfsnh14aE$ZeUx;1IC z?z7yMNs|ohoY5K{c~Mn0FhpRsSM9p=;2uz;@3S50P3G`X^FM2+fVlz8Mpl@q8t)9& z8kMtOYK~huIZT~Rn#@m66lIx5aW<Jsck5l&*DNP)A<p|URm3y2JA9v$r|&5x?`a=_ zJBLk{Y6;?Pc5`_)EQlYn$E{|XCw3@2l_+oS`BSX%Hb}&8yDE$?&NpQe6~Tbrn~^QP z{j35ojAA=liU;Q+cuOzEIlR%Q|J!d6^yXa@O3oRA=Yk7B!JqMEwGB-0DL5zwuxY}E zLsm2Cs#LE+HcDgHnLNZ%c;|JwiYkLCrA42|HwQPhEow^XHwGj1__~@3$u!NmGHXBR z6nDO;c{^NYl`HYT$Mjxj3*8*?UADc>EH08<+Z`8_<hGKDn2U!`(+HNSRqee2wu5wW zA~tY-H;AVxP%B@S*&a_p2j9>WdQ@;@b7RazBfiXj<D|5q<f}dXPB;_Y%otC12C0~r zId-;AaJ<y4m@;jFrfF=+`*%){+j%GK7--h9Rc6FbToz87D4dhMPc=Nmd64C}8iOdo zQsHE7K}{mI8FV%V%B^cWqrz^s4*UK?)@sN>mUirRb3U6=ue?02EQPkc{+s=>8l-47 ztA`uc5R;L1^^#RV-2v*}%bjh5R=~4<V@m9%AtnEvV-+kK?K*SV;h+*1Tp1mKFZL z5eNaKj#B>&8~C2Dq#ggOilv2uSTJ<6!@0f<@>9D>^RqXH2>6KB&@l5nOxIN?wELAl z@iR8}0<S2L)-mC8G#1ENhjThvq(E>_T=duq^m#d@C+aG!A1^w?&qDCCh-*I@IFPcD z!ehz$+zlHF)Uu+g3~In<vGI%!K}O#z7A>NB?`ZuR8iYxBqRDA8<Q?KW@-OtXvBNXo zWG+88*vj+86z-o|y>V;ZWuPmy#c-ZTQ8oM#1#u`*uf2q@bYDiH%g{nJ0+-rvwq@2b z@sOM+SS&9Bon$pRcvSSWqC51>JJ0Q4o8`x@;cfJw&?8<lZc6TGWYENO9fs#b-zc2p zkz@q~dU-;XnyP{Mws32a$;(Bh&Ny(DzJc_FiNq@B%daA9OR=`1sv&8+;ZJd!YsGUM zuVqNYVoJrCUTdw0A(0Jhv@U|!2XS354x$MpX0suOTfnmFtPZ{pXwcxi&xMxifRI@x zlu1lw6w(cXd-2s&bC2e*{dqVbxzi3I?Z31D^I9Z!;A<8MC}~#Y{w~-}a><PZOFfaa zQ1s^-nDJZgdl3;^atbLSc%^?c)^c#x%w%x39dZ&&4~sPK-|BCm#4J)7upO&JW5Lqa zBT*;VDwkYfq4icDbFkwlz%5v%odlFUS9D~twgd{RC{DnM2^V@BL%z~<g$l`Q2Q6(s zTPS^zuR3QUonJH1(;<Fm{#g6Cx)*x-SWN(S`|k!SeN3osY?}O#ciFt~LV;j8>Uu2d z2Cr$*tyEstAUA7XNzZOFn7}wEg=f(KivEQfw{kGyOiGJU^D5%C;S^8})AEm$P#-B` z&yC_6F69k%loi_Z<PN`x42IOhpVa;wrgvWYUB<pXhWSgXydPL*zS94<!9vfur10lH zJfU(eHQYKYTmZ~#diK*{_dD#zUpYh1s>)G@o!`bap~62G3O<>FW=_&)rm;sDN|^uP z4LXBi#}*mzqvpYfP7^ll969-JkGHG9N4|y9iq*?X6Z`yV_um>UK&GRNnz<#8z6B7l zs7l%e(d6$VA*X{|y*c9Hf0<Rq?Ik;2e&l@V<GxwENuZI#8Fl)N@r^KHMs3ZfzH{Kj z^>W=9Mu=aii3?*Da8ceA_wBqu;$k;XrTKZmkVs<$>$ezp7xc@n608%;;P<e8$;JCw z!><ScGGgI_C8++S)NpZ3OVK8C7(i%2m$-M6l-P^|l8+GsBs39aP7o$6t^cGI9BPgc zgGjySEEEiLrzujqYGYbC%BC31(4}6c(E#MYMs1qP6@XQ>Je`ArHNDIsct5gdhcJGo z?@?ZA(i;$+7&m~fy8R_MlV5frq}9u>^4&={lk_J==6Qo!b#P#OlHZ0--3C78S|$CZ z*PH2<_m8_m*e`yEkPkwBJAJ-2J^TjI2`g+oKRWJ`K3fqJY(1VeG&YwMq;|f+AN3iy zo7@C%s9PMeB$e|6H@3jG>;0Ep9#`GM`I6-GqD2T@TI4fMHli~*IB@@|LL{AvPPUsI z_vqACrRT5dcjJZcfO%lL0K|lOu?_O{$qa}3LjAFWq-P}}8$g;{xE;&6%T$7dPw&r; zQN2yF;@K^<4x6EI0U3BppC}Ry!n(NfMTjXf(i-4Jg8qjaWZwefrANh*UJ}!9Q{sH! z#uUQJ5h(Pv^HFl&M-h6{pu-Ie|Mf?|JEmiR2$&!=wFg_Lrz6}!&4FD1D#li9$NTRv z62GHS>W~MUtAwEctqAQP_=gQB-=UHH@}DQaJ$N7uD8+8>>-(!|N^8>Sw|8y}`Bzy3 zOyi|B$?u`QY4tN(p)b8RR{KGv)dlaO{3B!aKg#ysRwX^?W~j~5K!j*+2hC?ib%yhW z6|3Ci$o8H4q!#NuWu$g(7M0s37KCn-7Z&iHPGag{T4ACI`p^8~N_ZMtC090i;jZ&2 zw>bJWrK!I$K->$HsV28@+$XkAk67N=mdY}em!b(Zrd?-VhhQOSbm`v?|2kO=7^a(5 zydeI`c&ul_-1=2zvpG3V=~u1%6A9|hJ#1Y1o=>^Ib`=5^Z)@NknibBug9{uFvm-P! zgv!8a@V4jGj=68_AnZ0HL1bn_LRW-Le{^x8lbh+Nap4QE5@k1#54kaUeU0vPsSNrR zw_7lG$axW%b2u<6^fS5K@lv$5C;kZ^`F@kjTqEZxIn8^*C3woGeLqd7FuMPWf05MT zuZ`F>Lw5o8j#$5xCg0S}+uUX0!%|pPc~?*WePiBAnR(E?938=2PU?9`U^O<qM3K9# zVT{+%BWUC2ZfQ+F3{M}=TnOO<RYta&-gL}&F6engaw8o({Nnl$Aw=Vm`l=@jMp*oI z3<V^$okYH4B9GIGar>AUu&5?=R1;5s<=zFubg&8Zw61{m@h5NVeb;wxq1~N09%>d9 zC{s$z$Urck<|(kK0eLOtNK_^}wG+zH#K%v2WwcQ91tY>}@3+A!-VIgD$1bP4T_yh; z?)S6Nm+Ed$Z-*Z(`I3*v!^J66ZL~Z+Bar+G#r1w{!=ele!C>pW2IZze-Z}WNL%@%` z15?*uTjmto-&DD)Onob54*?ao*9}*M0;-mnt}QB3awo8&!3+oi*mASAKG<N!?pYL- zh@D@aLSnm5A-{OPesZ#=NecgM3I;B+T`2mAsLY?mlqOn>Guq>>X4V^M>mz#W`K(*| zxKlni8sm)YfllDA$t!bHqnPu|TqZzsBy&j?#@DA>X9GAW7uis6@7@NOh5o3|wAJ4P zSU0gah*J*M>vwm9j*?t)r+ph{9a#iqn1ILD**6Vys^(Q9yZ0rvo*qn(4IF;DoId8d z>|((CBTtP{rTypGES?@uJZNyO;ekclvNHH2tlJUaw(1SQ*>am6)mVAV0ILMU%AA(s zXTQ*oR^*fghC6*o!%o@4Qo<))RG|#lWbXBg^`Rp}fq*9g8B4cn%Dkq4N2*p}yhnee zN1is{K~70#mj*Jsf>WZ~>Mmq3bhLw0cg2+B?{Jj65$sO`A|jT4mWIG5=9vJIb%DY$ ztf3!Yg~1?^z3|L`{eWJExx~%KpvfpnCQ0JycUN+?I2lqoHxkUPRzy*Ikbk3`5<~jk z6C<dU!U#;mK*ZNb2qb6*BKm?Rvv~Vyn-w(#GENYqv?#<HR{_MRmp1P1?iYS9n6ZMa z{I6rDpZ!A>Jt}f2o)<0Gq#b18<bva<00vsUv3P45+wj4OM|YeP@$bBQtTaLd_%O;! z5*=Sg-crU8Jt*wAF|D6n6i@JrPUhxFhZ+sUI+AxGIJYC@;awK*Q+&;stbA1&&0Bvb zt`qyPIo8g;OP90IN2Rjvbi|c&syyT(gcVZ{TJOy>uG#$kYBE#CG*K{B;JtTs_ed3X zc*-Ft-vyw3j3?exisUf<&^a;RUzZ6L+c>t`4oV8uFGmk1Bc9cvejE(#-62wzp!ER_ z6&M~sC{f*Q%GyR!zNI~Q5wis9Rxa+$9-DMQz2GK=V``wr#tbKnf=*!zP&S!I2CUmY z100*0JI}jbE`0B1xoe1@aQ>&3>;LLxw$(#FM_-2Kuxf4O|0)n>h(0~b{Eq+hPk-Dz zrf0)j8KZ!g{~yZUDLT^j?e>lBbZn<%bnK*K+qOHlZQDu5wo^&Rwr#Ux?t1_0TWhTM z+iUGH_EDYGsDm2MxS#8u*Kf{=_Z-Bcwz#f>&#=B7-{%cptHzWV3$no}tJCj9BbHNi z>(ahe^qH9q*s#+G=WU$+%Vn0jt*@}#h>2J}-Mcr=ISv&~-hpOwM=waBVR;s1S#bvp z-RObM2Trg~(3|<Peu2!?W;*Kk;ifd;b(kH`u}(x7m{#4x9hSrT*1x$yjA<y<WItjo zZNC+u*6?Y>YHn3?`oX=-fLdXD&sfqO#S={nZbny^DpbHQ@Ud72S2$a`U~c}d@{(?` zrusC+!OPA#6M<xV=bMrQ<bR&s#dC^ifCWDoQ5#GmW7giz5px<NVK9>J+xK77sHL8k zvHBWxLGv?Dq}e)y;5Yw0iHGgkZDg0Nd7BNknn0E+Q(R{Ik$kTGR8Tg0gs5m;l7~oI zb#2VQJw2qc#YH4DF?cQ2g(u6K_!zpfhJ;ta9z(u`Wfwshu6-_=vyQlCJUq@UWaNS+ zc{68ck+-P|^EL$jha22>5L2N%o`Hj_V@R<@DKtc+Gz~qm-gtRi%0M&y#Tx6KhjqCQ zKKT+PTS^~lNcvX$*q<zV8_9U%@y~7n6w%OFY*-?EZ+yF3`i_FJKJO6Dgab}>yrubz z?<60ni@~nZ_j^Ger~u48d_0(rXVxt<m@EoA1@UPV?DNMZawz1Hb9f$uudU|%OwlZv zK1j@FVKkyDkHN?VzQrxAOPA79YHd;%MFM>laft(-^jzY;>l*G(X@Ww>HqK2c%C}S4 zPY~iqd#O{uq*I7?zwaT8)d=dR8r413X69BN`D)6|gyk67atmiF^iH@;57yN~=(<T| zMX;$h<*b_mdh1d4_jr6m<F+?i$h?w#x4UsYA0I@oH}cYB+ZTZee*e1^;9iajoD-yD z>Q=BIuD(I!zC{VVd@z2_0znCW<}CU3pcWE%)BT}PaD+@Gjf5Q6(&ej*Th>aglAI+> z2mfP9zu9du!?yV=%KMFM=frC1ezi0)$J-IB9_>rDubz*kK|Zq)7o{1Y2x2(QlRa`T z>P7js!I4x#f+;9E7SC$7vPt9NJ_oDNl^aX&a4%S!?`WP~p*%NQlOp`(4Ft-k>1@C( zlpJM|xETlqRJkkEj{}mhKLl?v4@jx3{MA?C1lpk$iy`T#mxVV`x~zyI%-kr4hW)sC zG@CG{TCDLdulfhGs;uZ%u}s-YvD-G;Voq+Bf<#CTnEvxohCWS7G!nX_!zNO|KN<c` zrkHyFnYVU{6YvYo|HSKO5|~7GS1yedYm8mh;$(YfUb!?nTW;k!FAa+-S+pR+qFrIl z^rELw5Y|q`zO03pr}JT3rQPqdb6vKxvOzg(W}SJaF@<7-cccY_x2qglA}RUU+Md&g zC%&5{S2uH@0w7m9c_FAnfs{A7zL>rirtcOH)YHXju?*{tYGYrmb4<j(16(s@5LAN= z!%RBBvt%byU8KEY__*1H`6wi4bqc<3L~CUl!g9PqHRI=%bkqyaCbGB|+R<D*3t0dZ zm4#j`ibb*M9rWz`x=uN9sv6LRsd1^Vkk{1gez6|5X_kgen70-Tacjj-6?Pf?h}yFM z)m6wxX5B&{%~W9wQi(w9nM~7+?{9QWekRnsSTFuj_gzBBDCCJDp8N^6wjkRWn96TJ zly_@^Afnw58cc<bz-26be7^_%u-BZ`t>+ftC}m?<M%@1TfX5-eKRP<9>046jo;TW$ zEZ{xO_oUP9>EiblI1j&y@&D&!g$Q^sa{R0RF<t8SDNi-+$3UD{dt9mtOO1DCUvEHC z3Y(5w1m*;c)q$4jRtDMw^`op29(r$l>9Ls47=JSHO`$Vl@=cd8D*$ZO2={v{Ic;RT zal+Isr>{6=hhpu?PjYA{v$aa>xWZS>N8!%Qm_X2T?Uynd?jUW#jeP1&H$Wz2(llX% zibPorV~;07EA?FUH^&-)>#j>tCq`c)sV;qJ9{SAzcc*&FoI`4wDIBVamEW%YBf7vG zBZ5Zce5zdapK|GCU5h9>j0d%Lj<Sb+4#Qj*ju}_1WyexM$X0?MgA5$IUNxRFuY8J~ z3=ddQA?XYugTfP^gA7Mr9)p;E>(-eUDLTyy`d5jH+aPvW2=;y=+K;x|^@{^aA)cdJ z=-OI+9}zdN%Uy-#<xusIojCKxyK`ebycWl$gCE7;zg(B^e;oCQ#bn}DKzVKUdTWsL z;3N8k*={J=-h?k`Rn5}4l{SqiX4NR#6YsD8V1|x9cQ>K|eOdcVgY<^K7+3I1a~WQ4 zLFx2cdw5j6@M0|d`~D|9fdi^N)Geo>9APO9sd%4u(O<jD`12A5s#gyrjX(*L>a&la zZ-c)Mp5&g0jezv&F7-CJJ*9sR48___l3m*O_k+UG&mN0o_nS$zj3szII<);lglUP# zaleDVxMf08(fTmhxl9^8SXcvhA+lAugB4abKS6SV6{mqEhUOima&Dy@r^DT%%=&6! zX^WGe_rFVzfT7p5a=oBEb!`!wxmr3>NRRXTQ=YS0HFK<cuXAYH@$N!Ty5*>tH~h78 zA}MFfzcxVXl$(V;0#!A%9BV?IT)Gst=kCpZn~z|<C|UfPZe78^OhsNW-hR7!dcTSD zdoKNqvJ=qO%N3&eZ)i-{z&}DO1(e1FJeV6c*x$i-qW38(zc+Zm(}jAj?NdXkCaY&x z$w8Qk<UERdv^7P}rLQ@NuW1wu2vyG1=Og)LWnccbY$v#h*Cb&kbXx0TJmIlLw)(vP zs<W5*%<AP6<0X?{N@&W%KJ^x2JEtKob&8@fRL|rLE3!;hfU$WtH@C1ZA!gkm-4-2T zk0is$k!gK{5xZP3U5O0*s@vbItf1@!U)a8?sWT)T2Nm~Lm}up<yCgrm<bogsBFb;+ z!_ttlJ+|mVm@h6a@nUJ<)YqgTj7a_wYGLJvXb3zOWE*6%P)B4eGue7D>A(97z|2u7 zcA%2LV+~hGNA<X=@Ls`R8AO9Y;ey$fMm3Z@99EcR^2K4O2g&$Hpn0ii7|W{`!AOjB zz>QH1AVskASett!?TEct`XkD?*TBfJoF0tSWto$ms`T6{dNvE|W3IGF-pG1t&q)$+ z7S_)4YkQVT>k(}J<{VsrHGstdeY<XGi*j$sTVBiOemfDB0xdi*QNV27ZXh?XaeW;v zR_gb%C_n}oJxy%tXkp!I`A+fUD=?|pn;}s{ZJ#5=rjq?w8L36F*jj&Ck-|^YT%`AB zKX#MZXu@ggvcNvYHx2A!L4%&*GKCd+S?rc(cP#uoQ~BBNT5~k|J+mlyouQ+DBwi#2 z{3Djve{ai@hHKMx;0qMFgT&h=@0Pbn^OdSACp#C0FReDL(F=C}9-f?d-mKd%M6w65 z@A7Lwr9XUg*`t5g8s>HnV~H%Dr{z(*MW^3l{IC{&^&Xgri;AQE__YIYG*`-b<A}>! z0c_|anX+UA%#Wx2nG7Q9xs4V339iSGCh@***KCN!<y*VWDM+)^h#FdUI*rXKG`0;* z=zh}|M(BA~UfQ7>-8}wZFzo-EmksQ-1_K%u0F+3L&Oo-{p97j$+~9pVkMHG<3Yq^2 zP%@4~=?8BxfzL?k^3s3)tOx~~&e6TKMPHQ21!iFY>iyRQ#%iTX(HRb<(H0lJr1#8h zYYWXz_=Am>+F;tuVC`XpK(8y|iT;g)?g-{oH>*>_8Un1xbO~<ZI7tzMAzxc)A7P~l z*y5dP2B7K0j9Crny|$k%znKGD7j${YFlayp1nD`?_RsPntVbadGcXD4|Hxp&f`LFg z#=QamovDSN`LxVg#%cRU=+}XVc7J?fNfi{-4A+y@xBbR?w#bfEO;uBsY!|7Ta^CaW z^5YRuQN5FN+#%>rPH3}=Qh0Kx6_4dQKlw$Z>c`yyfX4S=Hes2)Jynr(#3k!si~VaG zO*KMD^*KE`aHsvpM|h0d({~IP=(;_bT4h9N3?_Gek@lBYJSEO}CEJA&4`X;|WggyI zzHSwgg@kl6b@s9gILODWbG8`r9daE}=;HRbx)`UW+&3+F+N17Yc3^V940Y*MW=*11 zuv@R$i&eQ2ssKW6b$(Ie{Xa)8wv~EQT7|UdV(C{*1tiGKrpoe3wT~$GDO#dDN3b!z z=|~D7IhD=5`&+#iL~SE|yT@Iah$WF|M2jkzP|tAC<z|gW$%Sxs)d!Ym;<spkg5hJ} z-m`+Fs_yIi>g{;t?_RNNs(<nQBpMO)7kCdOu@xlQ22B-qP~j<)4BxJ7JW?tsS_M4& zV?-mm#?v1gMH0z3%L|-nk0vL6$RR(@&D#YQH))t>>2P}O+PV0o%k(`Hv|wq^_xqUi zYRb93NiXQg#3uF6f|dKkE#3ulj`Z3xDTZl;z=J!b5YE7Dos!i1b)GPw{oOfsFQFu3 z%cG&2;_JPVLR3Z*Sd8igL4ok7UTjFZXK>|zy#;(NAivM-%LBr8)9nA{x(T>u0%BgD zNZ<@tz-<>~0Hg0=JCG>2{^*zYbCk6I1xBB?#RHehI1Ek6<fM6f5}x^cTN=tIp7>U! z!^#Eo611$e+t#xKvNXBpsYT1@0F1EdskLuM^SJ26+EWpe<+-?je7&DmTbCS+lAqd^ zdPeZZ!U`%}QmM2R*d|&yN?7nHUMyRQ1I3YqLU)1u3y%!xZCOGKY@ofl@xd_|U%;>R zCf^QGDwy<lYrSdo>f8tz&d6EDll0~>D6-YubpT}SNVW_xL}=qDj1q%*ATG=e36R-I zS-CM|pUm%H(u=&Io@7MSr&~Tr#l$Z25TjrEbD@qNmlogara!rEuy=O+Wit^X&WA!K z0VumDb1qCI^UTrsWAw^rcrP}MxvEp>QnN;7f`2Rx7kQo7@F2%FjujD@gzmDYtjy$# zb#|vjUwY;#ony75&6%}!&nL1&bygLkoS+xznpq*Ru4q1Pl3fzjZPK%OZq#8|rnaf( zRoUv}Ag%k__tgD0>>8WvbH0e&a}~g0d%XpD9d+nkuaQl-$;;2r$=$Vj*|uMspP`t1 zIGGVR3&DP#-5Xm|*gtF2QWE=wSFeoC=usQHbSY!G-HeVPQ0p9GU!=dT!UT2fui_es zTN(3%SLU&-wudE~9zmkndRfc^AW?zW0&K@<q|bV+nZxFAti{7Sz*B;uv5l=o-N(#v zfhjz!tPt|<k+|ZG<HC)uwX%wibwjy>tL<x4yTikrmj8wa0ZqDIg^8@~*o8GLz5UUM z&`tMEfT#Jz^UXE*^Rxn|XC?CLxSMQ`0Xo#H%5Dm#_W%=sv2PjGRhs`2_z@+A;yX;% z<(Jqp=oqokH%tYbkuQKy+mdEk<LP~ZI3eim(`jiQ<`$zd#s8J(y2<=U2dgdbr_cG% zXuQ)L4N?XO%lj(cXXH!TgIsp6Z128pVzatve)jau;9r@rsrxPn>4ec`l?Qo&V{AO5 zet=8XYq-)8>p%S2Tn<2jME(0_Rv4OvQZ(7?d?4Mqgb+s-iv5ABl8J$}0sFPSd}pme zs}_fopNMrooD~5#$5{mRm)f>5R}zg|{Q3;Fj#rgpa52=X69v62W+Rr>EZDR{+b0>H zyvS$4v3Uq@EdA=owfjwWy<s_x7x@a!E|jhFDmw~o#E<m&YWCCGIF`FlElR69qzoav zVN}zksQ~24@}KA@Ju9L;`pTg<5{N<|VprQQ6<PJb<_fdDR5^MHJk|ik{1k<kR!y40 zl#aoHw9COy=8hA&6En1VYlUfq`UYasrt3>)T0A0OTk1w{epAM8$5f-%+xeshXG?)q zgLMTjXJmTkA;cCZ<<U!A$+(b>ear<T;KQb5@LBL_H8W;siWrDS^)f7W^cH>U2!!AC zC!S$5*^Yy1PsW{OA0)A_)$*^8rdN9DXV3Knhx+G%&rF;-QDQ7NuVc*R8f^cFU}9FA z!L=E4Ft1~h?R=e|qNQ??vF<)RVl_Dk!Q&spKFmzEC}4^uc~G8TQ-gF*p`$000FoeC zZAoB1DEl%o5G5_X7e?T9^Jg4Cn?N-C!$i|L0^UU$Q1B^MQ{0_;MrGpKrGlmMwg>lH z|Mz3@h@AYBm-3C*)50od=J0rd+>2LS$CiBjwOekqxSLy?!o1d;opp;=PWAG#Wd?)q zuQYM)c}BFaT<V#y@6gjK1ab=(Kdb98u?+VXASv9dVkyrCQ!*JM?xXS)^8@p&gX3Hm z^0kxYD=KR~sfb>#p8O8T1U?!!`2lj@Jy|4!{<U%Fm5%&J_EK^mY$N_vO6DKj`!#+2 zS+xDa0eIV3&J(G^mN!FUqWBV3L=SFDw0hlK$}jEM6oq$|@~pVJGLd&awc2cN>t8iZ z0@`{kc`UJ1B$JtE5ZDiI5Zx;IDd2`$WQ6`+Oi)!W<#%GwlaW&o6DKGBE&(;JOCQGx z=aNs^o2c0Ei%y+K!5&{)O8+%pZAOg`>*Ar4Qx52{OE^+zO^vC=R$Upv#&X~Mp4L8k z<Ev=dVFusCw!4&Ha9dCSt>Blllc9a6aHp{%16t^Y)F?;wFquB|O+?P?irCnm5XGcr z5!+e+Z;jd*Z#0!JiW{?DFE|6OCk_tZ>-lo1;*s9(M^R8l1n?}Z?|#e!bt>l>nY-Rn z5oi<Mzka!O4u9j(6JXaW!(!fDF07ATl6841cwJK{?z}f@ZiFmmf?~!lLTI#Yt{%2# zq6FW%ZgeZ3_h7Lsjf%QF%-^)1PAK=>I(K#B>E8SRHg5Y2zxg@7-K@6qfp%QG*<R~7 z%M(C&d3t+0@4rTEn}}tTDU^I-QswijGVKXzBk`zmg$Xt;N75_TRXVq4zMij4G;K=e zuM7(9)!1->P+r`Q{6;S*(%7oL8zBUC8Y?D0P3q+&WHOyCzzZ}pcMhm<><E&_ba%Gg z8Gy0(7s^$~vUwl<m}7)J6e7o7TmKc6a~F`s72+M`{?cdpWr|-&BH9#nR<WfnO8B6` zVxd{aIp1YGhQ$#0BSc9c8a}3G%lQ1(UsC1^aR(f&^0si!cZ}Ayi9tkY`v%C9FItKh zF~=AIbEaF@GvtojsN^Z<ljcz=K;=|xmj@AXxB}#-r{XW3c5W=#^#yT`h*wXYbKUm{ zfZl}b{Wt-_XmM!btbaY8|FVJA`u;;@oe2!hiTr0k(EAH>u&}K!c^hhJV+PAV7HZZ% ze%l^l*}Gu^&y-l!=N)9p2B~a0a1mH<j1F=kVhkY@98(UM7}#&e%>rLde$5I~L}976 z%p;a=gq@#LL|6+r*5DJI(!(Lj2#R$0=lHZ^-_>4nty_{7B)*nN#yls2c|)il1Ksav zX17__n}8WtX?^W^FZy;>l3K~8M{D3VfIMW$)>-dFNvXeZyt)3PPHP+wZ^J~c<xi(( z;=%Yce4cy77E;RekA;H}r9FL>y`v(4B+$E*^x#(WS_b+6JZA<z2f0b*zM|}p(02JJ zD=Y62v)CI~#*RD{MH~zqXGZ{H2`Ll7U4DCF2r6pUw2ypUN^7<oKSC#FORQ?vZMHv! zqQiewGh}qg?y44fo<DIsZT?RdK(68vTCMyCWYEDBfu5{N)_?)@F21#nTI;+bp=$jP z$0E+^ao%~_esldlExT}TJ(0F^_AYzXbrXrn2ZQV0^nfAdF&ZlomPp7>)#06O5&|sd z00WyoDHiOr+WnDs(Z39MKXD+%dl%Bdw!iun+(B0gfQ`!aC*Pjyc)*}ry|ftwPG2VR zy24!10+4ievK}1z@-@-@Jr2<_gfrUva-y*((o!&gBg2&$s(Opyrwkk|%4&Q?>Q;qP zdZ73#O0XI(*dP9(-j@viDiL|ruksL0@@1C{mE;~UIykHoXa|~YK{mJsNww1R^wpq= zKdveoubi9aGYSywZVnIfqe9yEnI!;EEp|<HnV8Z}rB(r|ZDBN`TfyzZXa?^nK_I-i zm27BW^3=0a_$h)$!ticFAVU?K*4At|`;1O3{>V&!pu-hfoe@(X_#b;pw;qVTMutDP z81F;FHQ4_>w5AdLbM<;379>T1xPpM_xnBfk*u;IEWXOMv@n+O&y9*b`aQ5o-p4TkF za%K_xQ3mOm&zvH7b+j*TlNjE(DcI?62zfATw<b0DZHGL{4Lw}$jAE{H%XV(=;$1-| zq*J-{enJkj62z}q@%D$a63Turq7x|I*LC^M9N<y4UbswJZS$R#2^!~pO02$mH!xd6 zdLNG6Yl-lBiRJq;b_e6SpuCM_R;M-ej@CGMFW@oVix33TI8$bVI^BW`ybc!oLFW<t zSBc++gg@TJii6UaKCXvGb5b<O1RDYp({|x<;A}cf;yqeBmZVQRW9GIr9@Ldb6C|BJ zj6rMl9Ax*awad@wZA=82MQm~0erRQs@KgHyQH@Eg0hTaRgbE$)a^+~AgM?!Gl>2ay zuC5X}EUVNqT@#Qk(#<O^ACI_f|8QRUMd#9_rnFPn%qvP(l!aCv?KHw}=O<-(U|WOB z{`B@|Eb`XZPF71RxbyZ#idOCNvflI1Zr?+rvJ~AY9?++Lqx7j|j)s)6#fs0GXQTE5 zXZ{e(tv&O}x|6yIoK>)R1wRb*R;F-+OxF?#A}V-}&`CN)Tw)+c$@pmdjcNv^jKxaT zHX{ocl?O~cxl;ic{KxZ$61!gtqAOQfRI?wEstm0{=Je7_w7>n*0{zH)#w^e*N15`Q zQrT4OImPbB(X7|9nQE`9tp}sdPwQCcZb=r27k3dRO&7dZib)v?fs}D^<*Y|}Ze?Y0 zw4)hbcbDczl`B-!SKIw%9(yq>eX?-6o|0VH-f6!#?zWzD47<5g$NJt)YzPAlK5%Jw zmQLS&%ClxX&s538C3Jb-+Z&)V`+8Ee7Hjig_|^a6qigA(oq_cSLi{KEKQ^zM3Nd2A zkHZ(}`!$C2!?z|(0eeSslKy$B7N!f%hgefDjx3E9o%L#)NMv!=v)YWS;b=sszZ36M zFXaGy|6GoS7hjzid-Irp@?&8I3Nso?89lTZe%WhILW|bGAx*=i2~2T5i}dKc+922D zUF^HqV9WY;UybDkJrV^151(MI!aw}lFrE&vN^NnsNfm}RE$QE(_Z`S-<<j$IE9l(H zF;mNOB*6b5<*cDv*3@KJ)GW|*tkEW*K<S&mTvj*9j0o-$`#&od0Zw~{I_X&FzioG= zn8d$fb(TS+YxunyOMUU^81`XNi%op;ExwbK*pNV!e6H2cD18^%Z|MEIhX~TwQ4;Vr z(V0aM+Sc^a4b#S`K4`m8CZ?OcT=*hc;h?jOU+1(H@2y_4JSm$=6g$Ewu}cp3{pY=A zVverqwyM^e>tBVB&&*6M#+n+Wwk8jUUyyV>>XSn~I@^Q3N$0am45QkhJj+$rb!!RL zSG@|>I6Z|!w?=3@-_8-D$~hloyWVox*dA#gM!$XBrr8RO`&u(i!L_Y)$h)wscUR*% z4YOE?2AH-@47CsaD2R9PuO`E48?`Xq-^3P2<Oc;~>fCkW<1qIPi&%|{G5yh)W~~5% zm1aykdJy54aXY@CUuAKmyLWY@qW5hFoh|?KZaqXJot*6f3$GY#NgmycD+(Ks0bbR$ zlrpn6jHa<DRzuMy8c$Z|EzelCA9aTP-Or0wOD05g0lCcH^6^?zp1${UQ_-Bqs%bf= zWFOYm>$K3N%4|8oPm+FW;Ve14$2{|@b0Bkz_25r|_Q<Qu<d4tf3rn$f?^voc;)1ay zZXOm+Chu@+7l**&b=X3mi_PoLUO!+X{FA^(gk0QPZ71cwCxPDaf2@i6S7gMWkO4ff zpi(gJr}CdufDhoZYcUO7_Kg+aAX(iKk37qz6`IC=&eA1Rw*-_7nTZ8N`D`bLo;)N( zu0bb|W@D2G>1xZ;MJpN9y?Y>tTq6HmuGZ`8(8S)0xfmZ{08IkU#AVgml4SXI4+F7d zvx9&<C?g+(-2bz0o(zipDTRW~9uxT%_OF?fC%wSsIh9rSVfBx(KO#Jbl&pjSSh}V( z6mIzp#}Ao{sV*Z9&=@?Ubp>yCFalw~Y~UJu+VRP8Hc?@N*bIQj4IjLA7%2Q_GH6l* zcjkSifV80Of;GN?vqW4>m4igx`2L;y81w@cEHJ4Rd7$@#fR=mj717W=0sFZdrI!;7 zQKNUHp7fQ8&L2-^SWlLD14QEZ3?c~9`k^D@bv%{(ypkl|u9D%`VhxZ(x~g!fh{dux zSMhPlVu6dhoodtzRL>~ZKJCb>YSr>eBht|K9xvMd2<lw^Iymd(zgfxJa+&7CQvh%t zUc+y{a*r6xEp6)=9Q?uI|IPWGfC8yDu2vmKfzpL_Sb7NzkM8`oEHTW#Gymm}o}h^K z17G170%1}1PjG~jwIxzQf-qIFh88GNUq%_(MkW@AFV3X~X8L8lF4Y8R5e99}T5gy$ z!^K~=Oo>%<IbtwHrxL0-&TE{cCh41krAkdE;roupHF4~e2}HST7MJiayHFP|=D5<3 zKSe%V$bP+PoM4aQBdDi{R%<bcHGZDuvCvM0TmOD%qkknW{A&CGX#aF)fvjz<)Nl4b zT8)OPeJOF?KSFIvmBwATwrFAc?CHI-_>n7XZlQac{l^~_Q^Eb1XZzuGS>Szy3~%GT znekuz^}i!w+*AHRUe#YfQ?LHxn!V8y&Hwpvi1FBUvHi*ZAeYn)4}y40YypanEd)y4 z&^13M9-P%?15ww>^^lek91b?m%6>an1zjf(3TRMCnudBYVnQ?4f(nV5H?XctR0U=) z5;UpS7&xk}RKfJ%W*=44;lv1m<CP2^@fUWep)hBx6d0;{9o1^Fm~98|RHntOmo{Ly z9eS7^SaoY-7MT~(2RRPH?n}(oY~oaU6!n6ci7d+vs4A>$LZT&D>e$xm2xEJn&$QMX zi7Fe)KwFXZ9_Xo@38x;VL0;gZ_|%U__|2X*`bAX%G$?}yg*9}7HTAQ=t9-s`0}Zh( zY?t-6!7l6~MBFKGkCR=bB~o}8o~zdqDL;+p6X2W1Ty3>uCWq=*WAP<8n){BOZ4Xdj z2zj{YX>?z;QubuQV8@?h|2USg6N-0*By+faizIXYf*Iwy*J5P(3UsMb;VCrD&0W{Z zszPndE`M`v#;ve@>jNQPVuE6P<Ryq(>~+@R(K6n+2IJs*!02nkywl@(c;qt9d}mVV zuP*V|<@qg$W1>uNJOSmyC0Nhfa|>JN=cDn#gY~`(9$8HZ;>1J2JV$5Uf{etJiGr+k zYbeafa=!*)Q1g?P=613#Xm4DQl%9d3fN+Q;C?*lS^d3<;C_`A7V#IjYW{APAGD-r3 zx4R7K?UWZMXLlIaS>NOd*!=G2629&1T?Y?#vw7B$DVG7ltD<}ppe`-}DC&^tZ&Zo` zX9EPdl7f)&Aulc0IFD^V{3IYKOPxBChHp5!-{;G##ItrO#Jasplt2mg5K+IM(_OSH zzc>0S0zBVReHF#=ecpR{Cl`zTo4zs?|A)SMBZ&tAYNe<FjPEa4elK~xdvQJQ?JgZd z%1rjJlF1F%q+bkoH`VHvmFrh_ZqRPKmKdY@JmaEpbBw|B6tj*N=Pqw)tzK9p{^rM+ z&bJwP^c`ugTI>CfA(t4>eL)OmCGN?WR8h8Uf6y=PqT2-r4Vw70ax_~$cOA?VM~A83 z6>Vx}y|oIbgx6C?tu0UrbC8=><X9hq#lPR(I@-5w+@6QYf?@Ijrx>-qRswK0yLbf_ zlTX3k_*Bi6gU`hk*D8e3-;?jOCuZ>{ek<y!59&$2qbePwTG!Z3wtQCs$icU><$l0c zNDxr!&XHAk_G>U1o!%Hla9}W8IEA@YWDz_D0%<;)xIEF<A!^Klu}J_F66Tp%q4@KI zpj6yS*BQbRnoC0w1Kp`l0VixM_nG{Y78U(LfnKqs*P>pKOAQpwB^A$;o{etX>q_V6 z(N<qtp7-{)_d(3{#%A|#kqsMg^NT_IkB3=QrO!h9rjV1KAv0g8LkyWMV|O3YJbiG! zVF;5zqhh;n?_5Q-lLswyS)$Cs!?ZZ;A23Uf6c+=s?f%$24k>Wz86x^dPSy|knLS}| z@ym99-dw=!3BkXoCf*;Vp1i^g9|x(_jP6Y}b1;LIeyS~J<R{vfoM<qUIZY7`#jLA~ z8SGJ^SmjsP^gsbJ8NMA!yOL_vD^D#gQi-W5D2l(FBhoBLw$5=HC*{>EhSr%KWyT1m z8^3GVuNW${g?3I90O`Q~BJ_n{FcErS;6vBA2-}OVH#hF=+W2|dcQ>rjJA^&W%?|_U z*KOB5ULjA~JM<L)y6XHdgzBHDtTEueRAUO}e|#Z89S4l-;VI*r^72Z9=zB+6la4Od zM4@+QV%EjA_lHP{DMvl&k(@WZoe|@jHl;Dvg<5KavLC@CL6mXFKpit`hzLWoD)IG2 zLrCFPCLf&CYm<Bn$~V`TEFax61ro+vt{Uv5#y`Yfv5@wAb0@cobi-O$b@T*?WY>z2 zZyXg_JY^_l;TwGo!VRx&5Qa@L;+?7Rssq~t%`r|cj5ebyu*T!x4o4!?2|QL*4o?SY zQ0;TOq2?QM<zzzuOc5B_57I|cO{fMpib+`9I#U2v7ACFsA^CTBwHpoFNp<&OfS%C6 zsb4*2`0}^ai*4`j6utVCezj!l4oxfelFU6j>tUC|r)UKm2UZfxN`|vT9n48at(axm z%+(T5oC+1EnwypC%|mS_<@qq|x|fdjGEaqD9wPG}{EXjfN%L_pR0O9gt$Zc-5WbT} z44dRh<Z_(b?KBUPma|)AInY6Tb6H^)$B+e8UR9E;#dE=+L}v^`ZIeG+FK^`fv!OMc zAhRjOXoK)NWUD_!8HEGT>E$@PG>|eyWTZ7>`wrje;Itp<!Qo2WOPgQ-ig$PsqG{)< z=8IE=V$k_4)}E&9%{H6H!GnGDS{RW>RyULZ+iUPx7*W>6y~@}C>g1_2^<hoOU6+L# zgry0!<C-R;$f?|1c@o6in~d*1$>3QzTl|1{a0<GK6|AS=ck2~nzu<ol%)%0U8f4_T z``F_7tn^x9ymA!;DWMn`J#}<Ut`J%L6G!K(hXqW-s*b&nyAH&BQaaipW8+sVHF%d} z19cb8@QpJ&6J%W13SzB7JrwPOinfcw@7fO&cpZ51I}s813luv4raQGA=>O{>{bytZ zX0}O+ix{CoT#-Xyjt>gF02@|6kp0f3^?fj%w;`@O3#t0D!K2OB<*chCdM<@ZffiNd zP6@DR`L7y!5s;Fm-gtc1&NNpKx?Ia%YPUxyY+^gxCvC6wj}Kq38A#A{*!qdt2TNek zCyv{#SbR2#%@*6nT30VP=+E%OJ`g$hjV0JHR>qD#4KmN_!|{bqvLi8FtOm8}ba7!3 z1RYnSMiXj;qz~-4Czv=iGV4M7Le<Aq9li!o<dV1*P$CWZa|pm_r1%*yL2|h@L}p^; zUJ%L!>-z3bzrcVvjVNd>bU(=;H1CzjCdAd11U-{RoyuP_Pa>SMt{jyZA?(~rHpllu z5p>+2y{Qum@a|67;XV0WL4(bLH5Sc7Pdc*9N;B%%dnYa<yoEy<w=o5;L#|#88r5DB zV%a<R+P1YvSRH@u{M?@QrXI8OzXrBD&Ibj2U*E#7Ivd>xI~YS!><!)t33WO@_x@&c zpe+*Q_$5YI67tk=Zn>hr9!e%g7*KezhvF8$PZmvn9-a~r0``(Hj>5m2haI0RTpf+I z$4p4_vtVX8HZb@%goSr)zHK;@H^JSL;;Q)YSI;#CN6@ad*M0r%m|}|XjA9S&AF*=! zJP}iT3Hwb<F5Z8WLIW;RR4im(kL2J)tExw>(J-PGRAr^!Z3x1EFpIv~Z2rV-MlSYx zs9~&SCqMS~8v}7pb@RlAr2mL&1|sdrD`(bY6>`z>Q*YzzLG9I?zyFQ=<P?0};s<DB z>!w|;+I=g;)kN6<15Iht>g?^UQ9XGg(|GMNGXL{T_tU1^!`b4;hYvgb|8*zy&x)QI zsA1xZh@JgcLYtlg%(sPYiqtAH`Lrug`M-q|M0z39rdI{BKFkj&`w{R(NQPvm8nJ9I z4;KlxjyT(d4_Gee<dtj?yt!k;2yv4E12z*}Wq^#yJ6?44!g*JhXnV^-mK>%K4dp7r z$b-S0`>_kv8BSV+Oar6aMt`ws{`caoAN9x~G|Zdj)B?a&pF*w0o*->ttCx~(X@}}? zp3nhNp~bS}tkwQvwJX*IQ?{pH>t6P4NcqtDiZp8aF*$xztU35<TgtDf&S)v=)yfnb zwjl64@Rdn;XZU^HPq9FK%uo=Gp1uJ<<_C{X0Q*3f{;&8t*KkR|Gn9Umq(0N6O_hx- zChsN~vCSDT6pc$^YYfwc3cT0UB^!fw69m306lUY;`^mt-lp^vt4lUz!h6fT^3!K}F zPB$;WoYU4l^F{oi7-{h_UH4my^ha8xUa{s{7o2+U#T#E_q!!}QT@@x$I9I}HB`Hsc za0?hF9kcjs3qg~nEj??rdqW6qd+A0^tz8!c=#w#ZH?_cmzVh+;8Aa~uQ1w)e{WMlx z=T0ZJCn^^;KUj-04~?=J#>Fe-iIVBnI40Ab_xf+zg=;<EzlQqJ)ru1b9@}c6^fOK_ z4EkGT39=^}0E=NIbp~ucWdkTi?AnPpwhR6A0cgMWMs8po0BFg!h|kwCJmP75I*5#` zvz9@bLdiDdA^MgbMW<y)%z}i*w{E-AabNCECV;P@&kvQPs55t9u@?pUjc@1WH@0qO z#lYJ}q@n9yY@QN6#?~RGotbq!is*FPd<D%t)#co|<*PrNoqe>?{S!2HZ6vt@>ci8N zKqnWCD(r~gSUfvQ20H{H0E_s<M&gKk{?3bJ*DtxH{CD+4uU>!|yuf?9|90)piTx)L z=$?%H78Z<=2TcEc%n9%}WczJ#`{TfdS)Q3}afqip94flE7ZhqXjLhbtBgb~eA86v= zTqk0Jb}ts64~N>YeYkFq4+N2#zD|b2?$T$Vs{Y*wfCT&H<~OqnCXmc>?;5UNv4EpA zIcEk{g-D-z&TM8o?Pnsg(lMFLYDPD!KUyN&Ssdmd`^xs%o=-GazQvO0lJv1A+tQ&s zUC_{#bJ|)LU-kN9Eyp%<BMZ_PnoGir_)0htvSZXS#hG)Kl(V<Y*%22#L(|E>oDjh_ zy5js6@s)*9r5~J6XEXoU&$Dg#g#PZnFiHWk+D$CjxC;$oWAk1E8C_-p|I~3dv+PC5 zmdc8^a5?lr3~0k!==qU2qeL&WYX~e<<Kz=0gc@(HWymha<9m1~#&OY_zoI#H#p;F} zlEvh?6s_g3y0&{D^4i1$Jo%^t7~3D)sd8UW&ab{|axSBwGPLPVk^%Yx+#Oup{nQe% zu3{f9wnagiyOkug_9~@c;?0)Gu#Sae!tI+Zjh!`<-rG*%FUfynph;W|n0;!Hq4vwL z$vo66WDA?eEQ^QBjEdD{dHY0^i-LfwNHqE1Ypot~%c&&(_F~Da^l?^0!heltHtVJl zZEGE{R`OXZF4vr^U-tUi5GETfTu`iSsEzd1v1Uz|LqHp(DhnsMNL}wSv^<j5sjzq> zHI@$pYlK(DRrt`PVt+NESGip&bCjeXE$CI6pBQ5f8A-BIok;5?EaqkB=H$k5onLzk z36xhZqScD_Lcx;1h4i}fwmbYqVL^br+VXmPv-kb0U8B=}_q-oBycf|+w)lTgEC0)D z+Ewx&(em|1`uIO*r+YIn{BOt{S>S7Yc-og#_jFk?YjVbonOT<hVw?zbU-U(Xo$kBx zD5QC7Dh7geY@{(!=hVb627RFq)5x5R>)kY;tRC(vQS-FH1}XcBQ7R9p(PE*jdJwB~ z5<$H#gJ`4ZQB4A<O6dJoT}a5xfejTgo+u>~ON>yTBb-W=GK-3n9NWSrF!<pCqlcC# z!DTvcS~{k?TcF<<jAv1NOk#Knb2+<F9^R}FnzUq{>GzQjxp->>J1M3``xc!m%i_g+ zxf{stRAFKqXY1J}-8^HXp9hwvpJI9?|8?L!kCOJzhj1v`mk|!y@#ml?{v^v7CS?Jk z(;pcqv0sqKR;)0(*wF;71+D^DZu?0grTxvrZHvDIGiqfQ$A<K{&lun1Z?)m4A*}s3 z7YG?SVaQhMT$R(>SJS?&XRdUogA$)j#f178<$e7b4GM+)lpchiKT``f8biZiPN&FV z-k-{xgi~f8`F*HaHPhUU&F9u$=88i80Y!1?E@c|`8l{GwWjltv(zGUPN8#4{?o#gN zqg+;nl%=W>I{rMw;Flz8n_<<&m^k5sL;p=9g#3(MqN7Xy4c9<~5=Nt6v{UrdB74ga zD-DF-hX5H4<-mKK4z_`TeWhQ^jLuN31pnZ4(0EWysx#i4lF6c90m3ic<BtY&jBZcc zv+Jy`Vp42i^bWUSz;2*xYXY4)q8y_;py`T3_tDHeZ2{Er3u)Py62vVD5~eq2zG%F< zsFRzD$10dk=+tphd-7Fc6Q1yzIl=vyLlvy!IsrF&5wSZrb4g3K{J};@)32OS;tSm9 zMuni{4CIGFPAfJZE(yF24jP@5C=2OtPtR@nci@q}S4!wN?bV$8-<0-Rgn!nQW1Mnm z#l$xaWK22JpVRVuf1#&8&w&>GYvv31C59N)c~(cuy8Oj+=hn^-FV|VMI=@q90m+Wb zPhciYHmZM`HOp*wlSruA`Qw(_*PLr>cj%%GuV=R!dNk(#X?iX|@$^R5$K=A?^XSRy z>_SPvh>XqFFw$kRx7DHV;e`QF!hIjY!(A&`T$bgIshcx8&_qW=5n7>33q{evQ%`O8 zT1E*yvC-esAYkrG805vPJl=}u6|(mkfx7Z4n{dYk;y2vXrBd^K<&TUR=?D6;fh@tQ zYNaj&8FbI2dM%xzVc#wcgihApAjRkuErV>rYFb(FCC1Z>=mo^+A2JKyjFde`HN5al z=yBOJ0_hQ;vEeMy->{6|o<F1bT$-fRlJ1+5?zPX{c{CB1uopBC*S7WS^}Fs$!iYTA zdA43SxH<TrHm{#|HlO%C5AXVM2iE~PIfMjTU9Ojd_DA3SU`zDkG)@lbdBPHc($8P~ z%}iM-j3+1aHF%VRr1N7Ntlwt0c#Dq7x;)GxQ703HrU8)BrrN4xE=36T^~cbdNp#Ce zeSgo6QpYTl2mnV6n9-%g`i(kGenPet(Ydf$=`_(RtHyZRWhch7LaopkQZ;3((|f^I zh2QgI$fC6-@K~fbKAdt;N(2h>3&ls_stDu%upCxbU!s4-9yzvn?;}|WwTg7f-!u~B zh_~|N(xY}?CU+K<cd4X&)s{4_I@Vtx-e@bmTmEv4{P~yM(NRj^kUEe==Bvc2r<a!c z23{awulXE$0&(aPHvqWf3PRrS`&!?6+)TVk6HNNI=k9;cs1BI?=a@W7j|lxAi}YTC zVE>ZO&$(MCfbfF8`A~@ZqPg|!-;|4$!9A}n1qL&zJGR#nCti|lS@<;dn{`<+f2=2w zO+~|?5{ypvhh-S!W*^>j#wFbu8#(^khVKup2KOF~f*UHi>wQ`vv{m@=1{54anMMyY zq-q6N(S1FE6PkvstkzY}=*ArpuraABidF1(2Rii%;$ZJ9I@_wP!sQl5<&is@`Afph z8X_*OZkS*gm^7JzVMQ&CRjLjx5R+yw2h#jBKqxKrR*=?N?C1NB+>DqLdxe~8Wg|q| zpEc74-}T=%O!<Fto=_hgMt?+kp_&NZi}I}isDbT%kh<H$6{J${Ja+SEWRxITK<-m& zAOlv$7YxEsO_~d$8j;&7B6nEg<OK36d=d-}r*d|}J4d9^X619X++p=M&g~6yh^_(B zFZ2f~9OrgPw@GAG^j)bikNs+#j!77G@ri;Zp&J6ka(t%hiy3YDvJ8`-HLsbXv|r37 zJRCLSsO{wPb}_I#4#R)y7B2}o%{VANhBh+FqJ6aITyZPKYh}@khB<#x&<*$odFK}j zv81T4H~aK~xvs`Kgb_m0IEktS5PZ7<jmFSau{mR8j=bDA95(bdGr;Q7mIW!H6&=sA zb445b1p!Bw<lZQeUQ(mkliVR;uW=a6%T@<LX2MupT&DmLgw@L8d(X6>zZHTBr=bt8 z`^l7$o3}ChKUsjbQrO-gQ7>!Ju5AcfFZ0bt<9F))pod;8Zu6ZFJtdC%JvTSsU>U#& zNOpGaWl@8Rv*;#vEarH<)_zbjVCQS^5I1|%yaKIipHEF3y;*05k;B(k=tER%2SVEK zL236?h7Wm{EfHegOaKOiWgw)q_(j3R4Vvhs_H*3L?<<b~ap8#x<iDl;-oX8bn#&KO zD1ZZF6ab4l+~W{<E7yPP-+te({VYEMF*d%!zI!l@iy1+VcKiA8^qSMXtA$)k2F?`D z_x#A!`~A7w^IUgLNK7#C!r9Bs*5xU*nvE|3J;}9u2>iw~luG3;9NJhU%5-y&hw8~O zhGYo{{82}MXDfS58nk{#IZhpI{f>yE@zAd3ksS$9RRHzl=t_dn6rofD6vbzGAmX6+ z*Ycb(dFa#l^{bI?33O4X1)GZDz&2Fm+IM;M7ISMCUG2kLexNM!E%&SsG`H+Q0{PTn z!$c?|F(FQU7t#P5KE3=QA(L+LE*%P<yH^$9%qql(6hMdy^7h2Y183>E2s`W9DbkEj ztX-5Dz!V+yBOmqcN++j!v6=p1QZFzl={_;((wR?YF;?qI`&`cP&?V0GZTn#a*hRfF z1n?SP7kFOD%I$i~6-R_&)HUqZ>%OT5@bh;#xJIg{n`(zYX$Qy8G+Cd5v}W(tc`w%> z#inm^UvrH0R0db!%gkaa%R_ouKrfAzI@|H<Nbk*Js<~utg068txC^rR((CBt5vI%v z<wKN9PHUr$X%s;5bt-uLbX4d%>5kN572Pw?ZmK7k&jaai-jcvDkvrgY`Od{9qGI3P zvYi1Ek|UY`-B@sIKs3gF*X@6p-x5LZZMdN1heHl7<m!?5BnUy*a+=fEHbTeV4kp5q z{fj>i^y>(kO!nBx=*CE-V6h<23&lTU*vp$67s;Xk@uWL?2u^@R3$JVYfxFxF<H(%_ zCnrWZ#g%(=(5POkmdNvl#73U~#iaEdP#&N=`u~yo6evgrd~<KWP@<y!4>MESUzC4h z{o{cWX0qAu>Pe<%g`MW-^za=Pjtu);vRznbb_3^nYk1?dL2r0577eCI8$YMB+J3H$ z<k#`Df(QbcH)Zqe@-kvkR*g}DNVdVV0#RRJ0lW#@&~a7$D5$DTfn@-8SmPgeyY$a$ zRI-Y2AO6(}mkyU9;{-e+w)#UyX68=9B=0^El`~xlQnN0?4m6e7eiP}zsicPD84?&# zy#m#!uIkQ=%bgTW)Uj%|+eoqo#n?GI58)^$h*`H9W}rGbp7P3L{6%_r9i0jpaKAo_ zzY_>0bFuA_rA8EBJb-UN_v4RE-4WUB8a2Z&8PC*ocI6S;sh4Xp*9M+FF5Q#`b{^!W zijQ+AJMA01W+$Fk3<NsQ>B_$+)R;0|@rCWQgLd*H#R{8Tv9co*?Op^dYU*L>?dy+j z#dB_SyiN;N4wK~jj*IHF3j~Wsrp3@9wiUv3^YgBi-NRZw`$!MVSO%rcK_#@=zDrk{ zRmy#y!~9`}>X;FhO>v<PYEd|ELj-VTP2J|EF&_E+$e~#vlyLP)88J!o`SA`2v=g91 zhv1mkscTY^9H0&p?~|5ZyGU-cq!&L)K5Cc9=&R)B$c>EN&203fw12X#gfL+48(}eC zS~i#U_7xed0OCzNT2?cHUcD3vF3Xis{MSpVo<;4btiA0SW3PcmmSIK+!H-KBaS^uD zTHpZLRW!xWinI=Wo`kjV8jJ}v-kZ<(C+w%CKAau)%!{}%6%yI}ATTUu$n1s7EqhVf z)Tk6Oxz$t-BZk+x*_C*CmqmTkdkPYGbCUPo4%@m-AZn5q`TidW<A3=#x*GnI19|Q) z*#r#a4eSNHjivd$ZNG1QeRKj^Bm_-Ft%Nx0oO4=Qp>j5buKy6ru8n{o!0tWOs2=}O zW5FiRac$^aJTq%FG<atqDOrmewc0$pueo5>$I=Sw45hZFxv*l>-pPXP&5)K_mkNR? zJ7)GI++jah_fDg$gL`hJCjKTe21FNx+9p>41XAhJ>^ZR+ijIJY>b^FI$qwwT<qWSh z7(8mG>$Kr_k`4Lq!;G10l1t*U$Ww);K(ugOl^*zJR8QXpC9r=HZqdUYgkCU!Ibf*- zC%spqy2)+kLWC5=wg=PBu5i^aCTr$aKCRaxP{iD}(<VXPUlPu#T8uJy+2h=;_bU_R z$u_D338K)pYA-V5dmw7j+RpVqC>0Ab;ny&_FlMu1RIh%#y5f7%|L6s_*`4i#gb{Xo zeg)b0I6jdfIWs;m+==OV?PiryK})<<`WRA^rC+zg{QT?dF+ODwW+dMHsxWwDaq$Y| z0!@n$SAFUwBJ~c{jk(w>2}J)4;YduPP>-8>xyV&IkIKt-;zbgOfa_YT@Gg@x(Ple7 zHP@+{912$-WQJ{Aj?j!F#+el(T6O6z=nta;TKX#P4a#B=W;CT*D*+emJWv@v7n&zw zsH1;uw_+wlKTcIm=LFPg+yP=M&O^+)0R`7(d(SE>mKDWh#)P$Mqwlphc;n*0O|2R0 z^I6mSJkH0TonqKaIXno1jY$12U#1xke|dRv9v<wo5@9g}er_(j7<swr=N^!wU!9vh zo)5sEjuZHNehFOO9r?eTg#3vW{(0v*3jfc0b_0rFiGIAVxZgu<+}C}Ea|oAx_Z?wY zzvrImQxlxP7d8%=y#!<r1H5rh{|_!bd|mNq=4MHFvzFC6Q>9PgjhicX3h<*6n>9nW z>t!|b>E}?-UxDL>teLRvrCTczirmHzeFiJI?bK$C(P4!sMb2u^EQad1lvwphY7jPI z*fBz6Z8Am(7!9b4lLRX8DnIQ=t6F-Em~j^VI{ywLkykVOt#5r5SLN|*IGW?M=M)ld zF()R6q$R|F3w|1&huVgwGN|5#<42Wh&~mA1)1OWNRCx!P1-(j_hAmi~Ep)yELdVSP zyPn*;bh&>!LJcF;rzqmx2g_TUWv@!!y&7508x|2Ih_MhldZoK4dWwtiNW=cxl@0Mu z%>i76(p>0zqsNWd<QgIBZ#+RKk@m2PEQKGDPHYGDn~~z;X)nH%ncDRmWzv&7gF+EG z0*oHP8!=`MP@V6IVivLLF8&!B#R@2f$KG{3BSZKBvN4?Z%f$W{q}X0eyjib!-)@2s z!c#uDXj-~9zg4;I9qW3p3-I}ZxXL<}abYj9nSM(j%3eGX_)#`t>B48nq$LxNP(qZ; zrBo+ULfp6HP|a=5+rGRf10u#H59rJ?Cow~;Gl)T?yuI5@r!@pQPk(G?ckoxvq0qQ? z)Y>65y&y?s^2PQLnb-43z*-8ccX|#?a4uvh+gdVm^9V)|+<CgHP)70T9EbHS2QINS zqOX)0w~}<Ams@$bY{|NjmbNNJ4fr5&-0L!1Vi#tY7tf$R?nyt8=?#Zk&0eO&&O*o* zMG;w^hy~)6#5G*l6eU*vUWR0nvc~ImPQr(wvKT?u;;=o_b)F$^KizloKlc;8y~I6* zN?84OC6X5JAEL4$F7GEJOjj3-%yHw_hw|4>hTknRvK-RdtD;8^<-{o@DE9Zj+dJB5 z7XRDz&bFME_4Aj=w&G3po?FFBHS<bwnH@Rn&8z!sK=AH<iWNPU<<p*=Jr5q7t~{3Z z)1~V@8Fz6mK^(B$MZowx0G6kj5h{lb6-$|UJP^DJ2QWcO32C$od{ze9hRiOH4y#6S z%v+(yGO8+LlHet94coxeB0K;VqTPI3f9_6@&~S@*2k-ztPO(huLcUY`9^;5j2({0> zFwUx@xPgK^K*c>ho7K0Md;;kyv~RHs&ce@>=087jPHx>{sHm(EQZYlJm@q*u3|}+? zT3x!7wy%^jx7kBkcfga9ZP}#1f7o-V>aVDB2qAB&p2J^WZk-Kw?^e0(?);u#^VqTf zI+@;J`x;uTBx<`3;JCcl7-Z_9+a4c$AH?bjr~(k@&MM9vN3z!MUCx=%S;S-fW#kN~ zHX{V5eTW<Nt=lPqcU7c5Pt{d}$oE3MInQK#lw4W9v8IDpeWb-;^G(st@r((9I`bT% z*@mHw9jTy02B?NwYZi`JabvMJ@7|8Z1X~mx|1gy~oA3N)>J#_>@b#8Kb#==YDDF;R z;}+aD1b2eF69~3}5Zv7@xNC5Chv2$_;1=B7Ex5ym$9L|%ukJbZ?)x>XR;@p)s@Is^ zqeu53%1h3<yWQ_4khC1un*@7N2a1`@+S!XcD?a8uaC@ia)7ICFhr}3Zrxc#NdyXz| zh<4r0ig_AD#P<TBzHTk(E~w$HqX#%&Jfd5+7UqZyf!cjV!Oslqb9FG#4-XF?61=<w za-Yda$YKX}>g(BGnYDK$DTo4^yKZe_h3*!K*Dnx${YO~+o5DP>+eY#o3!Cwj*#8?a zFL0=8vvU-?9_?x%qi?1!Rewxv-P8ObHuG-<2_jgHsEgkT$4u-gb*&69Ygz`l`=u5u z;@#k^31@;v#>>DepH{&ul8`D2T;or)^F-fVY&CKS-RO3IeGBtr)Xrj;u0$JksG!C< z(b~$Gmrng?sRh^*gPIsg43dbciZX=Vp*(2j^Zf%K8Y&DgpgMAI<vf}{M_OsiMQhdm z)gi>)hfy;rM!(T~U57a88!eK4bVVD(CM`R!RidTf0CM+TKJ6gVq&W3c#v+*F-WX63 zK@lQ%x_#Cc?x$LoL4R3O45u!(i8s&5e!K9VRNst7u^9B5%v{{`R_m@=f1F4rt*wbQ z7)Q@_kWf^DUr2FNMg~QW8`t`|rCV^uZ6kGdab5Ojp?7Dub4mSzciXd1Z!w>QX4&rF z&|qhE6ZjqJ(MoExamPE}gCeEHpY%DrqrMLJqx+}D!AX2`V`^G;hcBZ2U$Of1k=tB7 zEll!#UCaWD1L*=`!)&+@M>VL})LE%Jf8a#b_c8?DXliGls7|0fj*|9PwKYoxKTjld zAk8-fR$JP=xREoYQ(y6pI<)r;3a?QbkrYJ5PF$=Eq%W)jk5vZj(x<q&AMW72GE3Z) zaow8LuZBM<97;0D{K8rR8JF4JS&6|J&K?-m6el^kr<P`E{G|%x!{0Q}*=U&-IAWoz zXz1tjZ9b6h48kGZI_-wpdB*<(R_eTXtG~~#Ycg3#TdYpB>$(q)IlbYp9WPENT^gqj z@A(@)JBu_B_DwgHkRXJU`@6P3z32rHHe^fW)d)7w#$AwT7@zBtl+up?Bg?|6C~9>L z(+@PN0eMSXMPBEvbc0vT_vOoG3rd;?U5hmfJs!8^^9Gj{{4Qr@%b+T+#K>XuMH~)q z^&e1r8LTO(XqB`#^U8h63qia%E)8#4WwhNK4i*$4gXOljw%d^&tTEEtIPPG}D>i(~ z`C7qlWYWsqTo3tKHzMHMVl1S}?~N|o{qYBUx5p1`LpTCxDgXaEHvdL-ySzz0xFY;; zGJ_)s;KDv^Sbp0~Ru+0b^zu7<dyodbX4G`IebI$TD0dG?xNSCY3lXsnM9#m4nCESs zJBDv$DXOUS%qJ~SOh3Zdy=2@E4s-iTjV?HH;_EK)bJL}G4R=0297S49W{uw&%V?o$ z{5Cief90^%_yDviWuZc5+DL#@yn^cdWR(CjPK-bZeKB?`Coq1d$jkB$wTqRI@#$<N z;t376q&Zv(Y@E+A<_SOgWq<-o+2TVwSK?D7PS0(>q?2qt4zgPINO9N05v$*0g({KQ z7>)1v&JhU8m3seUyi$J$qP>J21^GP}N%(|X)bj|6qW>j@(&0j1e_iT)Uk9zFi>h5X zO?3q4RJgYHj_6J3?UWjt>q_*KJwuIK*yaBG*8J~-^T%~9;ftw#<BMVC7q4*yGJMw) z5XATX_WWgB_8zMY>z3zFIL41t|5+3LsCi4S4C13%Rg*XV-*Td%JvP5z^@~i3i95%4 z_24*}3qpQ*iqN+<j0x`N1y*4s>gVhKojm<b`ls4IuBc7Q`S-6RjjuwK$m2%|+Wq#Y z@~(idV#95l`a?PxqtXaJeLd&PxzxX8N2ln2W@b-q{hb~09W7Q{(uLH$9O-XL#OX#{ zE8R4I{;_R^IqS8te;9%lXL^H<JC(#8)g90V4WVV1d9wfhu$0Lm$!CY|-T5~N=zwhX zw8q04BUMmPfa?r3Kzj@AyU<S7V!zeP@kdZy(4t12`{WZ$6x7FVB)0$mqkDxsV9(n5 z_WEsY>m0J`ZC@t3TEzF{SuCt6r~X*wqK?SJQOT#0r#d4-Vw`vu8J9`Tk5!eLU2qCY zB$G`NX%jCx@}qrT7%g%Ru5Gk+>K_g&r7hg#FL|0zFq;r}TVIzt1$|I<>%ZDt$$~Ip z;w=|=d~cAveOv;!`o74NekvCV#sC|a-ZqJanwO<CCLoi~PVx4vOio)?!Q~sl{3ub- zp$*}A=nP_+XR7nFD98Cp!Mvt(2fWBlbmjhmwo=mH8{8B@2T6`kOGIDO8f-Ig=+uhq z4)_ZW)TF`lIml5$o6s`rLykX*TSU3e=cXOsI+@P4FLAE^L%qi+FrXz$&!nD`aQ_uV zw`7sn+zZ+eyq#bit~PNO3R5uS4;cFV-4nA+@{=f%#4NeobVH0<jjsA&1(a5r(yIkZ zna2+?^W#J&EwLsY1JTMBP{&l2TvhH_aig?}w3}wu&kPUatUw*H`gPuCEm~1Jn!_Hz zPm|4T=u38PrXUz<bk&8;Z}64+3Zt5}=7>Yl6C&C;&j5KW&pK*Srdc&eD|PTlJqpzZ z>5T%EkvrP7-LJ@fDRqUX{@D%ur)!j<C$E``zsuGM4cs%>{7}vP=IU2Y@tgS^<XL#3 zW_{Q{Q56;>F%go)aQ#D#`992uv-eUP$(Wa4XkYmPjl}R12Af%aMvw^UhD92_<x^ti z71@W-@wXizqVRth7dXNt_kH~KwmB$rRUk5NK5XWF5&7@16!Y0%0BVE1Jpt7S&Xyep z^i)yvdY2;d27X-z#+q`lc}*d{%L^|8dRkyG399@7vYlOXwzh7Te?!c<Y527D;q0s{ z%w)GiZ3@=hFR~lv3?_Cp1MWVT)X{`aLbrsNS#lj`d0{ReY2!NMa<*yK=u!FY;%<HU zWUYCxpRns_S;vGNxQzVeP)+cQVI<F?Y~LEq!7}XEsbD)&Y>}O7+U{TY5lCWo`por* zxv#~zEpu>&T>R%U#Z_Y^@J*}+Ls<`<&Q;z>1`XaVfWvmeQLV;D$?NrolI54|(gU|L zRXx|ZU{(ooEoe39`8iW{v>58bL*!MG$N>d!*ac=Ns(HF?30ETokUVn+Of)g@Zv@Xz z<CbLRcq%gMCd%n5le&8S72nfUSRnXjjOlMdjSz%+`9-+3(<PU^b&n}G7UX>`unECH z6k;Nb+@)RWdX&e+1N!5U%pO05ROuFNG0IG%J+Q7{A#XsH_fB0?BZOvmlVL9*AhMB6 zC}OnLDay_^<sLqjS+{>mmOSyo<!^r($>!S*QBM%#D^cin#YMuy0Sp(EtU!b}JS=Fu z6f&fybkIFxIY2MRpJYc}>ZA4(1)7uefUfx2qJ=o9bZh(}4%6q1xPy}l!x^<o{fMI@ z{KA$1R;CNd#H7_^);g!_SV?ZEyPD~^jBn1-e?W$hV&rg!wSGX5P%qwtYehI41=R18 z<O=CcNOtB8We*2n5|?1>+;0IEQ|Mvy8rU&uy^jAU)?U>Z`TqtdH#C@4=!cl4WId#R zz2wFS^ZWc|eR#q5_5$<u*;zPQxoJRNxr^sud&b*GMj@}Y3=fH66gf!6->Zfw>F725 zi~S4*=I&}obS12ju=p>cNfOEYmnjILxQvI4n*sNZT<XT6!yJ`~7(uX<zKDjp2d$2B zmC38meU=RS^gLGr?9u?9SWz1CfKX7x98dJl%c43zj{}F(_yX6@1#Lsup+}j}%Qol7 zOPHMk4aH=fTtYq>y&$%!A-tb*jHbqq$m9zl`S;aU6nWE}m0_m3f&Qa`i|NY}-->Y? zvzf1c?k$GP$g<Smfeqg<`VfZeK+a%L!KIy5*jI_Z+kT&KRJ2C2PHDANbe4O4Y>8># ztF;(t3kx7gBuEH9*%(wY;3}Nq=yg{_zD|?g9UH({h;}?xBb{WL!nINk3;rg?>rYv_ z4R_J89zS%XGP-f`QJbSw%5dTwoHOjVcA3)w@8XtEv-Zm!Y~7lsSyAgX7q<!!#TvtY zhccjHN>$H6zS@y$&TK(3NiEx(l2t6Q`5Nq<u&NPb!T*c|<K5M%=@mS*nsm~lBZH%G zH~dAT%ySK=SI%paDX40mn(C5~5gkjx`AboW99D6hxQt(=*>#G>z*98k+;MaAkU<x9 zh`i++s#Pb<yV&{NDHJg76%N%A{*qvAz$ytF((Y8pB5)YS;n6AT|GsN)+1iPEfk(1} zy&cryVW9UJxM4zNra6~V-`>BsZ>(oE&yH*5v@A)!iO!zj$940B*qHd-m*MsYI6m94 zQT%iVcitRH*sESAs-9Dq>Ly8?9n;?dECX|R|Jfb|%=}QDg%b+tS7nSzHYvU6X8h~) zf|17|U`ow%zf$vZAOe||_I(Jy2P^PiCHy<~VTk)9ce^cO>^Twy=tgxrb3>9hUN-z7 zvA);xeve$Lzq4359~Dy?JqMr%II1oTE31^8O4L`Db0Z@f|Dsc8vG#nknINuuTKZwq z4vSnZ(R{XyC;ym%x2pM~p}3NOx!Pp~$dH&<q$Nbu9_iPp^E>c_7mJ$<Gpl&$bc!<= z=J3@&!0}iMH2-ZWnc!HL4|>{mr~OkiR|-czzuHl*Gz;3Dgyzw{^wlibY~6+A_W;EV zzc+Q)xE&$Gyo3y5y0qzG=m1ChV_(t=Z{_aJRScrYzxl8(b;!R=Ag<lYI2&@|bp~sr z_4O-Ku-ul=W1xJrPnWEr?XE-EapN4s9e`sUIxoJuf6Hl1aH!(8Wl1Tx*_=XbI_CrX z+>H&S{rGOPv)OfEYUlm8>_GVP5Er=aau1Iiv|>iuvC+K#fYJ8q8e8pNZ`nLGw0Qr? z_V@0y3TW=<lcvsV!UmkX6#$;Rt0gVkNX4{$0{!FB=q&J>WlsF7)DA*b=9Ac&V(XwT zXWO7zKxjGehA^ga>|18|OVm)Uu#_`Y=CGiq%!>cw`8)+En~M1AsG`eV`{A4Jd{cs? zz2<lL$fjr}Yq})2rX8kJ*1dX-KOrKnhL2f2Kllv!8`?e$R_GB9I8takDSuC&6j*aG z)~ULyv>dANDZj0Bj&o-y8MY27)BxWnErQwd^AZz#ocVRfQncrZ-KWKD(pab74G;<L zo*p6+M2#EP%>|!N>;D<9ejf~UXxrW4y{7-afiKD*08I<!Wn@J8U+;AP_3yrD1d>3u z{<wi3mOdzh2SzjRloQ`9WN|O^a)b9viwfq(@Z7s?&}YC$(Y4*^=#G1y6yj>vjW7K& zF2}$mF60>+wQA~tDh4eU30mrc$<mWh%id{$UA*#_lOi`U@xF;T<t*gPmFCBrR2^hZ zKu!OR(Sb@7pk!#dseiQ=Pc_UehIt!B6NMVn0P35IBxVz%L!(kZPA)mW7>Ps?h4`Fq z>Vhb81>MfmMQFJ_=7NhRJ9<Q^l18wHT=nl{>Oa$54y9nWgk^kacSb@fmc$bQJeFMa zPqj3Nw{8JPN)k^rcjs*J^%<PxslT`_4Ed)<;QJ$3$gj^E90jJe7j*nUEzbp(L$%qD zMY!|)b27OT!~|2a*Zh4b8e2hENMncT>4#J5`6qGZu0H5|q0^B=;%T}xDbz(F@~VL` z_Z(+jLGm@LH!9_u_}OU>$L!y$%_2^g)6&1VRO1pu7ksYHD6gvIY)~d0O-{Ak{UYqO z5n7U5>vrxQY)hLoz{unb#f{T6-}tF&Qq8G+JmOR6PdE30fQmm=rV&^pOPyDWnr6{~ z<7i1NNSzc=@{OyweW}J#H2eJVh?UK1tr(8LeFnSYuS|wtzZw{N#c+4QIQ=w2CG8ld zQ?pg->-x2(>_+4>hO(|8g&A=k2;0HMS1j~n@9e6jNd-P;^4SgU?mUEm$4s0p;NFVv z`S;nWWdyg}6*7^})ZcKTE(LZ<PwMG_)SZeul`*A0LsqF&k*KoXzSpdX9d;>dXaca6 z3e^V(ES0LI7nUV$S-pqX6p@=|k=qev@3yjit?U0t=#(V?0kz}oy|#aWTFTpT1^71k z&)f9D>yfkYPeDUxD1>LN*~3pf<{Gz3^^GeQXSPGOJu6kt;Rwy>_WmU^)Ha+%?O9SE zEi%_^vzNFT#AVwlA<RG9?`?)77p{2Rzab=4ysQbqth{fL`TkM&QJ2rlNZrwg232c1 zgtD;|EU_^jx_=Ra`Y@D8t%D)niUCu9rLKJ79;Wp%uex`d1!rbtW!PLEjYga|E$}Qu z|MiR96$*xLX@M@V^MW3DJ5&wF<UX>XH)g*^Vpod3M<t{x@^G13la`8RLcY1L=j}w< zB$Ypp_f0R4m(DUn%taAjUhoWc#2%C=Z2uRcTeVzTmuXGY*zmIf|HxEr<%oHC=f^YX zB|i48@4n+4*X&P6#g`c^wW~^7@LT(!*3|j^bpJvR^v|U|YVI{z95jP0m#t6wo4!%= zWrI4e)&3M`AJe~9hbofkL(UC^8?xXN8t14uyK6%YZ)%b2TCe{{3lL5|mCSiKt;l;= zE_OrGmYG7xGu#-+rw5D5&a|lBEd4<VN;)tWM9fK#p$%_ZxypruL?t1MXWnJif?jO* ztlh8maj8~>3Cu}g$%VBx`ne`p<9cUoSqm?)MsX(Ev_dq3{H80jgBIhN=LZb6f$`fm zoYhrk$$QKmSX3Dx*55z0&<!SIzwEpbl0CC$xOzd3ocRgRE;TV6J66jqo>rayyk~IY z0M^yw*u)E?flvQKPW(4V@xP8U61Y?-?}JnM>Y#t_%m4wTfT*YEy+6gMT%lR1jLs#? zdX`jBic5$v`zSWXviqJhdOcXS-%?+1>EV0-qE&5rPG&PTyaYGOzRs@6v2TcOxR*;n zf<NvkCCk${J_LnaZ+7}FAO~tACrSW?Xf4lziuP?o!m`LhCBHcuw8$Q~0~IN7`Z+Yv z@C$~@6$Htm&^{I{Bs7J8rk0@YG}Q0E`Z)1XJjuW!U_Kj-l=`PmUg<-;k#==P6gNw( zifh47u^E%R;~@%GB{A*vN_{|t!uIHN6cX28I?&f8ENB7&XL@e^cU4FLdj#IB7^k5m zjxB4k3)dyR-3w}9eDSMTjEk{jnGY?f0qv&)DWZ2+<=*QD3_&`vE3x}k<t=uRzg~hh znhG+l%rubi07oc3$9C5CM!8BuqVK_Q=yU!URhSDcT^4HPgc|gtX^UQ;uTS{>^=?Sg zv<)oBBGr!AbF1{;s>Me$im;+I2Wq+4ulXtSCMFf51XG&~vJ@zxQg}E$VmwCU7xtNC zqI(rFZFAMad7$ep)hI+NZbcCdeHui`M+)s!{f0H?AG8YMWUqxnq<}XJ@P)gQHrwas z3Y-J-wuI(2-eNJ)nNVmL_TsAE!-aXvcgDCRhA%>~lzjnkb`5WmOonLKvII}56CLqG z``zXJO8amq(Xzz|io1>!uE(9Q4pBTv-S?5r7)k~!`q`Z7OH@dtKXeY~IEak++4tGL zwX!^=&Y)pjxbn+j^xxzwpu@cbOxu(GV|0ei-Coevl%~U{4+UMBd{K4=3V7KueRC2d zRPfGFYFXt|5ua%@-oj)vZi_OJS3Pb^{GN(peXlN4TJ~yS!a)C<`&d0fVuOBA+W4(U z{?Wby`{AwYsU7q@TJyI3_8bWr=B$z>x=_2rNdms`EAz9+!mh8FTW=eE{rhNwOjK(w z7fj^KPbcexS+G*oes7YZd)Q2TEg6_IzWKrJOr+c8*h6QK>rjf{P9bD-b-R<vlL8{g z;(;xCx7iPWM)eHvHgtxac<4@Vlz&<*M7>cF1%TwZ7UH$A4Of&*38*k<5mQ;YMCo;3 z^WE6_U&H_l?G6mym8>dQJAji1N#Czs@q`V9%c2U;grjbJQhy{Y=F%ew=P#3LS_v>E zn<+gx*x{+=>t^CyY-9TOvSlt)_4OQhu{iYHb0Wd!^OyjOX`Pr^*kOEPSsT9!pL3^o zCyt80=iZM(%0A|AFP&L`JMW~-zMZT>?uC`!jTA;dgT1_+Z?|=8(t?I{s=9l*%D`>- zE-jVS%+>Rb=$w@|IJ?Z8O2f}Zo58xDZBe){zPrU}$fjp~J*$BVAyu%^3On3%kP|12 z_O1eGfI_&>+*h9QR@zv~nkV$MzsE|GeqgU?LyhuQ9(~sD5q-$Gf76-_acr(cwd5}_ z^x7!@zB~nSz2c^g?)w#3ldy$`_|g2LyL{VXZ%|NXdlvLnimfy{q@9$Hh^F~Vf6QSE z#<!<mOLjfIr}q_$VE3&hqC#pnoF=+@hF1Z;BXJMjY!t3GZDxjwbwf6y=-Aly`lZb3 zt#@M*<zrySL$5fdi1QZqKE%@v8<p_?<y-$3mi>!_ZIS&af@q<~jsBaHEvKx_e>LWZ zDz2M}+&}zQMt34!%~Peyhbn?8C0=OVMulu^r;W0Vw^le^P>o2M4|BVaFP%OM;w@I8 zMV^@leNS5`vhJvq*V2}Ab5<0aVCbl-NnnVEVOe3Tp`|Wys4;_KaZ||_6$~<)MZ(%0 zB-#=p8{6$|^s3-clot|zoaOJCj(CuIkq)71uL)B$szAA2AfFYY&15Sw7r<u<I5OA? zVG#9A?5^5UrxtZkR)k1;zO!^U1@lE-ickIg-({lx5D^gFBQVfC7C?u)v!J*HB7%{9 z0o7*^bNCtReWHX?;q)npFH)}aMvk=w`b~?Mf=bn>$}U~&-o*F&hs?zG<Cx5`>Tui> z_j>s6;hIqxjopa77z7*D1QR=jl~}Q|s?HHO+e<K5V6m^|XJ*vy&dFaIi^Z6^xc1jZ zZF_CCXC|YKW7^g$bE|t9*%un)BNpNY*mu)CBZIq+=u%r@Q;3CjHzfWLM+TY1*pd8| zuF<Yroout@_=1<oHEW9Deh6z#*%P1>$8^pq!Sn&fZ*vBP0YG%u)^Fy*c>W+U6)HDq zMGsSp^G!DALrdedKgspCBlNRs@3MNq-M<nzJ~X$0jN=kSRX>4n6Bt}gg6N3SC7_@` zB$6i`Sse5!bWrxAVn+D8u@Sx}_Lc|1r#o9uN7IXe?87sbnES*t{q2#oJtLO!Vj7-e zSOuN+a@lD+d4-JnrC(rC%mTQE_3YGq%t?hz=kH+9RPt9tl*=iF8`cPT9YiAxHqNOB zH!2Ki0>Dmd=3($GHo;8vr5M*@U!mogJA&%t7AE*+OY7~7=?%O2Mf33AXt#iOc0>Wn zcktAbH3_?A4(a6|!tKQGqUN<9Ak6c%c(gFSlx{trj_v1dw5gL{eOGhv$xzD;CWd|0 zQYrH4$BI0c+R}yT!gYS|$9Cv*yM+`dMH3xv-6Q>jOD}*(JrCZq+qdQ4ILvxqtG!bf zJ{0QJ2G4Q5%Ln%MU~d;$WTB+m4aMLyoP7k_<*Hd13_E{-=48}_eYA1HrzTP|Wg=>* zo{Ss9*L#mh0+xphg>tqLTX&zfg|LwarV89C64Fvhkw1I{Ik69NbXMmw$BWuf{`6tj zV)6UV^bY=HWn^Ic$s|%A-A$+he{?~5g(3XtO{fKx5(4Hv5T~WMGeBwj-PFUT<VY$# zdx_L;y&e2~gZV1p_cpeD^)XiXe)G4odbC~5_clF)wwtHRtvz4N1x^%Z-b4s0PEB() zl2tYTx!am4ICw><AKfnDC!2k<jAdD#W>Ht83Y>^=>z}w}5ZUKBGZiG#vI#R{BR?HO zjr{O(&mSth$Z%W>7e;)^2bJDHgf)Ti4@MVQ&O+4@%*wH&dPz*CY2S^17Yusztyv<u zO6GVF&XI(mP&D&L{T&0_iA{{fs_!#Q+`2FUsVNH7r(BOb49XAcMPwJ;d|Q?$1k<S_ zNY_WgtydybbeL1FGORw0cfImw#n3_}>ZG%7xSyan53y)>X_qaW<U#}SubH%Br3z&I z!m@8wlE|iR+^nol-WMXa9%Q$-ZUFyc8~oq=zx^n-A<PBK27KoKGzcg+^Ik36BC{uz z6Q7Ml#dWHA!awAqHx|3~Ys{17hClN;V455jys|okuDgF#kc@nikBE#KrfAkPEntej zMnQS}eyL}~urkSYxsO#Tvxa~wndfD)j<sy$J$tg+b`OXk8(Sh#IdR31@~04KI_$es zArfQg;{e{uel9QlEWLrkHHG@cj9&5`&*UncuwWGXUxr$D;QK1SiN<(HFwr@bLVD23 z?rbRcjoyB)?dtR326f>d10ybe`AvDn9sj<e%k&e4l9C23=aphJ%^tbYbJqrj%Y5N6 z)POcJ4HOto?Ui5#DOkch1KwG+@aHj!i3BDTv2EitrlQFlDN0ZJ$`h;!#`Um!a`3`W zG@q%;jO*p6@3QNKoKYQ2lFag6HY7?`qD$N6&C|34`FH8jU*vWDv>9plL|)1XwMOZ$ zX+%c5VkMG;SVZZoX`CUI6>&6-Z%XA)y+@NTF|)T{^M<pI<~3@2hx4d@QHnE-$}C@$ z>8qJ%iJEGjc3HJXxJzNg>x`l4bCKX&pz*PE?oHB5_VBCvG33CUFJw?z&fh(JFuFIC zl@>hurjPAk77U~@j1fo8py=I3pQ$XXQPTMPF3Ft2C9tdY8y1oQo1?CN%^i(-A&wZ! zgIWg)p3?7e7%nLt{)n|ZCY?gebJM!f9d=&M*v`0F-`(bOXaTlmL<*Z?i$lX1ng_y0 zeeJBWuv5;=-2fJ&FN7F-QsGO(tl{s|8S}@H`d^R~Ix}0s@)5R(eCX6r!jbw0QeX)| z=Bz2qkF{GVl1Pd%j+%+ZQiLc@H25Bx`R+qD-i~*GzTL}w9mD_Dk-AV4eJ?oAgF45! zKEX6&!+;)7Y9R9|z6Su`zkb9Mvot|%F9EDyyB<D+D!3+2xto@c227W&18>sj_vU^T z>ByC{@yZ<Br60KU<NG>|0+70|jGsQOwU{AxfCPo)9sTL_CmkHZgS6YJLqF-m4PxD% z+Q@ja27N+r>rg_`&L0FKhs#7o?qneA9G9PU4d-_zRc<O#5rV6hG(uq90H4~9qvf}x zugo5;DW|JbcMt{5+noXs2D#=;99Hof<4Z|Le}e5c>r&P0_!0^aOsH9DjNvLY#&oHc za9jiptts&jVf6s@AuZGR8<yPN&!l#RKYUzj3YS)wMcnSP?}eYY{aQF4_Px3ep3i+Y zhpSlhO5KUUPmr^4%g1&-(|fv7g8cjd2r(5T-SP{>1ZQVx4`GsFnpvJTa{1o#)aC)* z^WqTy`U}d)YRmkw!vQw@&QAm`wNjYWGzSVyaEo^NdV<zgFCS6$P0_M{fkKBZy6K~* zP^L<?vDpuaJ>gNeY&Bg}#2uZ6!3Jtd0pfzvd{El#v3qPfp0_*C*wZJiW3V@%Z*_3s z$`JlV4$EJ0^7~Y*1|0i>Zal+{dD1}~-_VC!Y;25TOf40wdeR+ay;`@}3%o?W-yj@k z4q`UfIS&`^9C3-0zE{b<VdwclcvI2*o4sK++3r`(j*UHsdlOEQ`)AlSd3Wv%p_hx_ z_iJ7oGv{6#>jrns<Ms}Mz5f<4|K8BFSN{je6oWH<u>V(^^8pJ<&CdcsgylBK&pO>v z9`RKXIrw8ZSucvJgPuss);42%NSt}LUA3K>AB!zDE#u*{BrPnP7zDkJi7R*!Zd#Ld zkFbr_{t)k2v_f^KDTxPbV5fS>OmFb&bRFe7gxlzA0o5m_0i>&M(FB(`RLBwuz*|BG ztK^yj?Zfd)!IxiJ)X_sKh1DwEx251S2dpbysXC06Dk*2qdqetKzlt>s0{}^4JMkDd zT3E^xstD~fAcGe*FBs@3t`1tRH@w5y(PGKKe}77WHj0aV=^OqOX`!C}#Pkexa4Ntx zSJB;f{i!2xPm>%8R&_134B5~5KyX*vPu=|`)LO8-sr045LbtNDQ^}S`FwOYPDoD2^ zf(u$lIm@wlN6?mmOLLj$_@m*=EzX}l5*EZy3vn}2S2zloU-&e0ktlQb4CtzpwOGVk zI%*eVYK{A?ZVGKAcx<YI)*{3NCUB`rPOC#SRG7!=Z3Uf}GI``a)73<BVh`!{xCLnD zJ|0mhHWc?WQ$GeFktktVc)8zYtI2*gLpZLw6^m-KE{C<^Oa0^asnHy%fZ|dvq9$(K z_b9m5eSvM%oguu7;%1wMXO8?)x6B%VM(LdXi&SOcc@2NNvha2O<a*qsgMr+W(hDOG zfQ{5m45>(sV+JeWUWPqPbZ&3&=OdD0`3oH0v?q-R<gw+9{Ru1h;)fu1zMF7}*>|Pg zct$!}*6T?7sTlp+mkX7#fo&x5QuNN?{a=uC2W36Uip|!sBzLg3nik?LFi$}gh#%{> zAy59YyWz7p*t%!e)ch#&zv+(kw14V>tk#WIOQ}u#_wh2tw<EjPoVP2?w>iMub_G>g z3Cm*!Ij133-A{AQmi9T``kBQwDA@3po<8W1n3n(ptFU^+;m04#U!-yTQ@CDs2kb0r zo!rirmT_R0%6YOl%@T%!$iTYc)Clr&wfWDCFtw*p%;8-l5w*Ffd(@$|*|`>M9}0a- zxS^i`N%WOGi5^T@+)DT@)6t=hdE#u_n?^=gy*!?e7=0ZzWaD#y+dP@>HPUcCvW?)4 ziwH_I$do7vizKG^W^t)qL?HuFO5dddnmYRuPWwZ@0d9R$OB;jI^gxl0&15R80CL;2 z68|{Iy~zBs*YVW-i$Cwnll1x<Y^;I1sTrac#aR%b)I5bXfA5^e^3f`J)|$JMr1M2A ziI%YXl-e!2NwhF>JtI$5*-P_x8fu+0p-Y8=b6^u}Dniv<Ke6A0v;Lr~sf|}4!ng0m zWVmUapwke{W6j$*{Tkgz2KO-@Z>?MBPibm%VZl@{k16dawAA<NxdedDz&^*XeLXoP zJ5wn?m8Av+Q;Qd_u5=5YnDc@56b6;9pBR>Cl8w`lQ`G#bj(2_MhNTnPMZgi`6$T@H zH@Rg^&@zF>=Z}<j*X_NOiMs;gzdVxVvHW?s?KO2B{Y%R6F7}w*?cp6OROLQA6fTgX zg@j7$+xt)srce;{$yVK+*8g$kCkA$01PXHe2ao#i_2Xuf#QP=Jyl1;r_^<NOy@VpS z6#UlmoD5O|aJVpa%53z{LTzJW0ionOjV+AT>!7SL;iz|8&c%2{m_u~}1XDBS`3c3e z)1KtLMcUL&9Nuh6-dB=IxrbmMn-)>-{M4pL(V(hEnpK16Z9eOYr(_Y&QzWen&41Vn zp1zrA(yQi%D52fPiBUhsg{Mj2k#YpV7f}C_iqnkWrlcx}pVlMU=>RQg-o%`YbXpyT zuqK-a>8%5osu#g{GZDUw@16hVL*Z`1SL6xTblg1#`ia+m6S`mQ%WvGJ1;E=^(y-|G z_l8~@aJ~n<_)B+UVPk5=P~U6O9oRkuuY(=Wvh<k3ICWTjbjQQ7^NT7;>&SW|u@9=y zZfckLON=<TuZ^yb?{*yvquoKcDpF*LnMZ4Y1>98?LA;J^Vr&F$fPb@;-lMaF;!%Ih zpZuN4sdQ4ZJfponAxIx4V@>!8oaIk)t&&_r>Lbhay#eVwWMy0A;$%Kc4<@un`x%rx z&eh4J4%cG5FV$D<3Fd#!MwUy<7lSn->*#stDH<9%*%w0dT^p&Oeyd&iNBZq$4DiDq z#`!SWZAL0)7GJAFz3NC%G+ZQaO=~WHAe~8KTSI=2lOyyy;9-}05A;YNk>ipq%@knG z2fMH+Q`B7v+n+LsXg3u;cmPcNt**Xw0gw?*NB}m+4m#>_JgZ9$d}^nZN;s)7CH;0t zdATf9U}x8u%cpY}8u27hfG^>s;^!rnyL29&n#U4ndCc_uWE_q>;IwplPmNdb`{l%i zVc?rXX4sjwD*{3Qku0U60{Z}pZ;GM*7d_mgv^&h#F|+lzDP`fy*Ax~}kHmj(Tat!B z;red`2xQ5d!r6X=dp!hp-E6$pzg<RdJWy4e)BQCafc{BRSlCp*)ODWQRYrDDln%8M zpE!%?PD@l@n4BqKF6=47E1Ubg4d7ZINAS&7cAIFt5Fm;6>w!jqCJ>p}171sTzuL&? z{9}NbHq<$J>YvQy#{pa}vp$yZGc<<z9j=x-KlMke^WvhaA%{9;rVwZ<H1`aEczu4# ziezB*-qCW`V!rSq`vdbE(|t88HR4h)bF9BV+?#?nb%FwRM_OPJjLb^2d1PpFIiAf+ z7I`K{avrWYB(QxfWURN6$|aD|j_G@|WtQ!|A)VuW{M&8q`p~A~pxTPD#_!&awJYE! zm~d#>ZG!c;B*w-Zr{13ZE-lcuANuZlI~9_EQpYiMQrq6stF;!{6_kN;&qR*1GS%_Q z_$sm3pxbRDwPk9uqs{&!<Y6pQKXrAUQ%xYDDwAdxure^vG?**4B^gS#T=v0(Aw5q+ zk9=-SUjPIrF5g~ddUXABl-kt*i1YcpdqmfJah)mIHGJ?p(r?Y!Rc)UoZAwDAMD;>B z+9X^0-zo-8U8>F#w?&;)h?7$(O0>}-9khZZ6(#zG42vC}2;H)Fyd)#iTD=`h=D9um zU1}*uSKCEQDK#Xl0CO^C(1RU!mdMTI4`Aob^!uVRe7V@Y|ILa1r!1@)^PN=a^0|XI z`&YizEr1@t^ZF<v_`3ZTXa+J1o-y(1ENq1=HtbH)h8y(I+ExV39{MKHqP8|&;1U&$ z-I#M7*A!DsL#Ptt&98j7R`%4|aFX`1%OBzQp~df$#ZIMb5N*f^S<ncZ+dBf-$Q(3j zG6A^t3U+$xlxICT1_oMTe=VNwz1TRnQQ}{ALN43N4Kp;&HtO|?$doCBQGoH&m83!A zSkG>F!NN@{=ya89)p*N_14)PGc|Y>_Zx=G~iV0e;P-uwws>LC}Y5T~!(SGa_oqpk~ zsJovpCFkgjGfKhKf0o~94PoqLj)4>NhTH*!lCz+EXmx36*?qNWKQ3a$nhHan%|<fE zJ!FkbE#7m_*sLpFGIR*b4xvES&^`9FsyVp_Dd<h1!)PSPlqlFbQs9Vtc)mI$f%Bk9 zVntzbf5Bpf|I5NF8iFvUfk^zvk&1H^eaxQ|ase?m$=N4#)Mx=HJeQO6rG!%^g<c%& zHb3@w)B5%I{JzR@T-DrK1pl;EH85fPBF%?y`KKooap)F@>89)^+lDRT9OG~&gYB6$ z!0Pw}71rCt8LfY6{6!3j^aVMl==i=p-L%*p%$9s==rgSjMrzQi6b)De6aUJIExet- zjxFI-rWthuxggN?+UvRs#$^!8@sgWi@Jv5V82dT2WZdm(Y=xLSHhD^?`YKfUf4+f7 zBw&8mCuPfH+)Dw@KO-8lS1U`CI$vojkH}1R0Mvuom0Rc#)=ozoe3{KY6x;(B!S!V= zQNrS>8faY&PZL5CC%I*nUwhGP?PI7M5%KB00?s}wI&3|bh}_n{?V*aiG+Ve`{=2Bc z9~<gD4EKNkbAQ?b;9fI8kF9@R2WrYo0=D?Nx%wf$aoZ9md=RUyy%>B=Mk$A(rBXK2 z%;kvK3I(zzV9k~V6o-#&Hl-mNuSg=z&}Xb+?Ph(dPBCT<=nksHDQi<h0Q7fluWF`| z?3rflX*u05Vz!X5OL@$RRk_f{VJgB1$%*}B@Z9B(7YT(ns-t1Fi+U2y%_Fff3`z7X z-;(WZ6$MpsOy#G91%S?qF*L@7#7_;o;rIO%ZSI{6UF)_J`}Ks?44Xtj9bL8ctNdV( zg~4pk?Z;S=>l<;*E;BdO1<JEsz+o2!B=G43|LZBE1@}=B;CZ_cbk#(4-?r{#TC7-f zZ9(*@=xp+hq@a6ly0+{{ZJ^dXYMFfZ^Tv>Im8Ee^60n3hmZDf={6~j3V0cALtOyHD zhs*d&*v6l9CHlP8WCb4OrSo;zd?R&&=<bA*$4z$cN;L{eP2KQlk)Gt)JBwqp#boI) zbD6iRkA|g5=LxxB=9SgoI)xzA@aZ+x#VwCbq)aPbG)fAfqFLh!H#lVF!zl>uz%6sS z2TLnnvYw$P=8vh<VwcM$BejbMp+0l>jec?G`sT%<J1<cli+#c-VZxC;ukY#QpzuQv zrr^78eY~T4*uULG|B)kc|0_q@Qrb%TFUGwdo51(EdE==uhqUwVdFjP#yEIikA6+y* zxB*6Q6_381tRdZ$q9uenoc@rqPe13$3Y(TiI8VN$f#z5$fki_)Bt`TP<%s^uGdC~J z4{YR{GKwA)@BRTSo+Z(R<F-BELee)~n+334mQ|+gEr~JqvhN+lqk0@f$1c&x)1aGp zjed@e#X*ZdX3p%G-MGS<cvWjx@GH;Csw)<4k0nPSeCDy&Z88?-><>%w`TnTJbHkap zFvrpUYCJpZyaZNBEk^(w-l;8s3WIL57bn_YX>CpcMCpMaf(cd9Z&11MRsCp^ndl&L zN-3XZJ_-|jx0oJS?NI($7NIxUd_<8!yLDLY;H@t%ybp*@>}^EOth6<(v>I(FZ&byu zs;-MIA82{?4B!~J#dH=D;zz{f;}IFfchitwD6S6lVx*sQ!22b7JXQdzHbae8r+-f+ zocK&c3#Her#lw>Ke;^g}kVx*+R$0+Ch{-b{+U06zOXa#>+2?;WhR@i==P*37GtIOg z6OEI{J>|`GI${bs#jDavaGvX<IhwtRbgA{?DT3j89>23r7ikaWhhoCZV$(DBWXU3@ zUIV~w7Mati$tY|x=kh<>mCbh@LZM-DM);e{&!);CuN$I%!?ELk?>LK+kTYZ4Pw!Ob zOuDyxe5!&|^e>TsyaSJV{K@avro)^nQYM%SbKmdb_@94?Olm~2MY_}Prz%C+%>`Q@ zpyu0oQdhh76QDTNbw_Qtiu&cBsdR(`_lx@AAJrU2WO}JBCb>8Pa^%llu`h^k{eBQT zpUvO%lz%e*^CrYHgkd8`cz<e7Ov#q5<h$hrzFGl2t%<ze@l3)JoPwwk2kdkzxXy*m zPi-S?UQhsK)KEOsh`ctreD;dW87o!ut$*)&q?ppUh(}#*Vm7wg57NyNcgCG3b>z-) z4caa2v~GxoNwNaMPa-F}C*hP^;^lB<F|%1F_W=tuqBr{agSfWjwg009I9Hut(9*Au zo86d_oFZg=)az(U!aOJ^jeMrvUU91ZAz8sN8Rj08-Hkf6jJ0EPIY1kd&|kS$rEIp+ z(icaot9w1(e&+M=11Nlb&K=YBdQ(phK7XZaZo;rF5OVmaestd^9h$-l@+Rfv;82Rc zXS%N^83)!7c7PbJJ{`XF3L->%x<u?P1BCXHR}w0ko5EeSjZ0AKTt4aKT*dQYJZY(X zn2EJXF8$)Vcd2e$ags3KUp}5tai!s8F4zi3S)1K0Yc$FMe3I|(tZXm~v@pzVNz_Ew zL}dt+{EU{i?_F(j^2L14%2ubR$P6SLFs-ktJXL3{kLbIbOULo?Hubk={v)<*aR5wG zDks<5{38^=dZ!?s?S|o!zVMfBjT|g$Yv89UlPAb$Sdiq6T+eH=kgpLt!KQ%R4Wc7% z(gr`#>wJRky$LT7sMQe;-@eKq2e@B9d^$Bq=Cc`qXyAS+dC-vQvG?}h{k;Fr!`A5^ z8AHZ7g;MN)$rz9Ww%mmMZU(`VkY!-eXsdS@j{&DZ&QDr^)~F)9Jh_{w`D{Y_dP88V zTJRI`9;7#omeul%{A|>4t*x%{T{!dA^D&OKGcLd7Dh~08-_JvQGS^H-(h*h_h74jE zP)@xQZPoJUOU1r_)UAG>H(ftp&SwS2g~M&reGr#Z^Zxq}W`7QvNTfJ8Ult#f=TN`9 z^3B`y)qV*k$|*hm45^M#<E?gt>X!NC7wML$oDyDqG;oQjh>V2oFMbM2d6G}>d!~W8 z5Va0G6u`5o^+Oy+!1j+PONWv_24Xkb-}8QiFnSV9Z1g>-`4Ind={C7)Lb4nmD*q)S z=Nz?@D^b5}Ka}%oTDD8OTa<8F{^refJEHSsl2QT?#MN;1sK@i^PXBf5Ix{}fwVaul zkv!h!;GLR?dGf;=N5Ca+GIWipS+IrQ7oJXhVKT!W33*|aTx+Q&<cd?li6~mY`L>f> zfdkPZA#}#^@1PFyo{G$RckjsjUyD;0Buc_*l%vT6?XI>`P0DgOZP`0u;f)}&_0G2_ zo_ObBhM)Y54D`ll#Z*tz@+FG%68HUT2eA3Tb;o(O{r$iZc@jg*HrQ$Fbxwl)BekZt zwKO>lwkOzvJ>b6bXQOYl+{d?fFgI)C8m^eV8b;0#$>$9p2N)uIrmXov*de#R+-&CX zdtKt2`@}>W_C*|ski)csS=EyD-4~sc$RkO1gD?+eH9z)m1bQ2Mo{urq(ArAGWMLAw z&sl%^oEbgKM0Y|0((S_lU8a}$1B3LW$oc*D-<lsUmEU$l4Ioo=2Cun92Y~+&25x?S zrwzzdwENx}&}NbVAmld3_mv6!CIX2B5zbu*07S+wK|=jb)lED^&${p81pG$)MX&^{ zlIS-a`3~aS2A_M@?1{PZ@r-C^D<&Z)KeKi&=mj??zPJ|yc8LX0ZQ!09|B`}K?&~^D z^(-)8nMt%<XB)ul>-&Q&n8rj)(vg`qMFNPO*p<2ot^bhc$4oS69D?XZlkY)chd35u z9F(*FpkHl^zdbULW6e_?^V6x}O(=1`X?mhZ-|JrRdFuT6=JjPa8<8A*&_%b-=M3^; z&f7cBsPTI)^x{3-85umrqev}dB9omzZ|+`kCa5=v$XdEc9Qtk0D2RFBnNK8hVbYk8 z0?NC&s!1M`1KZn8pRbOUa;kKQ5>=f_i2X9SsmxqOd8>F%%nO@aX^^@v?)<~Nes0-9 zVyMnzrDU~Xq(2zG-nnddx!Cl{ZSL>%&A4^4<j;{2>#S9h1*yMZs2txkhZOlPj{C2! zNJtFGUAxkhzjqA;NZ1yt8YHdu)WH>5;=!jiDimrgRa2Yf8xB1~O!+XRK8kkKO+h2N zvn9P4ShM1z5=qr>82Gic*Yjmf#Kd^H?~8TD*iC;p-Qd~i2vSrD-aAmGo>{7#v-CNa z?z-O`>v^|`*e>qF`QNPKe}GUxGvJ>_uh(DT#Ls`>Pcs9|4?D>Gp5HYHz3Y}3e!woM zOy229mF4JA_D#EIoX}}zj&eKTT@qUBI6ezXY%P)XZ((TA`E#E*%HsUhFH+*54dIqY zLf9FiJE$PhBVsaJq(4Ra3G7?_fqbr-$}*2=Jc4Rp<vMo%{(iMnos?<%=J`)&(mpwR zELyymBUy(g!+m;+7IoFm#7=>!Gb*baN8j_DQsAQ%C`5`O+ZIM=o2gvzVPuQHEuNE2 zBOHnZ;{eB><rpYtP8tcx;32n#ijF_@zppUw{u{7Jz_1Q9@21x1+f*8O=!Yv|F#XJc zgR^fE&@4&KWNcw1yGw0sVzG{&musQppu!j(^0~|;o2dtVoT2t*%7Os7X5xLqe}RF} zMRavj%W+41H4G&m>09lzZ5wvDq|Z-9jBp|?Vm)@o_pv?PU?SPCImR5&a(q|p_ZVqp zdckw%*{Kyf1L#LB>DZ}1!d2B*y+7f2F6sbnWGwn99i?sD9-D58jXiK@Xio6dIP${! zepQ;J8moUN1*Cro;4F;nFSR`~wvcP9fd-Jp)?2<Y2@D<d=~;H5f@e4JnLgk(QCu~d z{Ky*b*aM0k?hY&6-xevnL+6d0K!0vO-#j(cx6-OtVVKe8Xl`-&0DM8iH)CXEv`vn* zMsBkV;}*>vLuAMI=34=*JwJ&J(DOOp%hzd=(B)Dy(iHsHB!q8ZSoD+cXNXV+i3|SD zlleQPL02BFGL2jCF+PT-->tfs@LQJyKz@wJ07YS^w{i#0CAQCyp)2y>V_utvl2q}R zk%vGUIAl2$zZ}oKXTL*{*D`?LgY>S_&VS+%)<2?9Rd@Hef2uMr81U`f##^Gu^OeZs zstEBc4kw&}zkeioe<ME;Ok`))-W|phQ~@$uP#<))T~qpV#sk;-hk8@~HQT6j4{xgq zF2o%GplhX(&^HsT_42+pm3XwrcY1}`#R@R9)J&~xHHA0Rx;U_hgr(ti^{88r-Qr9o z#W4j_uccogQ#XwhDbC)f{FFyP5_Tu{vSs>>w+j7TbYakD&2_v|^?dHJTX*mCiI3mo z^|y%Q*3?0h+r+vhh23}WrK|hnB6$F~VnsuZ8~V7WV=SO6DLX3qq`X0Ar1FPY+)Elf zJ;I21l78=P5uJrsb|qzkF_#3g*HZX2ce@<^#r6Y6uzJLvQvSYDt)Ryrf0_|sT!^F0 z2jz9tz%AJWyB1xZZ)u+iLN8?UD3VM6mgL)<nQQ*|npZ+nlOJpcEtC~D!RAzF8j?+b zMJOQqbWMF)7rC(cXY`!!Og3cxYci=)upop_gPzT|cdCGQ>ifw61JIb5Fuw!f)b`5& z%7im7qk5@xY}mQ{N4b7Vm&YZ_m*ZQ6u&(-}4+A@wCcGp8VuBfeyo3bL#O|O6uHKaZ zeusIXta>df{^30Tfi3^0bXuSIr<?J&<DS>;UvRXJfP@BmewoU7Nj%dM&X8MAO+Qxd zAdL)`@10CY;@TS2_?V-ugVC5NI^DG1QtVN8a-LwT%}9qIIw=ncCbDJoXiZ^qazP#W zPThtRc`4IeEygLckSVt?8Yd=$@w@f2(!6h+R9~NNdNQ(&RA!JRCq!aQi;qHU^~v$< z(Zfx}<v`PtnT0aRPe$peDuy3eEJxq|I=v=Va?x`AP<o>m-~yn799M3Qtn(=~6+5=9 zUd0>hZ?RoS@TIX99PibUqAN%-_V5u+Q9*?gy{TzaK^0i!$wDO6LDZrWpkv62a+Biw z8gXd(JK%%NYytLP3^v#Zr0%}OKsPE_T*=55?FP<A)AWKp|Jp7J6uDLXRSiF`zN{hD zlg+Sa7B@Ob6}HeBTYA*%eB^TrUjcs_64#W__l#D3<<;s|)3=*sD_1MNFry-k&i0mF z*i>?kCko~%;Is<E@33$I6HOyV_jfHvX<nEuMYMs5%t=dLqb7F}?A~qhxD68?h1y5- zG&87c?P=Tb8wI<DGX$FOjO6MC-IfNm@19fsSSYr%ahr-Pe&fdVl|xX(?z(<`qa|{? zu`&KdmKTvcliJ;Ke&dG3AzZ3<!w%+ia~n==0|RPJ@KV=?j!*+Yk_EM|DAW{aGpNEt zxIewbPAB^L=IRlnoi91j+!1a8=P~B4ruBv4^a3*luv0Y0c2=|SU;v3BZ^gLTJuRT; z3LddVNSG4F-iduZ4mYYju9+@z*@6Ew@{)#~IBZ$F;oay2yR&Reh%n+&MWHRfCLIDJ zv?OZINDJ%WLFt)zifTk#LSP0=qH>GkKVoUp^*fn)8%6{{X4^$Bdb~5=-UpojEj;Dk zt229KQNgi)(jZtEbESu+jTf-Uz1Q2*J^0dWR7qN>imB)P(Ai61X+!>87}HcoUtheZ zvu!`^Z&OD|?P1|Z!7j&k;boBxUawm72Fn&0U#-6v!;cH(B#=3u6^N%DJJjucM*cNv zov0h=1tVwJwd=O5g%?l#g%=dDq{c~fwe8=r%Z8V7lCO#jBHiqDKj2N9;DKL$nQ&`z zJ@Y!d95modG=MxvzpeiUWVe!vw(s#N3>3%%Kqt3K2%XhwXio|ujvOA~$J-{og%;N0 zN5{OA>O#Xr?!Tpsfjhm}<{U2Y14^T=mNw#k$ph(4OZ~ibVqY<6jPm!Zt2(^D$f=Au zj<Gg=SJDHi$ahX_M!#;EPhg13VXZu`Q$VAX4aP344pV{8%;)zV_7^{Irkm=llW6ke z2|efYeL5PAa$fdi8T=Zt8~yTpZ&mB9S#l|t@ZtT_l}^iFBsCgX)JHR!xVB%~$O*3% zL@ldh6qZZL6!foXa|{{w611Y;5Me#Or+y$t7fccJhoGVdwYVR}P2?X!BAqR{yn)4u z!-Zbcp}U8rsC}Dw9UF8x-dA~{WUEU{9=q?_%4KO(JC6Tz4A~x$q8n~gz>v-n`Cn!E zY6wzcq{V$j4*ad#!_&c@5YgDsU}Px<KDK{Q12w5S%=grE+G1MU)<f058|^T8rbDS@ z3Vie7kPKzII6eUrtwh-H5oWpFUg^HNN8bc+ZsJ9d|Iq05%{0*FAgQ4)iYZ8{a~9+t zJtH8#K32HRzfM$@zD@Q^^-V}bgy)&_l{B-F!a$7vF)nizN1vNSJ?7#6VeGA<;@sA4 zQ33?F;7)LNcemi~6cF6q-8B$2KyY_=cXxMpf;&`knRBmw+gfwocJ6r^tyR5^e|+A1 z|FkB!k(Q1H_0e;OkP%p&9Fw*<)JUJud0)%ejPMcpEzvLfzmoIBxG&KT7MEiVe{DiW zZj13VREYu7jwmBC5AA$9Wz>EJM{$0cNCQ%&^Vh@(bW<9I1)Ib0Wqb$|hEr)9d^e$u z$T!)sscj9%4h6$Jla-+%MN>oALuJ=N^dvx^>?!!s&hV`Q9L~N`|IVLC2VZJ-45`7! z?yXV2&lq*II-uS~;^GNW*v<#?3d{d;y`eKNHzY>kvmb+)a2~s=hCq2DOK1^eDEofJ zz`O&7I?%-;Q^p@QdfP!zF<W~B#df!+K59l!V-sIwGqCyDH4;Y#FOBey$6}B(h`el? zCpkT5x5RVu%2@mypgGdn>Hf1rKOT_a4^QCThVrTbO$xdwG^eg7hsL%W?-=l48EJ0A z4$Kx-x(S{c!%7HrdZ{-5j;l)3_O$!vU+|l{9Ml?j#tn^qzI7|oxr69;<%T)yEjjOY zbktA0`gtVG=<W!bzW(XtB3!_|>;9*1ZWGGvO4{RO6fLy0+jsAFawwG1NALEZ(Uw4y z4$9=PT(9CzwxM{i=*=!FHx>-{#OZRzlg<P*=8SMed+#D6zAt+%?p72pDgh_fs(8JM zQ_#~1*S&kX$vPE&uY$n4&4(2Yzf;zV7)0{Jf2Kc*7$2N04e`kP54W`KDzvQtx>0za zNb!9n0<ONh#E(LI(~Bcw)m~Tr`4gT|@zQY=a*Ds!=~bl#u+GnG#I_4(_RV$c=gOFT zBwB8rZh0DC+~R9}D~rhk?dBHyh|cSyb%-+aegTrs$X)NN&RB>4*e!NV*=72Y{^TG~ z;d1teHfqJ1mf#|CW)tn`((`8I@ojshXG!oOqU-UBbZQf6d!2$C;e~QYQlnD80|wka zSvgHYsw;ob<~dytd2Gc^zw@{BMA_i0xX{6}<mqkbboUEgVDXa3YG;|ZFeA;3P^}W_ zk*6nB#(I=s1xpzQ$BMSE#Sad6`30Ao?lasxtoA{-+ypZ&YFK^(nt*bGnzJ&Y@p}ym z4+kHqkgvo|H-wJy_b@c%#piEYrNmiiqM>TouZbc*I$BR_ZJ)=g&_7p<UaL&cybjv8 zS%UvIBtgq5Yism___o2M*)qP|wHhZxgs|YDh5^Ms?Kv~~cno86_L&E`c;@n3#t@d< zy*FXx?)VAv&fu6r+J-snuXRwoYrKzLXL<_!_leFujQ^)1iWmLk>uu%mCXX5Y6<4;C ziQ^_I!~C8Ee|rNp!tA_-DTKucv_sw7wI}AoU~Qd#9j4vpY0$}6NyCvi1@^Ez^JC8g zuulfNFl`(M#_01vByK4^$MH<8(!NEd-7#zrIcIP|m7IOK#%xA}xu9>Fx#bP+0*PyI zLaa;P8#;yRbdQ%zWfNb0eamx{PP<fz<Nf+MSc1>D=lqD~hINxM)gxaS5x-E=`0_P- zEeo_$o9+FuCrdt~XBa6%+ROculY7~BdJpHi2`Ot<C^8PPmVKczdDn)Ue@e-nLxK5g z8%Pyn>+9kC7GhjL4~T&3fsw1*o$>HK`ohW;_&EhOn2b(%Vpf)Em2JgHzcmdjk3HCA zTGiR50%3X7qB%fTGmhSarK^-C*`Q2K9yZigy|GEBSx-Hj*Oy?rjqqN=EWZ3pH;>3- zwQ4DYzyaZ6P03S>Yee2=tC1N3EA5NAqRbL29Kv%A&F!JV4w@r*9`;2&EiDnP*m(LE zZ1pk)6Xug}(LcIXnp!i3ZmNEkwMx&F<=*0`g-XT3VTl#%*>PX|Ytn@*$N`#`5auYa zSUVUwoOvMaEh6mR_BFklDneG_FNQgCHQ+pST-__dw81LvfcjhUbb#g_y$)zsA)bvC zVNZs?WK1Cp<T!-JH2vg8`Q-?80a`N&x{SU?i-;inJChfuJj0YFy*EbSwO8lD+Lw;S zW5|y+)#QVF9GH33xbK@w?VcKr1<V&Vkq%}8`aj|iz9#(%Xxn{~qJzGX#_I=tzUMrN z%BwMEV@xq}C&Be${w$BSVtmXJjjmd!iW$QOtM@h1@fxb>sRp^@?v1vJ<x+!y`|a;H z_y0~hxX3>WdI55K>%qTL8O(sKw^JhEbJP1v*85}^X!oE=mD6AZa`2mtALYtsX@=mk z`;`G{>aLrYj_lPOL4`kF%pJ%r0)AHqS+?t0=xkOG+tY^|l<U5SXC#2RR>C!S+jP1c z)42RAvT61(ed48=x$hu!WK;h&^U`DL`=#KVpzrl7XtFPszp2jYVKLbcPeLJOOeRHN zu+`IpD^8USSh{fBXi32|V%JQ!cK}Q~j4*OeNNNI>;3mO+E-X07t<D6Ps6b7Qk<Ri6 z_>2X7b1{iSBR~wyQuUV*F8KwZ`>cZIDc&W|j9y6hN3)$p2TnS5-}iU^es|jZmZbx{ zxgt6;RPwMiBT*A{xo<^5rj3_LH4nvirUbhx2ySD7htgR`w*uHI^qXOf4k$Es5zL#Y zXL<(;;6Bagg<lG(VMN)=Wh|f37S0g@>)(3jH;Z!AU{}%vm}+gFi7HCj8%jsIH36kF zdwcq2)LFi;Rokes5((GtJh-tv=L5$^0gatEB|kNgV+-e29Gb$MYMm3w=0?!lx9ZHM zy!T1B)@<j<-MM@J&khCqFNe~@n<Df5Z-+ub%Jg=DB@epO=mC9(UKU*^Z-n@XvQF;E z9-=r{fs_WU3cG`AaXg4SCU#=0EV)!Vf`ny!<=kT^_2R*ln>l?syP>C*?pC|%Xit<{ z%CYbqRSKK6eu-A$-}^EWs}=4wH?C7CpWWZ(h_w_^=eO5bFqwlgD!9wdVoY*qWO9ME zjuf4!j!ROBLPO)rgg&c+chJ_EFSTSMn;Y2*6?>K*FYfD<Y&%oQLU*mf(oXogln+vd zx{p>%92Z0DKoqu#A2WuS2kZh%4-V~rcqnJ%Q>$YuRToQ=+E{+WswmE&k=7S`a?~;; zi~UnDtcgSNMa3=r_p?G}Wn*%AR?zdp9?znGc}B#+nJ498q312xjJ8P765Mt}(oqJv z5y3kb>bgQOlFX2_nBfMbs1U}Rs&YK$&wddiON|Sc+=cO(qzXn+{?pLuk~G)N=IOh% z^e3r4Bk;lq*E0-HU|XuYO<jV-<N&)$uCs2ruAsKaXuU-xn)(Z5hy*8(naqT&|6&eU znC7W$F>l3UFejDqIUrIFs$Sl&e@`^3MDngf7V%)BvG*z@2cl->6P5<(K;hhAco<1w zRqRYn=;wEYFA+_o`{*Crk(xq;oOCS;sCuq~3R{OUgLSN}8T%yyzwUk&?gHSLGnOn- zetp@E8SHAKw6l)-qzw}B((aR`w)cs3lhoiD%OL@aomPWk+vaz0RL5tR+=yY53$<9q zfcI7+jPTIFcbTyeW{czF>Skp=i(tluM-(ds8Q?~Xv7kr&Bm?W>PD1MlWgmf)aIgn^ zVN$RDzHh3>=9-rEbf@5Zyg=mh2rY1YftLJF;D#0PNA}#XZDjHh1e^b$fE}H{Z#}(K z`5naiT{6DEA%k8Rdmy0@-MLd4(=s;Pwi>KmT&LKZc%1m&9No-30DpE@cFx==Q!Z=? zw)j1qp0H%D<s9xctqCJ9*q(WC$!w!m9*pX1xVQWcfm3f8UWZ%H%R?ZLC{}Ziopl%T z%f`jbLX=$x)Jv*(S;KPIe!-8;=1rMm36z9Kya+kpQbj-bFTfceEFv{)m5yR`HrNB* z@N=0yN_g&sl90jCH%P=0!_*ce8Q<|WeVha(FGXXC#{-3I$91}iUcY7gj<g--(~;2l zDXBw!#K>J{m$6au0!jBu>|0CcWEXh&p-PUxu6M`wV+iyyv9|L3{CbnYnhl&=V+~r? z0TsegK%*fWbcMAC(jQ)xPRpw@B|1}$ZC@2IPC^&R<k0Ei+HTuaS$iP1Len_e-VCI< zrNEW9z~z0I`4zmP(8~ZfX4Q$ar@K2Je#~o-Vcm+D!iUyL69?za$>aHo(+BnsJow<M z2I?P;`+o;1e`vpd0In{xGe!#j{&e<ZC?Cb<v4U^s--K9?kNnsCLZHGxdL06$fvg@$ zZv6%3Bte(AM*WUopyF_0K5wA1YkJ{hd90PKarleXwXYnSR^d(n2S2Kd29;RvM_D5} zniJ0B%oI1;gBN8jvyyq8I4m8SlNzHP+fTkhGs#LY1r&rcBt&$DDgen~h>(jRkcv7q z!>v$`P>Wb0U*n5p8tQxU{gO`e<$I+Z<!*9QYp{7#(VCFA@KB~}S~Mf5UF1xp<&L89 zz<XB~IhK&3)gCGUiF`T-wBp2Ub{RaIcK8iQFs=xozGj1RfsDVpqohS0E5lt2QZ#2` z{C1*#Y4rc;EhO_f*fzJthOKYM=aV6Y8`9pCRk+hrS$I?B?w@2<gGf24NWdmY<RmSt zEf3o3bo6Ff>+$rOYt;8kcNF1N0yr-I?CN}+(|MX5>6p1#>ik|>23f8>EcsSv{UbEH zn$MhF#g=2$<%@&Uw0xW~6~nWG4gGt6D0@f&td|T-!45_BEW$a~l9<e0WD<nUY_S`a zXkU1-T(waP`xGAbz#0XR#?6>KWgpzil#netmUg)LN-9fd)et+k3g=j*y0Q3DTK~e9 zX2S@DbbbkIFEvP&4Shuu^HU@vSI7K4mYh$D!R@Gir}-&->m?@J!X=C|Y$(xHK>Bev zZGVSivGjxwAJiVr3xrMKhv<ti*oCYYUIXlMm-+Krwx!jsf%CQgHKu#l#|R2+Q~QB4 z{`#=E>wF55XTzVG4>byn89VYMCz=*-(SMp3LnST%+Gri)7_414d{I_*X0M5|6@Dhm z*go)DMsxZIVJx56)aCl=1Ec#!De!#i_mH{>wLJchY{USv65=n=7t+^S_`jTo9LiH) z7ibU*^mg`sTlGF>r`z5tl?IM{r9GbRZoeea>UL@BRTL2B#qW4w{N0&L@I2$p=k_Va zx2Ta@>qk-4L-h>zvfr~8;Q9J7Q;x{*5gO^iA;TZQ3|V||`8N*>i@P@Ea5!}yP&dIi z-1Vi1Gx<>_00{e3cXMXS8SzH3c`D)?PHvG3nbc7k#aT|XJUClv&}lUM;t}smP1~D? zxNca6z8cm|gBWEBYvM!7uy!BnBcNK|%W~CEyKvQK<VEA)BwErnEMDX1q!=kFCT&W~ zT9&^q(}VY0Ye;9j!^?a(IVwiiU@Z@eKOgQzNsgd;HFH7M(c}m`d!s~;i7<~Hc&h!X zI_qhe$Q*Q?W&FOI1jFPzvxEio&6z76qdgfjSv|X_Ojy~uzP9EF666caQL^I$c0TUh zy^ga^o&VXn{`Fti{O|27_b`$Vf9-bs<EZv;x@ogKjMRs``Mbko*@x{!CFMez`~E2G zmg*b-Uo61WEd7rUF0dniFdi#0yH8gCO>8#X5>aDw$!@8zaQbxd+zl3u{wd?W0n;g- zSlUFh?HC~4y5vG|MTA<XLl??aOps+CR<&K{5Q=3kypDg*VMIZUl90#9+_ZT*BOznW zW@#38DJUIBts?9O*@Q6OYG^g*D6|lVfBn9RP0T_sC)WU55PO{_l6uW8h%`X9@AM3e zzIG_c_ggj6syGx)3!RE~3a}03rrmVLUmC_k!NJF*2tb#BX!ITkhVWn~0VKeL?dHlr z%Yv6lSQb}hbSLw~$`Pt(lrjG#_VS{79#DnwB{o9AxHTf=c11nY(EzW?cCYNqt=F_V z|G-1qaNNskLl#NRT<X*4^~l?%owA;k)KB00x*KXypW@eqHbZ4G0Au|qptF=zM|Shg zzs<x$5LB3Em3dIb^?PL>yPCi6<TL-iA>C&Uz!6%|q*V94LB>iuCC^;TSx>(hDGKzc zh|cRg?S2@?M56BVXuk%<U5=2tW*|uvxxC2>qj9-tE~tJ={^{wiN33<B$C=PJcRCcF zhx>GjKBOPj5tXK4qR@Iu2AckmUpSPa<KshmeDZuF@nP~c5r{A^Ein{BhBCyqT$8bY zH)UL;rjY8Ql2nH*OT7d0yy`5zoOF}W;7s_E_7eCQ#nDxv%JE5n)5nVPWN(U+oh|*N z6Vj02bf4!nP#`Y>M%X}+P@gXU1O49Z>&LdQ%ST8=TvHP9Uh~s7^b?W0K_hqZc?u)$ zFHywWAAC$zU9IkqX?>pcFK~kw?_4hLZ#}Oz=M8?xtXUqQy()q0S?F@$f5Bn8+5dW@ zR*-QMA5V1KRc!mdudM5OLGTX}W!Dog;Axh#D}zIYZ`!J8!*=noVnr!WU<*B{L;h&S z>*Dq4R?u7D`_?P-WjP4B{n532zj1uT`uU7v*;*T`mlY#Qz)bJ9Oaw@dZ1wocu5!l; zgll<HJLjRbSos!k_FHu+GCl%c^po7)H`@Ryt)FSf9Vqxel9puM)NcJl77ID(9NXfw zgnLxfJe&bA!!#+@WXAnd<8``y)X=#{yX$#HELA34am*rRR_MowCa_5=2duw?_9!b) z(JPQ+nlsQS1Q`~5Fo(({H!xQ?#3@zl7H3A1NUW*LTS2SW8f!lya7VkR=BFD3unOm% zbvN{t!67*MJ%JT6cz79`u$34x4|b6<W07|{cJmT>*XCTE-Ul!u_C7~Z&(@vp`#WJo z?%O?B0Ph)NbTi`rB#r#L8~95V!;SE-@$S(dr^;V{k9W_4gyez11GOc<TutUOGV#PM zC;1}J2HPM3O2QW~QRTU&L^;|>aa3*2OFo@6&*2=9gnQT3x2Aa6!dz+KeLOuq@rw3i zLwhJLUkWzPEb>SLtxiv;8fJcVuPF7}oNHy?A?=sXO%h`~MmhzpTwm(vJxWBV-s23V z<Qr5EfT%qSD-ps%m1l(1{Ddg<ysH__n9%gWnN~;qG`gne7OkLALpnLqT$DRpd@3#{ z8K>_aUhkH<j3+@*vZy>)6uCYmjpVPKE9VjPSH9OD+;Xn1xP6AWlw(9BrYC8N`z4v1 zSw2Qc($5(M+{T5rqZ0|Pg(`>ySnx8r8}1^BxS~7t7R?En#hWUHIVu&uW7CC_9PKjY zwTMmjv<jCZ%^Cu)Z89bXv+L0jmw6`3Ja{@V#XA?XF$~#f5qx|bA`7-nk3E@O)SUqf z$7-E7WO||m^D%+M6<wi*ouV2T(79NSlMM}ulI89XK|x7{k;fA&=(9N&i&DN)wv{R{ z!~AfAhTDsuVK>EqE@<5mpYu#{rDSbIzSVDIBw8ZYI72BG2p*r@8S{*Woziet8(gP6 zo03p>-UTvz$WltP864Lqf-ko-^`vuk>%f;FfM0pM8B2-DP;c|g3|Ny*OJE5jomRX! zYur7AVqJfROJ?+Z{`OGyYgC{+fq@6Onc-icGvp=k>muTV1a#fWwW8oT@oYSUQAf&r z9Ce_W|Iur=(BhvNs;%<P+x9{OlOHgkk*}Wpkdq5GWI;7YKoDS(r_3h)4v9JZ*-nTm zXP_@c`(%&E^Z7u*_cY1x>4c&c^ZGy4em-LUr@tnDQ2wI~e_1+*=r-+^$DjA--IPtw zvZ$>sv&RIY4@Cva3$LZk#S5F{!#|lwt1=(f-EeWOhT^}WE7}e)_l$6L7B7Xn)bQdW zzvui$eRp`Mu8~+?S-21lZ`G(~ELBoTw7SQv{X6yNkotjvS;s2JaX8uCc2+uX>#W<d z3tOd4@^g=0II7Gt$DOszxLjs|q=}qTL9q8#G1uosPVvfpreFDxv{pn>1aX&v3zaaY zMjqw4NBG@p(QppV`XN5bh@U7uQP8Zu8e!u&cD!!uSp@W?`#`D}=g;8~qEk2FO+bON z0)SB|@d#nx8`}0?Mn()eHH8o;qe4D((H<EWp@Vkp*#rbGzR|F_cinzo?wS&Oe}h17 zKl>@kP;PXK`+rF9!9Lc`qxnBm{Y$M^6Dt7YUgKsEp9Mk*>u%qV%0Lg^LWMB`S14~0 z#Up!P)=6sk+m_DE9c2~n-O@g=7rZG)q#Y3L`TRR|y7~5`v<0;^HkpB$C7&ohebbtN zl)1R2rrzfFsYM&R=;4{YesrU9WIuU<@;mKkK(tj3C^-~~JXXw}$#bGZ1W^)_3T;VE zsWUzYCl*x$2BQEioCsNQj*xGKJ9pNe$JRorr4X&Je^MJD$+<g-PvfA)LdUPR15_4E z0pfjA&ZYFS;h@M(dIU`@cZC@doo}7wQ-?}R0LgKg%%$%JD=dDmMm(DQ9F>j7R_dUF zP_aGOM>3&&gPRT>t=nHs0MV3~|0=0S7@06wt4vVvH7?h<o|r>gLM6O5a~sV#b306F zy;T?wTDNnuQGT3r!1WWL+G!y%Qgf_!rqkTbD;`#5Y6G?A&`+6~oI&XkOWTBv#UW-) z*RPK+@-w~V4d~^$toLr5*CP$&%F*Ij!SK*Vi0X3k$EBT0DjGbmTI@fMjYw%OZMrzV z1Q)-PERmN9?p6pw<@^vFKCyF*bHASL0>>SNnDOb^8yHO{xy$unbk>HawxGwjZz5ir zS=IO!yj*MoxgF!M_=!uak;5$GAYV;#O^*xvB78F$o1H?`do2(wy0S|%5aRb8v{`&! zTYr)pI|E1jz`*xAIPG;nS3Rx#DgVqF<?SB&{w6tBhiDBx><q?<V!MM@=)mZrvMkgt zS&}p0xtH@q$QgRKnZi^>3F2O(CWu)oJKNTp!SbUVczaR+?T7guOKt&gpp(eE{uwy% zLOv==JM`M~l)vK!FI0eUm6x;o^G(5$%Bh|f9i14kAd29Vyk7ipnP5QAx*(#Ldy#-K zeCN7VbE@>tH(f<q3ATa9LOIci-<VZ5&yI<;@oA!_0s=N<@40virow9&00$E_O;(2M z3g@x{0)$h}raAqo^{+{p;J5A;;$ixFWS2=}%JAMxb3~|6mJ(DD>>ZJ!i^w&}P)-w7 z+Lh<<ZNx@Lu~H3aJX*>N4`q4*>y0Mr!!)lMEHk0A{an2oH@g?(d<lgK;;r?%RHt?z z<#hw*R9R`*qp53i1laz(>!*B9bM^yqhv?l@cz3-PN4`{fWaL;w&9bFr_>oti!&EaO z@2eh32ByoU)uVrq%KyFm1|yC8Xpk5Pp#SR<OG)EY`~=e(R9_iW^m8fR%tSRQL#Ahq zm0NgLkq?S6?)dS_f59Hxul{*y2Lx-A6{?J6vtD1vqr!{02o9?`kr(QuVEi3iIb%hx zG1bDIzj5Z1SS!Su)j@sGM&w0*ynIs}c>Xrja#Hw)^^k~BHt(m~vmspQS5=`=Trr$e z^+RMgB-eZOn(7KeIb1_bS_}#5v-?iM?#LvH8f+0Q@`3fAxp<xK%wT-zA`I1gy+VzQ zmnhkebHK)V%D0{q_#(P&L<Eb7hb}QN!idQaEawZY*SkE&bg}&hg~}NqEu(zLkPAvv zW!7E_W^B0BU{uk^m}1c-@g*q?*<;=nK^FJsKCG#W%JcT@;i1-2vQ-YXS~#Q~qAc5Y z{?I=gIr}C(CC-d|$?o&Cpm2+G?M3s=iOMeVoy0+7Xz{7pf!_@3yI=ZCvJIpYSG9!b z5eZhE2>K|b-w8UhFlYTz7pA8r9h5#bSA&jP8(3N<-ERx0B&gqcKWpJ~!m35!l37~F ziIch3+Tb>gYmqY|Yr&iqYiCIi&#IoqKrUdXj1f9CYP-OA9?0c<B|2irS56&avR_5D zRg9XAnznRxq1^-pbFvuHTuC;*O-__L>@}<sXxpAv0hj#`j?Q0OzXEg5>=4sO>REY8 zD6zG-RXS6nndi?5E*GKjjGP&`c^E6}U&9o!!z(IQo1IuH0T>-)ENAE#3h1BQzb5;v z+`GAwFx-oy-J~8X3?LBrGxu3hzkGi#SS6B<W`ai`Hwum{+#=ZqlDta_+|AxrwZEJy z_!Kq-JoNup-Dk@M-n3T`h^Nm6{jcy)?B7kT4LY^b<Gz>IyZgzA`!j}?I0EJNPEmZb z%DIAZ^(8f!r$l7JcSBd);qIJmgv|DMV8L}?t&~Dnu$8WBJ@O%byeHJEL2kq8&$aue z0Dd24PX-~JC86%>AH-}B)WbF$dl7|~)Xg9(`8i^AX@#QR58ke?Zr^{HvYf0;_9)-J zvgKR4p=TINDv#GKRWPXXd<ARwG<A+NsV(RmszEf?Od$F7@}q*X4r4a?Xq~Iz$o!iM zB9gi?icf*mNW3Qpu{bO%JCm1W-iWTtOU9Jhy(fX#)&Wb0^D_+(=tJ_?fuKddj6NA2 zfggDHO6dDUeDQd;B1-q4gOGn+$A29G_g|_@x~_z7pXlY0Cbm;l-qjGCLO2|T`q^gA zw6|25L=E(|N^6>-RFSCXrrA~e=r<Wj+@&Kbt0N&dkAEnKW1R57k_#2g&03jk8k2p# z4aM3BA(0OLbMk22zZkOYHs_e3SfF-V>+&1BDflId4u+qROP@GESdmNomzQ$o7T0N& zqpdH@pXucv_z0C1Maj9t?AO7nxiGdrA}Fm3^B!ZqJJAQ)^JOi4plb;oQ$K{Gk}ykC zj6&0`kJt3`@1<vz&jBl-5B-s=Q2Y;)s6s!II?E~J(+6Gh^uuBaS)ad;x(rg~U8TK= zi*Eil>a`ji;4?cBA`fFdnK7*K1?RMDwAQjsjM)5aa#{nl|2_ns`njKzBPDXv!ZOUm zU4w1jQXjP6Do=B2R&#tA9?6lkKoX+4t}s_{G@kv?bTHvU*u!V5vr(<+>5JZasLs_y zq9Ky0r=grVWzH(htM_~*6uM8Nqu~XpEW_Y8rfz!;U+$`f4oF1=hWt^jRiq@CcBm61 zZ*cpg;a6&biT-9#kXhqb6T&&%VIvL;WtBo^EJw*!?Xd$vW+;{eKnd38oha^VD}`lB z-i8qUwB@d~2Oxe(q$kV1xLDMw_+Y&nJYPgIz;v(W#>&+{V^DU)s6K!~_9WUiPu(8H z-MU<BNukz^?B($nUnsv`Q~1oRa#iN&UFz&!Au{)|vKla<oyd;=5Vs@wAq-0xaiCeR zw5y80v*tw7N;*>&LEIT+R(rr`<d0OI8As-ZFe>iKYTUW@AqOXT3yK9!?=kuaeIKIz z2j8PxPH6j3Z?+kBz#is*X2$_%fkKZ@r_ztbo?`%?=P=yYQv72Qes%M>;;#O@J6#A4 z*kobMVwJU%;w~0S-p^j?B42D29FrBE;jScTJ#-58jdg6hTn)s=9yASyOm-KLkV5r& zbEnWU8#I<*K^wc8r->Sp8S`44<c@XUy3u?vMx=Wgr|&)p@vU*E4i}HxKWU&#d#$U; z*&A#eO`=Q}ZYOU@epKGsk)?IZxhP0LEmwI)@nOx~+A0;TNAfC(D#MjKn}5Op`U_{V z{FKH`!zt1zu&wsf;4|3R)1Zk<GkX454?tU+QN^PAzMv}TybILtbTr{f4SbZTIgA>3 zcz94z=y(LZUUqc@eKDf{%X$4H>G&5SE5J&!TNLP$G3!l|wh~LO@0l!UBl78yXWT+k zTh5D>e36R7fif~U|5A_g-Fb*ZL$h>^_KxKwgm$ttU%q@@Eg#gIBd(s9KIzkelH)+{ zA+@5Df_Z9860MS9M<pgznb+Oox~t0AK(arje1y7hBzmakV)+NRq-)l1r<kT0*+kwX zRDu)<7LoBA`ZD0hcNAoY)?DX<FQ<$Lc1HX8g-}tmD2jzyvyrkUy#9oux{pxo(r*!% z9WRZGjXFcw^*}qE`z1cBk$VpsoGvgl=Pl_~a71@1j-p)g4_6QQV28|)*7Hg}dnq)V zO7=ZMQ;%T?L7rW5JU29Totem4V1?&c^MP39HmVzIHm(I)a(;VJHePSSgo@0JBIth3 zpNRf}2O;z!&XIti9jT{kAO!NZ{(0k#z)*5t@}7tMSJpwK>uSGjcTUs?#_CkI>@g~% zaYk}+-K|o4SoGX^KXL!if`Ca~R|SCla~jYYNfj2E1yD&{>_}}^YlA&LHpO*nc$}c< zPJ}wqtO<XVfh*JRL{Fcjc4lF(6V_YKx1;Ir<>`PG(EJITkty{_DG5Ix@MaV4U>#5u z)ub!E4;S7UH>cnGO#+Ofl*v@ACpJy`vyU8bAd&*CkKTEjKP7nXXJmZ+>7E=jH_Fic z!Ff4XKisBtRqVNrk*5T{A#BzCNG^S-S3L20pCji9a%?iT^p#pTV?SB|M<-Snb$rcR zGQI(Kikwf_&^Hmg`}yb{)pmBQjhaynm#1S?n&%T7)M?)%yxra~0B9Q7?=*?%-MKDC z`FY?UDlhBSkjIzz=>$o8|5A4OfQ2Fa@31L!v&+_VqVR}T6kw_{5AY$5X9zG!$7T-i zDcl2Zsp6rWJ%sdp@|rvlB&929<5NfxkWP#9B54LQi5D@SGy6>Gx{4tS=dnBtnQ(`A zyj`n5a^Ej=sgxCvsHY-!Fu!`)k5O@o$vt*vdn)KC5wR*1@7#c}peAK{z>;s<R$#Lg zpqd=Fr6N@N`=F%s?1!z?(EM`8<S$fo<#BxFeD={Iex+d;=xcUWWNqt{o@z%Tn0x`r z$j5Y_CkRh*17}^{PxyJ<Wc9V0+iC7RS$k=%_}zl#D$x=U1U?1l&1>lsSbNuEzRiix zMhpsdT>SEdb7f(Yc{9yRc+=A?dVF`&9~(|u&wM^aazG$oX2#9`yWsj!;orfy7k5R% ze+3*W*MWV_=cJB9l5pq>TBOG6u;uAN*)VJjUhc0zAM3x#v+0`$6#pXYi$=pM07*zi zTqt6|nh@-Ywh~GSk~Ptgn6$86*rwKuuel#0R>!@^=|Yb(skSY7Nz$uYSm^CnihyTw z!yZiDf|GzM#wSkY^%6hQmZBSW!ONy*+Om0!5}3p5@ekFBsur`Nqg;2o7$H7GXex#7 zBwCaK@*Sz4DaYaCu`(&5`lIa&wkIlR@Ybd!ccr{;aOE`9&8cAW@f=j0*&uN5INus> z^bheDVzE7dGw}1P8;@PU1{t^fHdxT5*dM<y$(ni;4dccE!aZX;Woe9er6SFaT9$^s zMdd%GRoUGoBD6Ccr*(1^%uP)Gq^U@BF_?B*(+^>&mKNr|zZF}eEQ}fO+4yprGbT0{ zSc?K$20TTxw4REU>#ZuCq7ane(tu~ld#k<uYOFFf67<MlbnME*%@8cm=ICMdq}Azw zlDr|>H@M8Y)9b;c7+TK;3F8{HmH^8fh5%Cs5xFe>VdETnhlimkP_L^Kivo{2;&Lzs zaKo;21_vka*k1?j_G5uh9wW1FPUQzpi-Jkr(W*9kqL7Dfh6J0DM@%?t<BJh3<qPU3 z&6_Ya6}>yiN@Sh;mBT}rtrmApC?23KgTx1!AOYb)eiN+4jTcAg$4rbf<ToZV7saR} zCub;$%dJUsE&@8QI&$-mwG`lvc7SNcD71UvFC;M*tP|CC2Q@Y&v`z+Lw#@JqvAfXS zHJKUlB$*LaiCReV_&}0mDaBsTX;45Ga6F30=l=T9X$;^}{*Ok}HYTyXN|n=kE-p9S z|MXIX5CWWA+MQ4C_xi?wnZCYS!doBE@z8cLQdk#fY9+wWarJoZ35rQ>EtEBSQka)2 zDa?Eh;>FFv{NGG1Ulp2*<0vaLPB5YlHKGp{mhjdR3M;Va=hPn(wTOd<;3MvAM^8Vi zuw<X*IHr|a36Vg!w@WK6M@6eiAr5IyHjlF+=_G_Uu@SIY3G3SLHdKF_4T~fUPcd4P zY=Sr`?jJoRADXTmy;@!wLZL%%YkrZr2Ef-?X9)vXCbdVk43lp9Hb=ax7T;16f7hai zm)bC5(4gOQdd+~CS_x!&KDJ+cg~<EKSZ<tWki<wBUaiaE2^46B1n~1@$``RPu6t_I zG4kCE13w^a&sdpu91h&S|3k3$pELe{PhWI7Aw#Qx7c(gz1LOt3H>_X#7t^ffp1c#p zxh`o#3TM+x>7E<9HR#nPdP<)QTQW<;M8;wX7xa9c8r=5)twhGN=q`I(T+}nT6C6=Z zIqi2dFyt)g%w!t8VtvAKD^1{}I|gwZoi{JAFt<!Mevy??jkdi5qOS={n@LsWJQ)Qz zIu+13b(ZrG@-w1hJ+i(Pt))-Sm+CL@4)?j@;v#3QqPzu(k7d)1$c-X_gP~<wkiHFS z<Ys+~Vd2cbJrdSwlW0oP$BYPbj)^ZSTbtS(b)D5s#_b$7@?n2{%chXdWi0Np?BK_c ztM)5-WZdVkX~5<v?${}XV6p|ExkQ+oI&*rtDCm$E<CvSaCd-${$NL;{#^9|C<!wnS z;oiH$ANEPyGOIK>=4}{iWkJQ!WQ#kG-Z0|DHvd4>g5GQmF*{s}TgR33El2VyFI`g| z|M`~oEXx08qCMRIYDgLLp4H)Il}z3;*;m{4cyR7>!RjP54#w4u02^!p-rxPJCnlTv z8x%}D#2hlk^X^pwbvlZ;3?$BvYSFIVFW&ZG(bW()3B9qt({*x+sGm}^(LHO)9htg+ z`#e-!KHB=FmRYK)AC8uv`aEzu>BLCLEsVMVYg;|DMqfM~LIdP~wG8>+hbd=@Ix%Lr z54*)XXM#~aV2%eIuXizt2&%Q&6ypsPga<&wrQIaJ_V`x!(fa{W&J%cmvnZ%#!^={r z%2t=!-M3*wuU^xI(A*3>J(BPg?tScgRHaE8Wq1TZl)r`%(e0W!y3F6;1(=XNa8bm; z)5M*0NZ0=8%{>b#ZYz6_mCTaxcNI;t+oW&9k|RW$I-9J(HB;yI3_@2-F)#s^xx5*i zrw(k9F+lV#{1<Xzc~pe^@m&LE0KoQW`>t}Pwa1#ml%JDJH#7YtVufMi6E67FxT~qJ zqwRwb)aEZFbPA}7Km~{9T6D8O2pqJ9G!SfHBv!{{k?*q%;F;0))#^Q?@eNVnyJs;B z6?mjSN%sF7SCe0_kk+r<&EOV_|Mja2<fQzTew9YqfKgF$*M6SWD-epY^LgRqVRuFm zZ%AOFE*~WBHvO$F4iB4<*Kek5v;=p*0AC^9SgQC!9Yz@&wkB}fLI+S&b5WdMJnkA` zBp8RT*1xZ&geOA5Im)(yI+(~khG(9f>%(j}ymEm7i(;od9~;bfJ(+yT>gh>rrop3j zYWw}z*f`gC75<z|Euy(TeM(@8BobYF53)3AM%QJ3*3|rHzNItJ$A!dn%G7X`OvKK` z^>bdPQ<|mZfz2b$$5g3`9{rDZiGG|*&ka4nihB2Q*D*3>0yW9`pFf6HD_!z!g4jPO z6C^3kxQ<=h6!jTWvYz_Kh~A(2mIU5cGjDv?<iahf|Lv;&bz}b@hmZ_p<C*xo<W}3$ zj+-!;>sio2Ewt08>b_WDLL3>)_T_Zs4?A(3epF8s>bN;#!Mw!Uz^U*@c&*5nC}PDu zcZ~3nNLgS=;4s2C?Ae&bq8}`NUy6}<q%CaGeB9S6N+I@mGzXc}z$|56R&=gd5*@4( zqg$61rK3rSqJ$4@E2|wXtEo(g_f5$AFeU8Uc+hO6uIeCV;G*T18QI@)y29T(p2zW4 zx^i14*hbaoWxvw<jiQb!<p*yjM16m-TU)ldPjiBdD$yEQvQJ_4k7W&L%mxL*B0Mm< zh6AGpyF{mprf;xf5NAMGc91=*?3>HPJlO61KOvHFhho^ZdY3HAyvcP9f@#63#-Rl) zL2E+f2UnAVKpGPa4bsEseE)t!*QEReh1hf4yb1yN_BU!JUX7|WfOl`xc&vc12IAT0 zli>NeWY{=d0l8t}H?BQ=v;$*otP5J`JXy97dgMQ+d?9Kyw&V($gXB-s11FzT!$Q8o zQ8j$5XS+71fqO2RIYiBkvY*K3gWitWFbaD(c_zsZ7Nyb@VL523op6Z4(lQ$BdhsX5 z-z6o}r)#AW|6eSC6_bebMX$w4*gHH=<y_8(ws;B;mO+;Gy%Ef-`h+wRM{=A@m>9%G zz~fl~m~WL2cP5kX<Zh?cdz3);@nh8EPg3N|)V$|y(8EnLYnvT|@CE-m!vjw`aE4s7 z(`^E*eJgMBZnM#EEPAO>#*ad{lk@b^bnm&E^~|p4W@CH;bHQ!g*?{B85g#Xrg6k<) z_t!x0c&KS~X7^L;@6@Oe9OrRw(`f-5O)!D&7_l1hG^*A%JDdgRCghL3IH0HduE+GO zm-xoF7<o*Lf4A#wn06-^GSIr;5$f#lzYJRe?^FF7LCnkh&O6Y}C|k7)pe%9u&8;qM z>DW?WRnaekg6a!!|J99MZiKFBd|EcSJaBYJJUaj8U>?$m+Q_m&l&Pwu5lP#D4_?Z( zgkv(-2)t=>n<gKCG%mh2GMMJ)5&hms)n8ZW<ffC^chQv-Cd6O4DXlxUsQtF6NXEC= z&r$OA%UPBY1;M@wGJFW$=!&gjT2p0UEzwvOJzqV0V`D`?<Wy>PaD0zW0@`ItC^%BJ zc=as#`}W;n09>bSDxHJpOlgYJ_AK$IqLd<2o^-TJw~ozhSkJ1Zp!a7Z2VYm%%}aYW zDCO!6YYw-I_2-cHC#+1roo5B#8x;d^N=h|o^iSeKUlbw#e~)HV@Z^`*r4N(taig&F z-QuavPjloSzG%a8eNys8oppK(@qMP_JFDZ{>>)w$GB_$9RG@s$k&X!?Ijx#{4YBQx zf#gLxldpgH{+Q9kcducrf!S+M3|9`8PTL=>eX=za2uIbJd&_0BRcMMzE|f-1NKsa_ zdno#S{t+KqVc_5`q}he>L*;41!vku5i_5W-A&1JYmnB@Sp`Vx^8RtDU$Do$aZ^1V6 zCB0Nzw?&Q`+Tj*fa&!kGl9?Bag7+ES!64^SkeAYhGqd!Up+K?VYVwN}tQH0rq=0=l z(*AO5M&<W+LgaCJwogbaT?UMX1nK6o$uyV;$90pr5fSxg;AayKO_gsqjM<$D89s|e z%zQbOzX4vN@?X`ISJi0N3~F5m$p~r|q;?a2qBJ=^?|-|7)xCX&9AS4)R(=%Z4S$2| z$#65vdgl8^t*P}oE`F5TQYB5~^g4vZa_2ezk|RE)h;@Lj6igc}!@h(wW7PYJ%Sab6 z<R&soW+>{V>6@&@-5BZfvguxb*qDeZB9f$bHV>GLOpJILBc?fJyptN8@FgbBVa%~Y z+`k**4|J4{YnCk!?)X`FaFZ4!Zz8rtauXo@4i`#{f6+48@%4Jw1bGALse4jIu31kr z$L8&<xN94%4=z5>rm9JREh^80s2v~!+?f2qJNF&Mf1-Wqa_bC1|5#s9XB%%2DQD~Q zISzZ|ifx&QZf3iQbu;jwjZnvwQUAL)u@Q9pR;L!yxTQ6w!P}&qnPD<1>qgowwI};> z)xyD|WAK<dl6ctO0^(eo$5V{m`*nxT)cfkzQgW9q&3(atMq~!j?)Td_z2vmQy#M*b zz5>So(aZ5hy=n~)@%8qZ?V+Qoi*nO1hyrbYntpx*l?FWm34iX$=qS#4;DEG@Caj`l ztTE6qn`*-oxq=3bMt)oXbreV3vg8y}JbaaW8r2@JcOf>!t~Evj67f@<lf!J9<yky! z7&jcpgdDbRvM2c%TtK=e^?1KJrd7zwe(VV`<k<n-v{)r=IdzqNTCnwJrTs-yEcmEk z9UiK4c;$-AII%yYjI-fVEyAvZNR4&&zrDyE@&ZG#a(SFk8wRr|Oy4WjWzM?h0;s9l zI{3X3($j&hvrP#lZBf>Zb0_!{J{!nXUrDEZn}9vozjx~DWUO=AHZ*to!jOr)k43Xy z*UQ{4H_PB=`2X*$SMj523y6Pt-561rzHd685C^3K#A4xh;x_Y>S8n2(`!;u#d>JA{ zp}C&~6Sa{JbU-99$r06LqQ>0X^fxQ{%rQ*K-LT^W3ly$aDem~T_+tbM`nhI{QZbAB zy^bj^D7Q>L1BqsE8AK*i5yK+pU8X%A8$YuZq5t40`kj4>%EO)=OufMnYhHB*h9n?R zq!MGBI!-3|a^EfoHACT*MPMJ+A<BANTCwd5{2?hc+9n7Yu1gI}4+qtkbOjUVmh%qW z&p;F9arI-`p%fLG|1d|IzQ;NTSYw?*tUY0!Q@lyBH@XLPe;!3EHmnyF>S0Ek6+8Zg zjv0$73hQj-qZHqCX!mKRks=zu<NH+W?wWsm56AVDu&zACngN_^HyP5L1S&BO_QBAz z^Qh`PMHKDneuC8wn^W)W;&ss>+|TcnF&eGOCk<5fg{W<aj%DcUCpO4qfgV&A%At{Y z_Nd_Kw&R>y9w=tI&mruE=#&O{xON+AKS%fX$EH|9CfyH-zocr5>sP8@RNqfnWRcDi z7Z)!FRFeRE7d6Ns%6e9Kp=bdYHKL;J5aQ=(z3cqHBu)~dZKm#!;CC5D-mJd-YW?&H zn_*@tCGGJ=bR5*71tN^oN=w%ngQh6GvYGR+ZR5Z22lHmSAfm$@N@qUq95M}b?VS39 zSmS5Ldy4p){hE7r$q&Pch1`172vME-gOT(0r$>)TxNp~4PO3iURuHW>CC}`oy)_3d zYbLHagI?X%L~r?FGQ=A;vR?&#T6bAn%~q~ZWaY_|28=dGInu-wa5km$O{eSjeoJMu z$_@Oi@_)1FzjMOwHsnt)b-<036w~~F8LkgZv?LHTu#(rb1sO*F0Jq5qJMfzPqv6ap zc;|DcogVe!<N!!CJxwA3!r`Q(eTNEp5NG*3s(lZamh$@7(P-sYGmKNibhQLn>1Unu zH4Pa;>xl+7djqo?ZgxS4)}<CF`%mS)Du^mxikosS5H-pW5NwkRDbv36IAaI>QHoSw zBji|6joNvL+JsZDwYX{8+xn-AH6s-v==SCjLy#hW?|g^m)V-NJ`gDK-k(7-Xw$jTt zdk538pxUhb+3HBh{Oatcv<simIfTrV5kSxBQvQICi0uqe^qX0AJB8^Euhp$A-ns<y z@uf@{ik+H)bhop!>(CB(dHosdbGI`@*!l2s_WC-2tQ-n^T=O5-_5YS2|D8}PMEe(j zK*t}u6W%8GDYu#?kBLG4_ISh0r)4t&m~l0py|L&uVFr{1C}PnQD{;$R<^K0+^5QT^ z#i9K_^Tdg>7~MXfUbcQ09UPPC)BzKMBVn%n36-i;j5r|OJeN(S&O^?UnUhI0(OjTt zRP$SW)}sX~U6o3Y5BB~82{!pVCnn5W_tsV=4labOkY!JhH8JbQ!#sct<4{d-GH8zP zULbMPH}u7-q4zhcex|H!!3diHbwJU?Yk_5?^rbTl36UReAf$~i<sl5c-v@`~66=p& zO$XECVuF4Th#Z`W9rQV-Bs<2#oq2_>J1*jT(t4i=_J$7<nYEREJA5al9h*~YPf(@q zA*&}?a#pSRPa6vIFJ>^XsqU&0){iAMTW9y<K+TfiASc)`>IquodFxs5Q&UPgT;Z71 zUnMv2$khmh10zqRw+88s>o$A>QE#|?GyZ5gp>PJU<!>|DqutXA8*a+Q3tmW~++f@X z^yR%F5lPZE2ZsZ*{u@y?S|XvTxE|r6Fb(q=d*N37lE^RkA+FWrn~Vj<C0+Sql|Zl( zA6){b{daC8SUr|%@eXgT>nhTEg}jcyY<QfOYmA<aj-FtBjg6hb#;c7>O(dq~PA2Z< zRibkLt7fYvl+~r#mOsC|Osckd3%%M~_<2rZIL+U@3^3hV`|>89hR3H5A3>)#gWh1d zmlc!8n~j&jK}QqMFUHlUY0Un;j~gvo&J&n|?ll|<IV}NZ4Ga^O<`P(q*O%4?9N6G9 zZYIf3k@)G)<G=034|=z`dnOjQ0a)hGGVBm6ULwxdLT9E<?^m4f`>~x@Zk^8~jNYlr zOBMfkomaLJ+o_<aw+)2g!@|Gpx%(CQ6Us6n@NNQhfCJO*;4=PNK-@_n$xC2oxIpb6 zWiBZc)90si19m$Ph{U^o9hDX3$%-Ky{kGBX*HUQNuIo`BU)`UdGOOUss#}W^_+rVM zynSPBw>L_<O63YP^6(E<KFqNWYtAf@)t<->%pswauK?#!^BkjTH&*U2re<9Mh<o3w z3$I6D8#S!eM5z~%iwY^b()Y*JB^re}NoMKb<#xn=Ymy>o$593+qea+5_SpYc+*m1! zv4Yu3nA2oploWvl)l1^=xOH#3$6);c_R}J+2N!85vD@3$3%n1L4B!YqdkI%{V9D1Q zy<JxaPnE5~#L%@31nn~VJ`8-=<A{Q9X%rxOKII>`_1{MPzeNXHKo%&=kL&ds*?I}^ zzT+o$=kX~KOa;Oo`y5)~ofWZL<9k+5@g*P3Xc}FWil5IW<N8y-6vgn&jZy}q2LC;} z6SY;mV+NIaUO5CVSxMCTa3XZ(TC|8M6;o`=)aqI-?PiY1HmfV%aepJ3MYJu3yNetg zDU)f3!AFiv?D$n4t?28I3q{r7aK&&{I{~rpN=(QscG55RdvG4yN>B;K>rmf3vb*pu zu_&YCjDGi`Nf$5UB67ibe#o!N(pOSit-WDltvF`uLLX@ve3tt4(#G_<3=RDYrd!m> zivM_}vddf-25D}&CZ{_BJZ9trwmRd3nleQIzccP@D|%442eXzIkfqEl1T{?T#j&4d zHxbKGKo{MYvz1g|_;VtGU4_e-LIkYHSyCP6b55wH7}}p3thw%!ebNy+$ta2QKR8m# zUmKC=lW}xZT*8x6b%+A+anDJ1XcLtEyRys%X&8o5`b%Caf4z=UfXoeaSe>CjZ~Xzo zW;9NKErp<i8qpcGa&=I_@ot+_rt|V|*QYrCxcp@7h3&=w+}Q9Nkz+78@SQjb3mJah z$i%O?hJxZq-S%_PsX#}Xa(@LnJ-Ro7s^n85Sb3Nq4D2T%U-Ujz7ktGgC(6Fr{d~%3 zApl)gK~S4#C37ckujrR!5BWTM{#Z_tM(R)IUG)7z$k5wvu8Z?DFXQsswU!CGV-o7M zsVz?@eP?3i1j5O+h_}~Ci*w?*Wpd!ppW{U%CSI-ODn7B5U)-Jd5~gQDxC*jn=BD4B zX54)IdtNhm9vC|@Q<8zagDAyaimrc*6cM3nf;db2cN(pD!Vb~iPtE{7du|N}Rep}g zo&WJjyW5EVj?Y;|rvK`JO=EsSnUdf1b!yQS5b&@{w|O2Td=^mbe|4cbfD;?0Nn{DE zl>JnZ$gNFYiXF(2oUKR+A<;<#-!?Sf`L#!n+FgV=BE4S!YbT;aEypiuE*>q~JsJZ< zPW)+@mtiPILO5t`351E$<DniA;2nZmn#j^3*vc}k4B0vfdb{R;t&gMlLzT0wDJpCj z&$aP1os!K7{%r%6YY8&!#!R{Gbf}hEvxzCi3E#;CQhjwih0K+-^;+)iFQs!WGJ^P; zpjxB%R?=#}KYr)$k;weR?X+|QtxM)?9Uiw(vWHIV^c;07;CZi=$V|WW9-u!c-}~3x z$DJJv!`*nl$+CRzojw{~Ljd1rjGJto|J$@WlMsAu;q49ZcCx#>mGyq`Zk=cFC1`WG z$Sm*|JNo&w;j2xaD3yV@M09WC^3Il=OIi%QUxh}~v?v?5_U%f}nOzGM*6dZe%q!e* zT!9}$-hA0yJZ(u+3fw0Q!(v%FsXT_ppg<dRfr6mZZKj74-r+f6mCO-Q<}}2wOr~R3 zI7g|(@&ZX7rl?jHl1%ab>x1kVA^i~XS*jpv4_}GZYCoJ9)j-;%r&eH@T<LyAz~dM( z(B%3J)%}$&OVf$+!47Yhk>$om8_7PRed|7Dry!z_7`qF?$;-$#`+(5}Y!DOGzJTr? zi;Yq-r#gs}dBD3?Gg?#@CCcS%gtULIHlE?>xKlWp{)!|yE|Haus+5=wiq51S@cQRy zwmunoH$J~IDaJODD#4Ug9{7+P_%BBCw0N#Cu)b`}=CFP0o!?{pqkKiWL{V0<D=!0) z8u{2UiDlp9&EymPC}@Ag&sh98v*@>2;-kdgE=T+I+9(|A@O6?TTnd?P;jV*?#dn)2 zNz-3Cr}2LI)fQ7zeyO!v2c$?RIau_)c!UYG9f?K(i(@3y4&XA=XnbTO5XG>=HIPh% z_CXr?CC}72gtFNzyFI}>?SO^!YL@M_17oZg>F>`)h7spd6D!}9AM{7x;}coJ_oaKR z#yhA_Pn|xqqvvh)cFyJ8=$;Q_qxaDII#aJ}lQWK9c~13$9ZfubJ->5G7^S)%Cl1!} z$D6{!>U#88o9jBgCw0At`8sVV9&##9-a1>FnKLFPV}$GQB*8YFC-Uunq?odD%!Ozn zk9(TRE6`syK_DEOvNoIp;(}*x-28ztz#N43IHDc#_nU6l2D^t#e9+7Ll_cN|!{+&n zY4$$@P`4LifZI0F@g;jW8{qG^yvYiaNbjdGMEd_Q_LWg_uF1MUaM$2Yu;3)P1PH-B zxHRqr*8q*XI|SDdf(2>3ad&rjcc-~Mv(H)Q&OUeUn&13jv3TpNs>f;>4h0}K1fb~E zPffd%yGuD%paNx(I2?Y4=-02=?^DZ<_QnaCM&Nf|p5ix_QYNFd_h|7ke!l%2>^Azd zWhB`tX`8Yb{h0M5AqU|{BilWu5AS!`@HHu<sn0!vYvr&IXw=)k?&EVeyU^`YnUi*@ zRM)9Zppl|?nXSC1B$!tzIYN|j#AK4$VEkPu^eqB!(bLGf*bj7TH84NJJ;E44DO#%7 zq$o|BH@v&NXlJ?%lj4D@uBcaJIU<+kdr-rjzF9&s(n0O(J?S?nH)zAsDem0ddTjDg z>%2gzP%?!v3^H%jIz72t6>0S2dW4anY?pW)%@WLkTw91dL(iUFMqK)Kc}|)9XBF;2 zf($kMK-Mc?7aqXRQzu^Eyp}cxfS>dCUadkw7cpB1*n;hs2vzvvW7rQ)i+dK4&(!me zV`LM`WIdW?YCz7;V?d7eevLr&Z~Q7w=p=OiyZY@=PZ54H=dOH2=44W%#CY2!>WpRW zJOLdx%ks_&Pe_O-ew<pppmFu@3G9^wJ&#$NZ!dxPPrN2Sh>gb_cg2dT#cB0KsN#9u zD<m?sbyySSc5)KtHc+WY)PP%DFT*F65cG2s-W~RXO|toy0f}CRyX9^&H*ABCn*<)< z7P?Vq{2HJYG6SLr{rV$RZLA130ZHg0&s}AoSbM1a0agcUwxcb<!u|AO6pE)LtiveW zkRdOLbQX7lH=jG*(>#9pm9R24of{_9BEmvEVt(EINF%g`eLk!MTf*r;EZ?n`lgj8> z-TjG(kVtc4pCMLaa@kR2D_yqevr5C@`(ztut3<na3F0m#8Tqk0V#aeL=5M3axVczK zLxmH`m5G%fkgc7&@PsIeqhL-PF2yh*mU`04f3T;s$naB>0v*00%>RV^<mO6wL9_Ff z2)wmQtLJN_!Wt!L5>W*j2)t5t#4Jrx`q72RGS#0lVj$xX>;ByGXL=4-ghX(A9__d3 zI+N;qXOR$fcAp`@-uDg;UId`bcZSu08Kpbppu>4)Ws|w{*fn(2KK%jFpMqAj2~xs{ zt&C`*<Itu5*rzwXRl=>+2EX^@xVeu&BM#<GCR3#8t?3KDM-0sbxSidMpsv7<t17gb z^t97uR90r^YgdjE8}3jpddgVe<o-P6B!p>={&T~pOHJ_e(CdRe@Z_$o4k(@bfPD0? zP1=v<eD%|MR*S;r>L=-%um8Yl*IWHQy<XamgRylXy)A2pY{u2QRLcs-Zsi>2QxEux zo1_N8cchcALGa?qPH$yrn!;<z;x5-mO0ao(m$Yxn;yr8>LW-CZ9_Dom#KnDQh;|9W z3n{HqrUvmj<!fONOM0IObUqNq!Mi#ys+uXzS<Oca!^LZ;+P=RENcGkFDo%(1HNvh2 z&5nXdI_-pJ<ixl}kwGF`vEIK9^WnhQ7oo8E${OQ^>9PgGwYwjR<YjZ8R9zd2HyCjB zjxl?3Ml5)I_FOmtqr1*db#q5h7;)gB$GT2LK;VNeTGR<i%Yu-vw@B6~gW9rWy-(nT z<x8@r?=3B*C(86%v-??bm1^U^%rXC;#d$6g<|ml&^|1K`{J84&2616gBtDjqVxeU3 z$tnl*AR)vXR7B&ooFk-ML01|ND^$-hr*;l6bciN*A5QlgnmaTBU2`#$OCYGnP#4s@ z{wyi;oeM9`;iBO*H4Ub{Om26GX*hUGs!&oyv3TMNZ<qe9ZV@X-`XNEB;j4(<VI^2O zU3?~$R~!{#!a^OH^%hZW$GFzfK#D^M*MhDKLU6NiP%+}Wl!R?=TekXAErGK+f8#2n z*MRN=Qg~X6YRsW;lob}F{sTOy?LgV}0H?gju>z}Ovw9xeC(}N;!R3T|y#~C<75?$_ zokgF+TOUnz!CdrRT&Pdkz@wYeJ8-o+PBWFw!p7c{!$&+Ag4wnCU6K$1H&#f*L8{jF zrf&Y%i*`J!(GC;Y6i+GK0*&H~dx)QBFygC0Cq{-r?n)Vp>S)Q~9D&R2tux*gx=^10 z3yw4LwFJ4;AUZvWlO}nqtVbJRuV;|jW@a#~4W&_5CSal}=yGugM*^WwASCX2it$L9 zPzO`x`sqfkLqvzr5bfRb_8WtaWI~CH9T;3}Z81<!Uu<AwEDa=++ST|37nbN8`z+bz z!XAn4iv-mL*Si$RG`|zjZ<%|SzTR*w<*Si0umkCfJhtD(o^V*3@Q3T*Zm<2D*}m4E z>h$ZBD~TFDj;p{K{Al1=y4)trTDk}%j(;V};=Xs8cj)B=?gW@~q=?m9)-!L*4#lT? z*I(E$yzVQ^&F#(Ds;4+#s<p4}VvPc+KS{Cz8Fuqc*e3XiM*Ml*f_{Sg(L9VIRe6w# z-S5t$MIQ>-p9gtGZ-Uvc;16T|_9V|KB-gzl7cUg722&b;Rc%bWb)%5y(}<Kk_#n(~ z!v-ko8PBc@nOvMs*>7v}iBRhsBACb7Pt8U<qONODDSdZl(_5(G^!5WkhD|+suNJ** zf>)h?VG1Cy<TGz)w_m(6OjY#5Y)C=6NvfVJRjjd&n6;DSPE(c6u>2<3Sf(>I{!!sY znL3KU**;QV8|i{shqx;-Uo_8t--8z}XUqueaID?u$gfc}V2?lLK|*ymnp_S;-OIp4 zZ7-BY>r9%)bw6yLg}L4$y#DO;l$;;VL7eR7iq1BIw;GFO1Z!ujiY44`lS?(A)(%J! zGi6q0Bd%asQR|XOme#|=&W-~gbdzRu+S+t)Ua9ond0*Lj`v_^XBmd3*pS50P_-qWg zvWWtz*Jt42>;89Lq1Tuq+?>Zq^ePc~rROKz{vHWNla;_wIC359w-`n}XcL9))W`@F z(K-<0miR}~IP*6NM(wroxa=ze34A1Kz&zq9CQ032>^tdFXu;Py8f2LCzq7Gcc$#ve zLF^&l0I4(bb3MLpX0JRc^4WPQC~PUSz0R^F8VE>i?y4HF=S&|tb?X&WfL9s|!LwAA zhaAa9lkFJC!;q0-J(0<oFGCK*kKbsajhd7WK{I;Y<P@gPM0O*fMykq0kOQRuv_^ZZ zyanL!XN?Y@2hRswetzmkbH42vvWPoD{Yt9a*7;^^`$|gHkOv)UYOg~PA_1CnT23PE z8l9jLTg=ajg*gLtkc}qpn+>|iz(crwb<7h`(nx+?VXNu5Hij7{TK&M?WTLIaS0=OD z(#XF2-07RtE8dfY8-s9x2fdiW$+#wZ?Tn{_n+VD<Tc{R4E{TpQUk*%=?^mym{_--( z2ha4hn@$q0e;h~=_y)zZJw*mADSI7-8;Y)oKx7!k*WR%=3r3|C0x)i1AFrA?SMA+{ zpJriQE>@k70cFzq-g2jG+Vi;MHK1;6Yhia}xT=*BAc^gWZ=aJFG}RIIes`9P9qre7 zybUrs9LMSk@!}x`nSJ{`!V00Tw-rTY$@h9Wdy6#|2aj3=*aqNI)akII=pXmX_Dr|k ztJ77I?)5h{Fi7{kF7-_uUEDPx6Vt!<iX+dOixy%=4u*%@A^Pbvy)N{{NRwxSE{@1h zyo+UoY%SboNsPGIV`Gg>nsP~@Z(WRoBMQr)<+b_sKF3>M7b4(&{Wr!50`0h9_e)5- zO4&b|(e(vd4w75o<rYwsY+XtuSTp-Yw>j}EAdIoGBS7gbe+A&O*R+G(PH#>6JF@Yd zu=c7EvEXnXzj?*)N3DI`dVGiT%S1b})+&<xW^Zq@AKy`t34eA~n9VH6$eA(sCvMo9 zJGuoU)f!<`Ctxcseh;61mR1ZZJj!oUIsFNph?My|v$LcgV~-0IimI*?Yv@HDC6iLJ ze|`8pw#_oQfI6u!^ucMAlz<PmLW74XbfR)@s1Y%K3=%x*RhK=wYq6I)FV(zmP&s75 znTZ}Ev7e)V%~=rEpslNMu?LM|B?R9W70@ov&q8+ybb`pM|JDNh3k~;g0j)7i*bfll zhrL(R+gmKwCqj0w@f^3R9R|N+lNXAbR9rfvTzPuC=PDyIX|jOxgBoBdm(kJe{AZo5 z#2TO^NDNb>qz(DtJyqzifN{YqgG&FD6v9|IGrU4&r~U%C6J0jHIM+KuuGdO?uzVQ8 z`cn8ih?^QUD+l4HDD@L)0-U2VB%a^o=DE({_*SxAFK1nVrrzT9)YY3ps~j~0Ew0E4 zNjD#Y3%xP%Lqa*A10p#G0GWJ$T|^UV?fBOD<8DK+OUWi2z_rj1v8H5NI20(RlRei# zVC!0ML0oKufASCFI+vrzT&**ooz)hqNs?!=KXN2&B}&(#xo<uUpD1R0?b-}2PV2BF z4Gm6o<L{d=5v0u50{FehEt<sK&etKE&_t8>-XU-C{0M?=;Y5WAn+l0jy#)EwV-!6j z6*!%EX!IxJr7C@+E+Mz|xwS7}W4CI@IvKw~crrzA^oCV<4L_R)o5E94UA!gtSt$+3 z`B6pgMXpAqYdP7aCW)f^p5KAa$RXr?SNX>vsDmM3e9|X1<x~!RLze>9!vs^HZ0V?j zoLk_yJZ1#{_fpruPJDV3>UTc)8^X)2g9j*{e0zAgY5+8<*T)VVA%b7W{Ml+UcYL?( zvX^qL>vEU%<0AMVmW6jg<T-e??VdTaF)Nv$GNUgSzH-FPES@6eb^VjFP(R{r<qPTa zZpR#CUH5ed_$s>Ux#8a>4)`B!)nBa86TH9vX<w_7>@3$mMF$@Cw0`E`Sl>s`%TUcl zm~ZEA4aN4Sn=?w(;njpr&H6VdyZk;x82p*)4y3<0#=ck6`x;!jZ2NEw#gZi_nJgsJ zDbUBo9yKRCgsO5Ryu0bq)BCZe!{<&LgIaQeS<1B@Y$h;dO(zdSI}o<xoy4t6{uJ*3 z7!`<Dq*<Vn<qkK>Tj-2dySN_Y3U(?u*Y<byd#$ngo;l3GuN;CsRhoL{9p<H)%~Qu^ z?Jwpe@a{Xq`+Tz>*BZoiSM0-9p287Vxv21XB~7ePx%T>3YZY<`+U;vzHN@zSWggAY z_~`>VbfdWMeTfUWU?Q1{yvBf&+lz$<7cSChLt~z$6XWUz=eyG~DEicc1-#$UGziC2 z3;)|J@o!5{3Cn-P_`^N#Yu^qSvPN$Y0q{f5EWlLlkPkA6baO?p)8W1CWagpPe2&9m zs-k!E2=fF(EY-Hw6iUveBNeoo26!RC_UR4#$6M4nxC2MpG)i3cMUz%P$b!{=f6yNF zSCeN!qM_-P37)dtSz~%v@STlIz_^ulMKvhOSy9aNbr<8RAez{qvEu8pd)#BBvE;4& zuP*^vZ_Td+R{4$H)#{L}T^ej^0HaWqH^CeI*zqSzGwGJnTQG4VRjX{xbBnuRPsB~{ z3k24IYJVB?CphIak{sLT!NIx|3`J{PVGMp_vAl#Yz8a$$<JHqSQj}@Rix0JHa*TJE zDRxG&UlO^`fi{!xHgvTETigz=$bG#DMriP;pa(f|(?XExge<xRJ<it^vapyu>HXhh zJ?t^?`*%wX)8l2~o*da}%Vi?I3+&%imIKYo2zyTa2s2QwwVz*=k;rEI@*7WXGt55* zNW^Fn^7CAr8ttntL-+&pAWJp{^LdDp(+}CS9Wvp#aU&s}vLOV8I=B#|7Kual5=o}X zgBT@*Rnt$X^WvQwfsH`~Uj|ZcnaZ=1tJC<J=1=X&x8`nO*&ZKhob6S2=iTc*Z9oGc z9sDM?=EzU&hvR8s@F+ci`qxjbXZzjQt6Z(kHV$4`#cymU?m-qQR4{8gvF$g)nOM{< zX1#JXN^36AG>{|qRnW*izq6ygSJUC?))Po@>36Yt<QZS>>q{x8<-#YHwd!<028hsH zq;@T%eX70=@y6Y{7wzhHwkgEi-ee>2BVy^r87{Kxu-912<qUfZ<gV?Zm(us?(+>fB zO01XIe|eMbPpJOAOSorc)^$XGp-WT9xjSb)4_ke)zUY_^di@=+zMyii2hbG!Av^vF zb6jiQR&2zuAmgql7{4y}>0=G#(Eaf_Gm*B=>CGcRumGPYxP|{{QY^w-ORier=O2?t zGl}2E8-;Fn<!Qf|LqC6z$;=j%SsH}@ypw4s6TpRL_MY8V#fCY)X<5RTp*iASr_#>d zaL~I`=H>|hA`F#|wHkdvj6nQD1Y8o_(2OheH};03Fx!;_hG;iYK##|C#vh^ln@{b# zfX5+zd2_Ukt%c>)*5Wy*x}e>ysUdM-U|ZYDw>g*QtOsL%k@j5p*j_b3)YUVmhj68q z=SewspIz>pM)xy=aslE0KtA=?9Fb1N;d2DIdA$*BeJ*=-ZS9`AI6ZjwgKH0MkqDol zPB$DHLwc}2W+gIv@775H2Ws16D1fNW&Lg5vrj-)Oq3Q}f0&=@XS&(8epUwE<nTeM) z43-VPbYN1$y!~yd&8Blz5EkDM7I%>udt{O3NHZ%}|A$}(4nuRasnFtSWAmj%?B#|# zc0z9E9ih58OKi%jrtY0lSipb=Cu;Z=T{5#EwkMcqgmiM#+JK?I+J~CMR`TVhYLN*K zrG+6*QY|I#GU9kG$~P{>a@Dn)y%@sf)efH)h}v@u@K$wbU?hFT9A>qCZqB|#J%l<6 zN_umdV36BAHn>vqLv}c7=DM>0-tl+T(d!s1kASy5S_RQl-)F}vXv!`RP(HMp;u>m= z3A(Vf6Pa#avKJEs*S>im|J56U&>0^3DWdS_Tk!e&%vwD|p}Zhv7KX&HEc==k<|s~s zGN`LbS4nN`YXh^YbO$?%;Zdxq?QeZm+KiNK%kmx<(k?y?6pNdD;Qm}MDYBEJ$48f# zdpnOMH($6rj+VtjO!=u&)h&$N8^usA<ko_a5wZRlO%U=9%Xc4Jm&DjT?rWPY9LLh> z!flhs1X5_d;oc?&^sn=`Z`f_DVieI^%_+&foa}j1pe%BjW-<qj90riRO)}hP5xe`y zOU`?5fVH$bap`N}@S#<R2haF5Ka$<|V9U}5>ugNvTiOEJE}6WccSrO}Dq$0>D2IjU z6o1cXhgTahZNZMUZ9Q!b@5iBd;x;?}_La8um~oVO^fA^s(3=$YHYESO-fM>401xo# zxN3mi*!m$;!%f=)S=#AEG~o3X1bCfUd!8n2lUMuocRpj?C*1FqJ>t&HUnl9Gm3`(3 zuQ#;Dt3R~nt32$Rbseel>XtG5R3}?#mTpfYAg_+V&Nh<pd!@04?TXjVuCV_zIy>4C zFRF0XA%%L^h~0vO^K3oWg2rfV9K8aKf$2dAb7|(=<c|0ixkowkYPH3*eGXrtB5(5` znagU4UraN6aas~dK)L2l;&+jHzg#M~VvVdnkdued965uc^clauMHA8WjMyvTAqddT zYf?6KhKuIoE$vC0qBbsHiInG{OQwgvmi!|V-e+8WJmF(!QKM5iQAH?tbVCv{|6|Ni zbG~gHo5*C|^JzjGWOL>~n-jf&&W1$wXrPClA~%H5%j$6N{jj4+A>w_%Xj6G|Hs`D5 zuXmvFpJ*YW#q4k4*S>B4`n<^wUV5E)ZL2G<ls#k@?o+~gGR&cTx#Nc^lxKQ7_QDOD zJNmYrQIr?o@-pw$Pz5_Uv;ul?JIM#vYWQo^yPnStH@^&%8pB$~-~GW$6hWH{u&^&g zA1w2n_(g&c-5ng;yC03}xZ&$HPgwS?c2jcpCPgV2%C&p6POp9KghW`OrX*!L#98De zy;Wc5(D^aaa3dyDTErY+7jbu_q!&+R0T5l_8eQ5>$(ZJuUQ-`HXE?OYM4>y;t}B%% z*}g2??A%QRS&JAye*3~7GrIc$YvPy3Mfe*(cw`k|M@T+7vK1vOux~f*CwLxIj^5YH zGI$H_hV9LJ?R+=4SJN|~9UdwTy(m2?d*P_`DWevr0{cWyC=j|ccazb^_~YUy1fL33 zy@$Xh_{ul&;5=0EJ-I0!5ECIM#@ZrSv8L)*N1%m^l6dBHSlWJjr(o4*^(i6teMX#v zrbJGNPIoeHj9ehsNVw>>6qdY)^sKvB4`X_h7Qls~y<eb5@hiP&mnF0FAf2*YvaSEh ztX{Ql)8><kCBX8T)Ivf=*$%R{7B{Yr(neKMTlJ3GLWc9ad|f;r&HgN;<Bh^LiY`<P zKi#@z*`9m982RIU&@z4usNRSzyNKp}J}RXxE0Tx3$+u3jNAhOpZAIV^lAB2ET<*;( zMM3=8zCj5V&)LZ7v$@40H&i+W^({PgMedF8Tegq=hz#sVPgi&?cv>2<omx2~vo8+q z;%{3wC+9x;@sSw@Ot|JQ;p}8QYhiA03<aQYeMr`P&}y<su8~AmxJxRQ2^8nb$=zSc z{xGl`Rfn>lNnAMt9xhXTk3i5l&)en|JNZcNZx7WYhxQ!(TT#mx&h+J9bG0n8E$@%S zM9}y(;q)3+H-RU(f&UF==FZMUYt?>?7BS+M)oP_H_O{7O&k#v=g8YUJT!jm9NaD$) zj%IZBEu+P{9KsTdIE2PHIt;DM(zBZSS@Gr(PyZcj;aPwahHJ6aiLJ~+inhgI>2r`G z*B5FMPL%o-&!4NC4HRVXDp)@`RNUscwwipNt8I3A*%uU4xXQfi><<5|9+mvr8TLwe zJ|J}V!}-9b>asZq|E!Lad%S5_SMLtG^AfHCR!^O{guOxcI$Q93y)8E(!j!^$PUtlJ zaL@=4hEce`KK2&K!bGIKm*9(9ZSlP72*hf=-;AsTLz*squSz0fnExZELi?12VY9*Y z>mgKIbzd{E_T0GOEJy1hpW`9+oCKsQlvp)JQhKwX9v5~;YRUE9?=X+iltS8ran|UT z9cyFa`Lg6^I_^Q@8(vkZg%y(5S;B6(&3Apq<!KpVkE$*T%vtrs<VO8N5mG%xf*rH5 zkKK*&+|`Fw4xFME0J?MyXt&LK_0mtD_*#GLhbvQRMpcxjLw=LrDPHIqb@&rSbwX{y z+ylJLD-s&%s=6HlYUU`+>?<vvO#GlLEYlDDw=T_Zs3jGS4a<+euLAlcKC4kqLkK6r zU(n{oF3b+uU0+;37%pLW*v54Bg7;Iycpd%30xk!vAZ>aE@KQB02Vv|h@mT!$a;-ML zf#w{`hb&7YW~xhn)-A`A2}9|FwX(10jdO+Xw|~RRq&D6RaMvDvt?Pe4Q77Tb2TNyj zgqWVHae4~H0y&ty=5I<#@4M-Cw`32_3~>e6aj<p_h}bZio(mOz=O6`1E$9}VImN-c zSZxc}1e|s7GTpXj_m*lE$`m+uqRZr_l=Z*IXojz+%({bKA>WxMd37=bBBea{xjU@n zIU{SU=DaypHayp{Lc-l2pX<t7K{!YydEHcUZ0VS;Gu5v>alL|bb?|HUC@zzSVFCQ~ z=kYEuVQO1P=^_Jb_|Mr{za9mh`yqB((jVW(-kQ4)pP$~_oqxA??_Gyk<18o`+3vN4 zL1b&A0bL>7w}ZYHys0@>2w_jF`Peo<Vb^5%z$W<g<HW&OBk3b!OIZDfNVKc{?&Gbe zZ-yHCA#XfoU?`%?U%Evw%>no9U#fO!SWutLzwe!s0xwV4A%~<n(<$Jc>q8*Hzv%5n zkdgJyRwA+BjCBhB*@u<LVO<_i0GYyGPYMo`0fyi2AGliXdo!C`jm|!Lwt8<p6}zt5 zvjJH&yUDtn#2lrHbmsfn9UBBWaKt#%1C{9HnLXd6uhWEboYnlyvM1T8ODvc*kdCq_ z|F*wkRfd5~k$`j3UU4&sr(mJ<0*}|3GNAqElFi{A2O|yNxAGiKgVw6edzXx0*OP>7 zWh-F>P0(?*dc_TltJLYw_L@5G60Q5{fq0`0Nk#_Tc)Jm*@4MPBaF&?w--zdtC=G>- z^D$T(Do1P7>S^%KIWAMi+;@6RP$m$w<uOd5F^=s;j=XJIKiRq(TJYv1+2pD5={TpQ zeAo{aecsRnyd1AI-%0=c`>^tF{Ryi$@TiAp0AGts5YVU;tVK+(ie2x)4e-N^r#TxJ zd51w=zFH+R^pZ8qn69?p&h5D_6}_keH0qY`;h6^P&)r9)Ja#N7Bi7k*$X0tG$kEB{ zl82y7o1oU;>~M*7T*Xn2gx=x}+~dg6FO4%-j}!iy!9hOwvtzj`tJp5Xjbf7IG<;Mj zj&^C?8ZUnKE(Lh<(@@dOV<}0Ic>_uuRkXgHa(m}O8QQ&!fKogedHAWiJewN*C%8H% z1y_;9e4FQc|7^DP9x0Nn)gwxrx*H0)%df)@3U7h-GfCGp`YP{<MM9Rfv`0CK$QysN z=S_uHp#Gl3&<S&xE?d0caBrw&N)W<q>k$@8kTr_(!C*!Yx6#2%)90V@u5*VhXu=`~ zoB;vQfc`Av#gA@s+diO<JKcTi$i0dK{YqbF>k$&ov3?7aM+0$~p=zz{%W)6SXnpE1 zM)X0OX{)bQnB>2h6sj5ZC{!QYmO&WTRzI;*rkHy-6V$R_wztCCl2_cTwOG}Ia}2&L zQ2tWiX2ZEvH;}d)Tev*n7L@^t=0X;mkS$HadD-62izoQpFtR}=gXyn)eemKOH&BK2 znJKJ6E9XXH*FF_3B(%JY0e{di9VB5w=sAB*Jh`h?1?Rc7)a_b6N3y>s%THO-zoIUI z;SaLpXwfG>wTl^nKiliI&#Pni0JpO0U<D!yEm9h+9z@?YlX}bL*PJPE3+l0-+ud{T zZacK>v+$@{+lVgRTA2IWcO);cDOlLezH#Q{O;oFibt*}L5$a1_UuJo`iyP}J*6=~i zMZjGW8kLDgXWjdjpN43D2z=kmYw(g>34FP$g-WTi|1PCMLh!d~@xKuBmp}T8qh+Fo zsaV`f1hI`##)jNG)|{&=1LZi`p~w81F6ooha!I8d<lqnOX<=ja#5vK4$wMm===n9} z_pZvhTLu}?-b;URTQthfk5nbPl%%dSO8;1a#nX+zTqpQ_PJ;IvGIJ4o(y+BwA=Wq1 zUdsli-<jR0s^jf8xtr?on)rHMFvOmFnOAY5lJLBWUlBp8$KH+nLs_HAw6lZw%2#xz zX`C3`Yzw2=E#i6ly=Faj6*$3CgA0h(nAJ<^#DXq{9>;+1=oIYrxtELZvb9Ysqoxtf zogd70Ck`GU6u!sRL|^hPUzg6X=xY{Cqn3KJ>Yj{(V||WIuqZ{IpZ5S$=HS!M<NvBi z`L`@>OCoa8^xB!C@8up3me7zy6xC`%5LTcHSH~rC%9k`*{Nr<KVMe-N6S#4F-RI}d zUvQpyPan}}i^Y1U0r651>bZXW>BbzrPDJ@|27R)e93~RLQ|^KpW#jVUSfVmhAvL&Y z)JzLmZgnnnGdzPFmxDn83W3Wc{$P1aCn|w4EgV1M;3(a^w+#ixLkVR%(yBQeoVr-y z#+qM;wlghW5knfe`9)d}2g1X99#V<wzk6{!+7^@jA+zE!??i<a<9%n}=uNp@Px=H3 z0%1rH`8Qm!TehZsHjQDeff9&_j(*g6tKez)hF(ZfFIWp5DKOHqectGoZpfI1@ajeu z9#c#v7OMW<55>Y>rWpK5ilr>G_^$V8?e{xqnbY@ogE8D8c5$&I&Kg!iCZc1XCYiG| zWHps$EevUrcn4;r=+7yr^gNM|jdl~pMx>j&-7m*w7bHGv$0X_YdJe|2-%ZqCa$x|n zrR1mSjN)L(HN>Bi)ml}x;}N3~QwOPBG8xoATi5O|q%Kny)Dco%Vu{>uu=u3HDKkTI z7UR~TB7-ZEjMFi%#{yRjDG#+!J*NmF<z7;6Jy0-x#_D3~_mF5I{~ahT?HDHJ^4Rm% z$A>yJh$17urRkKEpb)ThL+F?_dNH}YNOTRqda8>Oa_ahhj1@~Ta%*S3odt8`*`cl- zv{(MX4-G~9arM18wz6l((5+dp%>vQ=e2IXxCY#m%b~gpa_U(^_=Uvl3zNQb&QfS=d z^RsPN@h^6f{0%KO&H@~A$QMC`tK2nNixU(7&^eP8(WbJ-2S6_f_s;s4?q{_AKmy)j zwcRvU`kpw0A*6Ml6L0>;L$1FGX|HK(yo3$Z98&)WXPZmx&+7FxyXE6C;F^8x^T~_P zh7N1|QN&Zm%D3uS=7S)dPg}pa&$e}|sRh}E%t3!ViDn8c>Sg|1X1jtD%O)*4X{+R; zr0Z%mcbdoQUD;N`6^)6dF6lIxc`|JsIe#){o+YR`Qs7*n=Dp~iGKybf|1^!Pq#vVq zf45q;E}AK+`^TFiXot@t8e#f*&b)PEdUSw(GQkl4FhWw3$3<(&=F4&7JEpx9PRvQR zE2no1J%-w)YHX)j?Bi#11FTPTohMw5h!%u_6a8-2Jva{~C%K|zO2s7>gpoa$>xMv{ z9NM#-r|mIeC`MX0XP~)iZ;tCK{kO&9-+)`$#Q*RE7M$rnuL~wp0@o0WEFL{WG07Ej zJ*Kb+Jn?PlJ+6K^4Wg(ML^-jr6cvW_$Gw!4f|X4dDQbwTf8oW!m{2eU5I)v^{aPW_ zbKIdNz92Rlsl|k7KA0jruGmr+()f<c1_xe}+}3fY!I561v%~V&VHC=DE&HKHr6gh{ zVp|zrywvB&os!=q4Ap~;0sx83b)nw{dI3S!T5|g8!}SWvlQJ_i*^f3;c}Wcml>mU2 zR{5>>C9FJDf?1~XM@-^+<>K`1hI+tClTyyj9NL4HxM}>KX3{4@1G`sOslCM_^i0i9 z=nKY2)xZhZd&}btm}ZgoZdehm%J1rDfGVI^Fq~kN*Q+X?A@e9h8p=)rqflUCgpgnC z6I;;?+2veNa{Voh(Dihtxh}>6KX6x<VS&d$e2jsS{;N({j(R<->Vo8s&J<=?YN-%* zVw<Jf<3-f;2PO+p^hY%@waYS3OS9xr4#t*fUX{MPF4T{Cyx@o2XlF50{CCnJn30Mt zn3m8eEV8tx>>avNRPUN5H6%M5yB`37s7^5$hT)r{F2h@Xf08GVTR02r{+}3XY_E&n zA^qTTq$X7(EPHR_alo_XRwVE3$`3cJV_vn3fRDF1O9F5XeO%x9k6GtB=i2u10+^R` z5XVDzCuYf-B$R>i{rY?znqz~$TPyR|-zouG*((Q8`g3asVit}KS?-8|Tc^he&JaT| zaP689y7a2Xf@+$xI#{{8eCOo9AKhSlc+mfi-q2R!5iwMMx-vR4(K|2Fj=kw%=leMC z@`*V6$7$#B*szP~sOGM%^%C4xIN$V{fap9qGd^&D^=^a#d>#C{O}gg2Md|ajj!b6e z^LI}=r3?JFE)}KA*IM6y7I-!a+?EO$=y<z-!aMQAi^&K*X-$85H2x;>tUMC68aQ`3 z*DOP5laxTBrj&nD7e(~h(*9k~@65V8ykyIvJ52-HV8jk}aotH{3^y9#U7PEx`Hz+r zYxd@l14Tobx!<F~QQ<);pg0|LL6V<K?CYt+f4F2j{s{Zjk>k;-^>y8fAbtJFuc#!G zr~W0@=J!tWbt34!_c{948|_d{A-gLEC5%qf#T|9p^7T}}5~y&cTL_1Uf=-v_F=Ny_ ze9a%<z{0}E!3#Ec3(nn<pogNNjp~IhwG6c88zrGflv;MP((Dd|>;WM~sRmv<$(ry| z%&PzRdi~q6`G0=4p7kj=7XmpKOym_lWEbsF68sGR$%~H;<>Z{v>{Ja-I(^$;XFc;{ zwO=AhKnxVV`ux)4v3#HE8K^~qN)%3gH%W^=N8iB(D?Vx$vAjQ|b}h%Jl+KIpN|d1! z01+cgO6}$nyK?L?B(`_N+@>~BWuntKm!{6<8f7JzRx*%>2}w`WbQ`Kx9qrN)66PH1 z6<_=`A^jrxwk~MJAAwpuBuArhElrek#}iC_-@N^a+6@$U$mFd)nlTTy>xw`(8imoL z=j;6CTJ3O>EhEk9I9Cl9IPeEJ!~;g!e?&WEuK^Cxx39xc;tTtV-E2bJ?_Kd}tf7bz z5_^6M^^bso*{@V;6O#^$IC^6lLOW#hLmQ{JW2XnxE6zje%|lvp&!l>)5KV8A!j8K- z^eLo*0RF>-2u989)3lBB!Nx~Dx(}NN$i#V?!2-9L($ox!{G|g^49@6Z2dNq2RnPSw z1d=nQe~qfh@)LC$k;T|qg%Mbb=@0nZ8TJ#H1w_zm>?^KqlEgY4+uJsz(!SZ+Aq*?w zJE)RP&ant!ydT2eb=jaNeT}te#Csw{r3>XEYNdfUJQWXxT)PX-Ckgx6iSV^-{Js!J zTiX-Zh0IR+Q6KPoak!mFBjA1RqW(FWr7kHD^7N#Lgh~_~+FX41><0X}<kAe{4Mf^K zK7Fo5^F1?nGA-s!DOfU(s+6>yc)EMod5G4g4D~2jJ3~)75%_N{0BhjHfpIP8o1p`8 z){*1x+;>$6KU#~l<%boj5-w^9C$lpkrNkpp`d=S-;VZ<mr^^k!2xE3WPf-OUMfBne zi@~C7R%w$Gy1N5-oLqaU1fHb=@4$<Kxf%K!kAHuzBJ;?44{OVmw)3@Kf0Zx{EcOi4 zX{2!dgaE7Mf~O38s4y7Fy83oClS-1X-Nc1HEi7R9=$2OkIHsTdkU<+kAfD#Xe;B=$ zY!dsyBe)LnKKx9j<PW{4#Eh><3)ffA+A3akhHiUgX03bYlaL<_%YT?mlpe+d{P*&| zh*seCllCy-;|^l>CYSI?hC}pFB`FN!xI|{MEoWu-iwL(t5*t;u(;BI!<)%M6znSe> z#L4}VbgW(cT33&by)cF9pEpxDd6eu|YvaSGS(e<|5$y;OgFhZKcm75a#nv`8aJ}iY zp6Px(@M(X(>%`#$1*TL<3E^zZly>DDJNOxz`Q&?BlY;=u*Dr<juZY3_6z|{b+XD&b z{3jS_M7hB51;#G^?aBC-&@Gcks+D=D!X~*dJ)^^^jk(J|IN)sRD_?4pOKQ$dOB^Oc zx{&1|cv_ITB$|9mWd{P^he1tzapfUA+Qb4J*T%OELX3w5eYgn42}<{j-2*}^9@2|0 zoh>MD7fGOMf@KM_=v^j+{=}iUa2+@Y<FRTwj?x)btToFYn%EsB`_a&huVCedt*Eiw zirw%E(&Kgr26rSaTEcr`6kjg6nRquG=gKdumvz4ip}Ce|Ne9mvM+#hU{i#BnYYaC$ zF1W*f0k&cPMfVR7i}1*2XsDBP8o&}8NF3~A9J&$5*FIX{LttBL^Jd03R&OGmy9+d< zc-wds`u<$UKr-q5+uK4Wj_@<)7*+m~ZOw2;0@4V;6CEFKT?^eIJ3_&gMy5}WVWW*X znef)<%$QGWhgFp<(``l?oGg;^v|le{Y#vn#^^bzLdf|<8+QP|Qt%5qaEK;6)H*+@` z%O(`_wu13?hk8c#j^D$l#~CF%KNR9fgOTM5YB3&PIt#5&hG40B2BPiGkr;x`JEx=s zlmo{Fob02xs?)ZQ;UBvPgW;dnuiZ|7cRc2l!>funXgE|bfen$OLt;CUSF1?9%f)&E z2uMVPho`;AIPZx#=MaJ75;-)>$7#)quu(cvFm3j1l*d`Dn&&QVKwl@rxA*zS83Y0_ zl<6J9-0hgFP$;_VV271kBuL!CrwVRuPF`^YPH#=EMmrrNt=aMx`T<B!uN?6*evGpn z-YSJU_TRSpSeSEib(J@!rSJ6SzJrelME%0?P8zB8>-p);@a-y;T1o^y_W&Mt8NlZ| zmzh(q{|jpU<nMQ1X(uW5*Ce@KN(EI<v5zWIh<Zgb*&%ODELnrKcGqU`!rUls6p6}9 zuvQ*BKfCmCFoT?O*6%+ezDvDC_1jiUkhJ>9#sGhpi>HXU$*0GNQWj(HsT)bs!beqZ zgGNICj*=lIpUy1&+GfadP^+Si0#-C!SM+J}ix6&Bb`sU4)u8k*wgl~6MzRHsVGR6P zmx_2b;Os^wHLEJ&HR)#qph;xkX)*|D$lCm%ZDv4uc4pF3VMO8m>BcwSr3&4tHT=85 z@}~vcaN>iTrrU^#y4X0sKD1l*;Nr;bfdOKjCmn`SyqCR8CyuNUj?am829?m=c#HD; z{W)})URs(0JF%+%uW#G`yMF!MvHq`k4N(YMU@%Vc4UMER?D!+%$raDMKc*UD0J+HZ zi}Fh~N@bC0NX6$DGdD6;Xz;N_ydo27wJ+Teblpj0E9Tvm?-hWg$B`)@-HhO1&PbyD z2$r2}Bpr)=R3S;;`b8?gs4-VHp2AMeok0wB4SlBF!mcM?W%nHYu_u-FdM-o<(#(T& zPO2W7hQeZE)R0*(U3~z^5%9VyhKdAlF>u_pNWR}XSOu$pihUt9@7RTXnqzoTy=QbP z|AM5llX*_JTop?m=R2`N_`xve<tPJ&GIqo<`tc~ymvkQ7-@%rL=I}(bTW@wvA~HoR zHwe2_{K1=237;)To?j<;{#~_Oo32%zzwlmIwxdUA!WiAIXj7n1-tb%gK9>>s?q_VN zp{J-T^lP+Wm&@Nu%vL?9cuj_Vc~=AzKkGJ$CI;e|G|(APUp}Z}`bd0;DtCGx?IWQY z^NviqcNrtmZlC&)LvN_>Jrx@V9-5mF$>*SD4Q;M@nP{uVObY_yThlJ$I1IZ$aG|64 zI4?rQvB!oE)<>cQ)*LoStZ@4qinqaVk5?3LU)f-`?hI`{%_2AxemROJFJU=HUX7=H z33!RTLnC+Y%M!9Ij6CQ9vtW|N5_7@xFQ-Weh1b=y=<>n!%>Rkn+wHGI5aAe8Qp)Du zV_(i#<x1rZWdM!rSDA3Ht@UXx9(y{+^n%@o*Nf9B6rZ4p?Yg!C4s{=<xVg2{9)cH~ z$$eNWJ&l|2YDj)yWIO~A2-Ui*AB?+jqGFyeKYLgoeKJNHoO4C{q8*oacjh)``;7v! zD0=^*34E}r^xfjMMfrccOB8<#hh|CCGOmBNToGwx<)O8qp{WaH%ZKJzQicWs6MGH< zkc!V?@u%ANspOl~=Hv;o)fi`;7T;87twJUrzmU~B(yOQw;MU1}Bh3oJH}_Lt#bvhb z`qR0EyWOjtC(gBD+~n;;{WDtkS@fEWTxz@@LL;aYH_XGcIkh9ZD}Gay^BEH*QcF)Z zf*a}7t&f_G5O?lFy;sq5FLC(l?=C|>JXW_1VVOi_KGzZjBI;Bb8#6c6tLz;ZP16J0 zB)Y<=pynq3N4ZRc5^&boMOn-(UaQVh^Xe9-?<vvKj}Dl-?~ysu^9|HP*sB3zEyA8r zn1@pvmZq@B?HjureWH+wSYP}WKvRCP-+%5gI75abxVeM6@=@mB8Q;+ed>W?8r6zeN z4ojy@i$Z!y9bzdNqK9DZ%W^4!dy8k$ISp_NR?k+Xz8MJm>|Y>R=+{P68%MwtmN#B* z7~ILFt3u&SFZr=Ti(;hLOm~#EE{Z{LZ1+siUV2h3x~#av6z&8SzZvq_Q@qLZ*}cpE z#I=zC_BU#LF>|=;L756QTc|wuGyv>PUFvqc#uJX<x2^E&cTnbMOS6qcZNZ$I<oyq4 zbH5&C3ctT@dTGbC8{gWytqA_+<a32(qJw9_aEt}aA>A7qe#1E<gg2B!|FQ-6?Y|X` z;BfdtdhUC|ZqnS8X8g8TnSz(OJ7n(C!Lq{Mo$S&|w$rI%WBPl>0ncNx{i(YdK~D(- z<3@T3bIFDofj6VEPnlnBq*R>sP4^&C3Vylz^Fidhbd*Xa?kF}QZhMofugLu`3<=#< zIAsOc$-1BK6vag|?G>F;;I$F_pH)`xgma(Rz+5UsS6`{qKX`=MRu@J3Qk7JIiQak6 z^tOkhEF^q6XJ{7HHN{fUTW<V%ygstpX#Gs;cWZ@)=h2%wFni%ju0ZIr{-dH1VZOsz zN;A8_nSEPV5Pp)~?Hhlcu4T@;c@@Y)38iHN7JoB+D)fD!16IpYx+g`DQ5uWa(~rQ> zOAle+Qs>L(-Rp;mhpe6+6$`{Bs6_3Qb?*BR3K19@ZgsXb@{@PP_R)NTw<b7UKLeBE z(&>2jX8AhA{EfzW_i&%N9}k$jx#o+4;d4IL`7C;IaZUB12M#9*G0wTP1K5NDlEvNz zv9WKt2wfB5gKO0OyL!@(CQgE?g(+cbhV!re&Yv8|ffY!Zli5<Y((s+I;p5h~W_bLM zO+(u&YvLxVub`yXpNcbFG{Pr*Oi}bC?IGp?lw!4bHoWNm*ZZfIzl!;Q09AZk&*VwE zX6c#msYmf=L~s5WpkQ5Ff43t4HwDcI6k^z&NrDe_Dn%d(|8mc&QkDRngc99&$NcNf zS_j!|)U)~w1e7GLkTn69%1aX!Sp5U~KT%on1=0ozpLCV_Be3fc1&0BwE+3^nl$XEU zpQ9>kGE_8|$XC`ncSxickCX*;8=!225Vg-^hHjCDHtg5}_%h{>*_E=h^^KdsV33aX zOHb!2{Ha?rLo7ug1v(ztH=d;)r;E#>N+Iw2>N$h&`kr7+@&APc{7riLUl4SAGv<Fq z;Xsz@rLJLf8c30S5LWN3TK$o@`kdt3Y0N>8nAariJ#0EW6=3=unvzI*T$+7t06xyP z^%(68W7y7QV!xa%`)4j_tUD&%+w;qJUTla<H$5XB{pc!TUxGC}1&Y2#JB6_<l1(=% zh=_+I%DEXV?nx2DI^OWBW9mN0T>8>)eh+y><6CC_CHX1HoX|rui3<JE{>hr)a$%oo zEDkWk=0waYAqxAHs!?oby-lacMfFB%Aqegae+4%?ZXKPDpRVGl((YOA7(fHPNKk3> z`n}fR8XBqM=oe1@C7QZgX}T&PQG=fS&kAZ5M{CH|c3)FR1&J@OGO&z!^TAfX|0A=3 z9h)tjQi^Ebj{Qj)!Az#;&cK-Gdex(;KI<-~#>fG`MYYazN9lpbdSAu|emzdNT#8Uj zz?aEcrNB;U#l&5<_kZxl=&Ng!K(hRY-K12*8OO}X_@Ra<C)fkpA7X?3=``Xv-kau? z2M#F3a#<X*N57p00AfcBKRMYxj5z}E#K}|v0F7eu47#;Ak=FH_N#c-3I!&~i`WH`D zBq9u7d%jaPzIJ7XH5hC%LuKF@=@m>tg&c>lEdoiEPx-K$Nsg?fKve)-Sg!}|^lbg} z$@0qTK04;eW;+WOD00ahO8;Dh4i_{>swo5Q?fd$&m@;6xRNQ%ld8VKdhokhg+%5C- zZEdGWEE?Q>5QLt&8Bi8<wLcgep5%G{NQw;GH5t{r>ur)EH|4w%Ie|z7aAzcX?QADS z$xr0ef%u+KLO|f_k+qlURIoV0{{L1Fk>Ge-E(t|be--=3Fzk;-23Nmxwqy?-hrbl$ z@32>I-Fj{4&qruk$T*@*vWGO?rYMIPOJR5E2HfdJ2{KH&^iK{lOR&16H-6_nNOjF2 zO=YdA>!&Z}XnYh>ibf7qDgF7=?R#b2Z{9Xq3IRuM-K}jNL$eLGtOjL_M@10&y7CBd zm5mMlo{sF|h+;3S83BwL-ur~1oixQV5!DCe7SB)xCY{)iHtqTr%Bde~FTU=E0t{Ks z1_){HZ9m4V2cOWljkEg<RjD3Q=(*Oh`X=PYImBa3K*JHxOBdL8s<j%-!3`HJ%o=aj z-Fb5Iyrg@#7EB{Z!IC9_IX4d|N5qcQ^<c|M7LA38x$FGY9Jl_`1{G>7o`D2NU6lSa zta;T3*;e!F3hKY@0KZtk-J}x3C)JM~^!Pd;XK8hcAD`EVwvdsZbqnMp>HJ|EkvwFd z+NcV^ui<^unfGaWIm4Afk5`JV+MH!WCS?;<L`HP0uQxei<C7<r=h$&!v<@jbUlbZ) zUQON*0r<-p@u7X&v#Djp@<|~swvEwLlKQNXXNp{8K5=NYnUjX`s9h5TmDngaNo0OP z%jB1<-%dfv=a=Y&<N{tfcRez9%&zr{JA1~$abMka1F=e{CO>jYPlNKl7-y<K0WYzL zN~q=-Pv30DKxr>%hiC1}P$g~{B<l0y4QO4Q`Y7)4=nq@Uc-PE#!ENV}%x_mmGC3%& z4Rq{f3-?MSO{XoF^kc3($ww3|ou9ulc|3F}`Pm)wzwxzQEgt9lJQ+cWZWLXD2*K1g z6GiUn>yt|p4wX<@&?9rx*_~2lMc>hB)Tn%9!eN%{6Jt%E<RaG4=ze0II&Y2Vmow(j zPC)(24b2h248VoKRwXI@q=E6ygQ0weoz@AZMFP6YS1m=ny#FG;PQ_CpJFSzd)*UGC z;T)*DdG`qP+`2jj7FvY`&7Y=|X5|;0DcrA;G`lYA+fL*Ydu~MgqFQdC-JXT&>wOqI zX%hWZRdY57!ZOVZ<$#PDXhEeUhQ5|wS)9^f5N|=(Dk>l>)ZEjS9%NA>>b!N`b2>oo z>@<e{E&bwR7RPTdvS7s2zJ3vXn5bo~Vxi4WfV)Og3Q*;JAx)US9<9-CBKM-7xu8P! zZP#4jV?m5(l!Uj!H`^b8st_yV^D(r-np3w~q$SO^=bka(Ni;7czW%xBN(%J1hS81* zRcDZ=lEan#`b#7!3O~L}IO02T4FZNQk=`N_J8v5wR+9ECRpgp~OEN&a;gy+@t0?U! z4z87|Y|jt5r{{1<XxYuZ&T#B7yG`Y(V&9W2Nf1h5srH4uqfSto@?vqPoiNvo==o}F z`<$!biO3e&m7&fl%=Y7Y$PAULi_DoPf%l#%E6K<9U0vaDj|8MchF~YzC5{ZnCaERp z-7JgSFA(3&FBG>5v_UpRUB36~;xonJScBK}BG>rVkJ+q)GJKYPgV-X-qe`}C^Np@K zW?$Byn@o@08oPZQj=n?VsjBrR+i^v&q_LZ3_oohy|HM9Z7cU)jvZl2Yfse6vuX;SV zU~lfu&mDMj?z~!+UOO#BAmO2guZTT|dH<pc|F;w`BitD?JiRDH!~?u1`aH#|W40kV z_B@r6^I+kb`^g0c*~bkgS&G72B1aE<-!$YiR?DxW{IF?2fB2s;Ga8{KKn3PPGUYL^ zD)7CIiO&U7v0yJQvtl8@n6W4)A(7W6&Fs~Dm|NmlC~>|*ptLg>dll8dB*F8LUFZaR zj=gl55U>CK_wKvxUIN;Di70|#>G%0eiCM)|iOx{7p5m|Fa*<_vU6g}QvpCNUpVGyR zL5{oCqu&zBzRPPTw77{~l!B!zdm%lX+Ew5r6Oq!EA+$Us+v>m}@)L)%wNn00k)Pme zgWq=}?YD9)tLwo=Icc^n`h+zJL7Y+^awO`aDDfHtF%7@(kLb&o(GB*X!W@PQN$GQP z+~g7xE$`YTzDDJ9i#!!kz&ydoR8E{XA4RM2a{u>1tQvvx;31yz-%OvsrK6EVBL{rN z46xS!x{d9>u+Nb!Bvce)oRepsj%f3U+QvU%@-d-GC?@Q1p@iHOr-$)lohpMvzg1AM z2h~~f8eF~vZf^^~$#4OT9PX~{z^NBPy<FuAEMA)3zu!Qf-`pHM1{|-WO4qJHZTrUf zx>ZhDNY-PK=HPk%G-<GV?hI#NMRTQEH((o4$;b$a+)s3yul;VNt{Rl9CqH%(I%ji) zRN2#c*gnSDI|te$w7mUZORVbzb>iJNA(^|{Ki|IJ74^1s^RjXBn%5TMBU#~nVWSw% zuoo<tF>cU~g4*a~uvkjmU%M}T?Y7qPb{;X=hAr)O4QZkHl<lpQIp;^qSm%SbtvK3T zShg5iy;cF~`&&q*&k?2fPV^dNIu)wSK#D&7I~vtY<&edz?-pLx^v~*Usl+CVeS}8U zLUW4TwedA>ub_e)ir~0Y49-X{c=+kHH~`_Vc@s++<AkD6)3RD$;)207SsI_F$gV-V zQgEHEP3Z$pz9pH|=TB^$s&;R<zA0QB);WKYk`(7rmj8JJHxM}B^o*Y<tM0099_8yp zlAloC?ySeIFinqUp+=OTA~zMbgT~7Uqc;ZEZ<;<}8{nVt#dbw!>>JTizvEKW5u_+F z$a1Xwc_Gq2c+_q&h3;q}Bcc&YIJhq;ylWwk+J%Tsj~}5T{`o%GsQ*V92j+ttH9DK$ zO!`4_o~^4bVi!(K>^Cx10n6KFol1JVYsd<eEHbE!Bpjy9$&QvvyfAG7133W0nvpXn z&F&&s>0>R|lX8_U`7MBl-^!)`Sw**e$4+Z`00N%R#~y(%N}wgr3q6qpT1+hATcyT? z?zKN8K^`Uw^aXEr(80XipGBCEH2x8W(GLy7_#(Z{tAoybJLEd$Cq<HoWr9+^({rgM zK2RJM$>gIIEOBGTA;`?)y<i!ZOq8cbGZx%%o5RsmNJ~dtT7+7;AbYTj*RKY=3f~cS zMyS>)e)}gvfot_RPLQ1Y8#g8??XIxN_2Kl|%3h>n|5;%ZL?_G=Rtq)j(rT_)%|viO zg1y6$S<&)sH_Os%g6GC(!&jb$`1c!F$T{Ne*iYYdm4OEi#xWgFl3;-G|6%N`g5qq{ zEsbk%4<6hhxCAG-ySoK<r*S6`+$C6W2*IUscXxMpZ<zl7J!fXm-sep1o4)CbuKKF_ zdu^>}y>Fw#Z1#1Vz6W8z{lsqQW!bUodXrBky}}Qc14Tb2e~Y1iXnP!|XwTa8{+y3+ z@%i3ibbkd0;d+wfQw}VfD`Si$)BMohX<Yrp?>{Zx6|M?ix#YyNd#9N-L0a<byi~Ag zKkfMTz7@(;pZ{dD*Gk2U5$HquIiWSSt*Y3+fRRr@UOtr%#2NW;O`aVCpxi%+&=#T9 zfYAlFrkU{}4Yy>L6{?(X63(u%7JsgsuGy(q583zcqn$n%t^*e(=~o+5jkgtxDd0#0 zR>7{AFbLgkP&ev}<Txa4S2*zsJpKmS=B<h)!Rs+9He;QK`FH;PL4ES6eY};k;fB{Q zpMBcZ8(R%*@3(fX0RFbc12^CoxYec4WcJ4L2edKY4!*@)RDk`3gOKt1>#wJwS*~|h zkK*7t#|GjIW*Nv-4~yr6hW;s(88NhtMy6~J!QYjBme9d~4Ocy^m%G&%_+nt7>I)5q zS?{An2l^)L=2R9wf&Xi{p)Y7*-E#-6evc*BsO5h{U;mE@P7ed}6<PSd24hX}0G&63 z93c`Er*{h9vx~k)%}NDv>cV7P*Wn_<ukM6LA>&LFY+ePm?mgo>J2=Qj`PGG_!(3_} z>o(-yK5}G{cnlA1=`<McK5E_192R1%)2p!Y8Xt0zOk*WM20#xLX`jAg0NBbYyQcYC ziPq}m)o|616*WqVeuNvEDT^%dC>k?Qv)$#R=t*x%L`tn^F+MEO&r2jW2q?w-BZr?0 zjSkv1RB<e4Sr^K~;ugIG%ywZA&Ep(qZGVt5tfA*@*oz~XoFGLnCwwL&3SK(-(@Dyl zG<oE~(_Jn2ll>AYAg`1KU7ry*9(<4kM~E&8r74uezjv1ifi}C4(MbJY@6T3nh+0bi zGqY|~XDeplnfKKD30Sxx1b~C8(M5KxY`Of&^d&Rc&p`NI5}G{8D=GZ+1~g7CwBI8} zBte9d#ZQ`?2p-%lG^aB#c^ul#!?KB6-c$~qZLHn8TGZs0#+>=L=p-(Z_RQBCP8_f^ zuEEIXKZ{!CEc_2;Hfn=r2Jm#!c1)s$SYx}Fl(QQt=>t>jL~CDj^SO21l)d`xtZ>Lq zP*wQ|8c!`W?;W;OGk&XmR2dFsl(>zR@7DPiJzVQeyM@-8<oPR0!2S~R+5L-;SpII7 zYnff&o1132K>~AF7uQ>P+V_W*%uF#`Yf@cDzgm5s`-{b?fN-!-t+}4$VUl{P;hpLm zeq(rukW@{`cRS%8<l!4HOO?HQev?Kd6PBFzcRNgmhNRAo`bWC%z?Fubq2<pL<)xhC z2qjF<4mQjLjg5BI+R;6hqT4=fQpZush0|60+D3sbm_fb1oNDg%3c#z9QIBZgK!{lr z{R9u1&L$-SeVEk+YsV}Ms%leh*6q>c#_wEFc0RzXaN$m?NtUm1MW;dymZm&#J_u}P zu9b!0GZWP<e#1>~El1LxTLkVBuXqmADZj^AFSL1xP+x+F{gZ`KlW5yZxF4wrWV!k- zH4de~yqBPv5m!T6l^!Fh?`yfxvv+v9=mEx2LbFR(Q_J^v?XWbuE&x-`F8DAo&=j`= z9_g~8QGabc=&+S%mGOIu*udKvsXPnn=ynwWQ5E%LSl`Re2=Gb!=ABrf-=oE%ZsAOx zYbQ4YwW;H=IV$k%#Kz;2kE=k{<)k-jeC%-A|6RGq^v`?yYR21a1MF896PSY%3pzuH zHE5Kl$G;TN1Jxi)AebxZpYAyOuUyGI1OalWw$GO#{<C`jn2~Xzz_AZ#0U*Dp<6+8{ z?e7@hzZ~m_nGAH~Gh^{1$6jiv?RAV_F%XA6zcKdXD(HTuyV&WYp0XxS=P$x-s6V|f z^)9H7;1|!I3z`0LH$B{hbin_sP#WSjs77%<hxjZ=Tt~J-?N^Ad&!@RW7CoQ*zAG|l z-CChFRH%}f;g)TRRR5K%EhkhH;RjwvYcrZ6`Jc3rbJL{NTseBhv!|M`S!Swx-3*lt zY$MXYQ);e?mv}3Q6CbGQf8SwRp6r<tLg9t?0rsO|gGe{SIM1OcCKndM3@T60P6_%` ztnT^stGTUiS5{7#&MF<*gRJ<3_*=EAQq~kansqjsT@Ge)pKhatZnjeEm#Q=Q|Kp_= zDWoh2#GUsBRzuG}*frd<`8BGDPMplNunDzJ@T;W(@U0TyRg4@u)ENu=J{gqa+Ijuq zyi3)LO_P=yQPezow$XOT!o@Ld`~>-#l3C;Uw_t2^)#9HBW~Lr;qGK9_%hUhT0w8HF zx8;=z_$B+^auGbQs~{}WE{UsJ@0J4T%8}Z)v#NqIiTnJWL&f($=iE^#9v1pG!0;;k zo}!^~*Pk_H3uh$Zx!HqP7B5Ht>3$GHu@S~1H1|cCoI{GlGSN}P1gb;G8RJ*-tRZ&< z3RC8chC*01l(UQ@zTtKNv{pwRB(&~n@I&<3B2geBm?D81PG%9vEpcl2%E$#y(nDof zes9r=XYF@iYLgR&Fp$Zv%5$Di@c&A!7sI|hjb3uKTUFt6P{lV;T_i<!mTks#5PB1r zeX*Hu?`z(}6P^_!h^+l5_Z#(DHdf~EUsNw$SDd;kfE(*s(NwD_(RaDQN4aIbgD2%F zJL758luj}9?_Z?{GyYJZ;w<PD66?Ewgin<|45+`5`_e-325swfz1gi*x%1Gx`!5*& z(r$4mJ+m|qWhGO-q%->ReqoL07JI_4KQ9e0`pzPINV=#1wDC1g$z@RjT*3L_t@)uf zq(IA!`P-EkdaRw;j~WbM1gt3{h)DGsozAFV%`dOI?QVgQhy42%1FIYBnSy+J`5;k; zwH4^2hebIsx4ma;sY84Fvftvmjdx%H^B3?h|F9m3D=s&mtZ$&;>8t16{jA)mh4uIE z+&i+S%&Vyjy%pnQ_=aYlccZtXqZ^;&gh73c*)MF!uD(2dsf1<l7YoV&J7k0bRk&SY zbZr*2(TO*(HR-6)|KJ4huKN=HOZ>lz^Zy;E9qkZK9W5`HP0A?#-dnHNA>{S#736j- z0R^BTd6>a*r_UZ?e8dJKOlPYybW^)65*Hhb=2S=hzHQ%Fn-JAMXhmlvSKvy<is2;K zO^exLw#qZ5otv#FETI{!8q0lzi_w{w9asfw(j@o)J`5`+tevLxlm>7nrYXsOZy!bK zsLB$>p;DKXco-|n_<jHSLZ_c^ODfyQQlzSoDUcGPMnvmNras=*S<}2ouPq5enX%UQ zH<w~N;;~_NbRBs-MH%-6e9w#VLY=ua{;}G^kn94pU2S)+iy7hsW&l$;-t;*O4#XPN zH3A#;7;A54BrWgJ&nDSSGtZpsj?oxz9<G*}-OTx-=dP1e4gD{>gEbBP?#|nNwqZ(@ z{<AF@cAy9OUq@mGpvRTwM*3@E;oGwrq&G>p7IfPknldJ_1xIa}7+-~)aLuGp45#+C z5YZosyHx9t!O;0h69YX~epvmQ4$9=8{QY3!`=M7{vRBO<di9$`^WOXf;|hhafB-2W z&R|}V4iY5BA{PR90B7dK8E5&;=E4)nCg(NoQ~nh>?v^yCt-KDv?xb4!Ojh^{Xco<A z_mc#PE;pT{8>?JkJ@Og3;FGHWRkGMqlKm)3j>kTPWok+D?uR?>Ulapxq5OQRWj9o? z^h1>-nw0)3N}r9o(A^KuGC=E47kK>Qpn9`Si3xWQEMC;QmIQodOv7pj)&|Ba=T_aO zR+@B*1>=_zf*I$*7uqF_^VY|x{XB^#eYMln+3$2`+iy`VcKdxT3KUE8JvdlxsO$;` zW!rRn8|!wlj5-rauG=Tz6+-@p)byJw+%G8Z$&n%Cr`P_yqOVpzMGt2}?>WU_4}RbT zO)bV#zNH|O8}D@imxC}r26ko;Nyznh$Wj}Vo$s#J`l`A|m&0F}h93~WNW2Zk`#IT$ z1yf3`c!bz+<9*<DJ;aP5&IQQ|=)b>U!)Psh!lyvT`gj?e(+<A+fLN?LF9%)?CjA^* zV~(ORsZ+pYlFmyQKiey)7rZ#tu6y1lxABD;pP4u0{Zmi=KJM8zm!8l519;q{r&Y~7 zT&g3FoCWavw^c_Q?7@C@i|nd{aSe5Z*?n()*RM=7+1eYb9F;<xjRzL@i!qiKT&#(K zyiLaE?xO_*7W|*HOVi~?`{rX(E$Z29+K4~F5P`}~rp`_u8rCx5fzR;3zbwPqihf57 z%ntuvc{({MHaB*F77ND;e^=@UEGRM%>hnPyX?tHR3pWY*&1JxO6E@Dx8siU{fm42x zvD=+LX6>V6+q*J|zLF2KI-}v1W@BQcfwBWsw%&UjzxRWTHH72}At5hNDJAG(nIo`j zk-lHvUucJQeH+lICHFSlsEBJbLv`F@@W=uC$khY#wUr}=3Nu0qv(wbJB-46+T_<%S zN32b&+NGGxn1P`<@z}XqeOgQX+^CzBCPSg;%m-F!k@ar97S5QcG{1lJl9;&jxVal= zq`l`%mqzs=Hq}04uW>p?cXT{Xc<ZkcZLHJ*RDwR(PUN56(+GVLQF{?fEDo*$(tcwl zitXQ-sf!-#=PLcm4Hj#@^-3B%4;~o$*a0@~QU1c`{AXSG1r7}3-NT08#jE7|$n6*a zV_%LDq9SWjp#}xj`U~y6Q~6hQ3UL)-%JuwT5#1xEua9vTDBl<#05vVQb##FK3~c~x z@)Q;BB;MJw(%yL0M&E0HM2j`3kT$edz+Eb|KZEkXPDUifXT<S$&;e)&M<)dx`h0;F zDzhuaPC}I8D`GJArn8md@fk&<k=tigSrWxvRb2`ug^T0n5H(%`+G`B<Qs>A@Phd<b z`v}BJ8rncnHiHV_<f&#tzW{z{lDrIyw=*sKH<p8S<H&I{KEp2xdCcPI;t~V?MCXp4 ztS|bVIC50W??ETg51p(1KE|kU;41x${1v|zaOJYJ`iN(9#G}`&W~JY*rC*H&rJW{| zxU1AUY?_0C4y7(c+9deV7v;=^{-}j3XO5vGMe6GXvvvq;(Soy1t~FDn+73~U%5|(g zg96<F_Fk4#_x`85)UVKhD*~EbC3xC&;iPZ<>eG?Y$pk2VKgVppd;zPZ6A4hl22&aY z)QG=2@kX=ucuU}$)A)PaO7K_gC>9Z43-8OqJGq^(s!4*S-8@Cq^;zN{;xGC%p?7fe zwMqFsZ|34vo#cJ4P!Nlm8EdGJ1u)$TOzmwe<9XU|Cqi~&=K^7JZ29$%AwEpAFvqNP z5508@TzJ2W-gGqAH?OWR`<%E{*L48TH!e^dGN*ilXd1mezakTDQn34tX9-y{*8m1? zh0GKpp;xsTTgWcJ4kZhX)cx00e2$Lv?R*yYtc>%{wj)%uR102?7niyw4gfSnzXc~7 z4XgGF&0YWpdI-Kl2BIzZi^av^CimOc1>n5g@O_orpMn#OUh`k|z=1X*oAe%GRa7;6 z%71;g`6aN^Y7xjI1bN|cmgewwl1Ev|<}?mWr>Q#{-a~PkErAqc8#s_-N}PSYHgRxG ztTm9@93^gG|50yNO3I$xF(aK}S^4d}5^n>ALYbw_U(Mqp)6>t`1=V)a?7DVKVK|ic zDekbOmO(~nocimhhRTwUx@tRFQfGRx1^s;oRLsRLJsoL3biF3bQ!Yu1amO{s%|lv7 zSZ?DHvd}3E(p0uxa*@>1DH6X43OHde(}4IQLK$L<9{E@WQnUAt-z_iJOzfn`Z)$XG zF52(Gp?dZ%znY!HENQ3X2gxN#P^Et)F*0DdQBaXZU{kWjlSQ0rDP)POV8dKR-(-<F z_#^x(8C3MYvw6i;g<>R6F(ZqB;vwfvby-?)1G;yV0beeT%YbD*XD(svF8hXhr>dX@ z0H{o}`pX)qa>M;L)U$qD_M-mb%JXwBOLds3W&P4pt!4{%-~O@lA1!85!QUW%wmJj5 zbKu+a2n+CbUU&E<cK$2u|Lu_ef3J?qACdtrZ#kg3cRs%h#hw)VQP{kJXTML(an{0d z$B#&~0`r#nLJ0k@vx=KzfRBemzkr|KS&K2aDCgG7v|=@QQc4gKYb_jOB9Oi#OgXbY zg<aY4PuZQaRj1_MwHFPeZCyuwbIaKp?v@uc!RIa$h&T_<zRprivq+5Az&7Vi_&V$& zGd@?SVje1RmpVHfTq47`Q^%PLVR2P}$0Q-9^c8IXXzQ7+K&A|#<Ly**CtO229zb6L ze(#WNY$JR+4WY5}#KAo8e(UQtW)gmus54x6T=)&JjzR4_LCm1hU?PtMMKg7vS|Q(8 zD-wv|c8%Q&Kr+=stPCBAAV@N`-j`oH*}?xX76ui08OMI=DWSYP^2yfw#4QTByd(f1 zvRS6vk&zzeVt$vN-Y?KWnxoU)B2OA*PR@5A6kIy++umN4x~9zkQNS6e&z-1fes0su zu6<3F%S{jMHP1UDXKv9KLSAU%#TBN&v0IjB$ae+j|1r=~NB$WF_80897q?*Dmcu4r z<A;hQ0yWjR$;7M%r5&jT=xX+2L16sO*)O0^D6gZ*q_;KZ{3AaRk<p*~zQ@9vm9FJ+ zQ79djJD9K+d1C-86y<i;=qpUi+sBo=2N;^199~9u`>Kn))Qjz_yv9YAOIT=?ODdku z7Z+b>a>AFQ7>6MfJ|I62U`PN0>oLdcb#?#h%B0O3!M%3r!<e^qzh=sejfDl?=|(<5 z&@BJwi|h=sO%Co7th$WMozUjA%;<W8*s}?v#o5(HqIPsd9I!N{-BR#jtom)t0r0^8 ze)#|&Zsqvj02v=UF{D5XBk&|z(0`|>T`GSys#_B9e1K0)Eg^$=@%ns}8ZtV3!-5y7 z)^4y-7NH7>+Jy57{kqH(%4)7X@s_Im`J?N;psY)jyzPAYrm~<jZhBJ={E~a-p<4qP z;r=S;wLR^$f;IpiPk;VTqzX6k4~OGmD&u1oLf2q@q1b19tn(SOQvp)WZW1|Sbeo@3 ztL0@?t7KT*wk>BVhG*JRWq}4X05cIpo$yDY(^Dtvrir=3eH}C?TBW+HHfl&SWLjI@ zHMP}Sx+3GQHp7G#le2f48M>B7lRtH>{FzH9gSVo>X>AX0rZV*#Ct@g-epmjNmuwv2 z1y|$a%m_W)_N$&pMX9+y=jWOo*A4eCb^%rV|KZ=2O(ftK@ZkN~C(#2)S`4o3-k(TZ z#9{J8YNEqkPv!9rIybJF;cm&$#-5#DY=P{Bnt7eAuSD^^FQL{CRY10PB{SCkZmn+Z z0adzgvx*}ehwz`>A8*4OQb~WHo9jvB)&kpf{JAbu=yPX3R+Ta8f(}Z7msw~T-5OG* z+H%8o)LWz2F9vtJmMhl{PfKcL*c^Q?D0$^V-|dsG(iMv%f38IfdDkkCl@>^H$2P{U ze;lC`Hy*5jCz^!kQG`mQpcF_MM!9zo<8;t0!s){<1yb%Rq9Z|iYoY#mf<0>d_KJ*p z`NQrV`5MbUCm1`FslBW46DsSKzn}Z68<{mV695&AFc87GokKn7^MjfLBtT)lU1Q2G zhw5vTt&JppyL@naYZcXE2?`GA)S{QH@t*e09Tm*n)mZ9RQyh-@B;~ZsuK2`AIuHnb zu;A_(3l-6zTMLjt6Pc!q__jjJwjnmG7lY{&#r}avClrYYK+k&0BcWaU8Lgu67LA~n z)7e$fycT8{e+Jh;dL2Pr`j&BnLxYz6R#8qtoaA+VKYkPXdu8^|c(YRn&@A*|4gMgB zgJ(WFEFLt&s3@t!2i6m?#owN;qsof~q4Tz%`INOE8@twKKpf=u!B`;N?GzuF*6kq) zFvVqXDXA&kIEZPszPD#V8#7yK+$i%H?Yr83ZD<zwJOg?&v8)59xqRQp^RbAu06w1J zZ6vhLu!RhaTrs)0c^s4ho~@kfdHFeQ;{7!(f*lxc{nE4)z`t6ao*n=pz`irku))d- z4Cr2z)7-Dl*GLmwhQ-_eDLBaJjl1xr&c)?j^L=IGWtqkI!Nu@p312(;|4lvoE2jlM zypxj!)z1;J)bbzFPQAZaKaz1IuLwk&9X{lw#})*X{jU6aQ$xxZEy@6qBH6^-?Gs-v z$^#1dg&_-PiXslX$?*fr%rp+n<_6;s7c!~y=j5PPD;Aee1&7my<}6+JT^uiaF}1y1 z#KU7jCv(&Nk4&ke!^_R1?Fr!;>0;|Gw?s6D&R3W+yD1|vXCv66sU3DDjM*ZeFb?tt z6!~1Q4>awB3h#{9hT0S?GAE!bgiFVKoxPC0Wl8qKND`4k&#rJgk|+U)qvqM3pZP{t zooq(=F9bX3uEx(YFFGF3Tk%z2$BGXhyiZI(ms3Zc90cEKUV^)9xqPnr{_;ibaRXoX zD|H*Qp#OcY`5z9~msetW+0W4#m*N6!uvT)ukn8=>Dio}&(J#79q&;z$kNcBXq-Xhb zT(|HQ?o7ulwJ=9tbvwy$5JRMmw+-|wazDxSXIzO;9RK+Z*ohF%zQ!STkCFXG{N+(_ z$Jevre!iETlu80*PMRK}UnV7?*erk4IB<NYB53U6*QlMrEMWNym{ydu4gI=Y`V21? zIy8@VJvUV_dM(^Hl}&k_Fp1okLtOL+2W9b|Np3))4$#ABwPEwlkVK&ZXudb%Jg@+q zdcSim0^1Y&R%-!Wu*gfm6llB9+fPvhSYuEr=~*3=YtKyqSemWx$>hAaW-;k#>zuC$ zRbQsu=!bnyS!Mrpw*8zy!sa-dLfmR<!9CMQxa5%7E1}PJNi}*3zW>;9gK8(U`{$GU zGY!=g*Cq%oJa_J^`ye_p-5TfqB$K+fU1-wYt>}v$+1!UJ%V`O`Z+qPDz!@>soQK9! zN0Cy|RVOFAD(OY<sLLZdOoUHZFg@5X>?Jey!H2IVv-a>d;WU8~>ytSZQvUJb<5T|H zW|H`tPi>#gz_pL8LlXBVQBr{228U!-Gz)Eq=MHQX3qpI^9~A%c2P4z(NUm4)n7=S~ zz%tgRr2z+y&N9msm&O%#Zts0};~egZ3qjv00iuejB1lk>2P$q47JG{wvoHiT>gBpE z2P?9#P!L2L^l>%82CFG+2>gt-16Qx1GAzky3&)76?88|BG^;b|%GK#~*2I{z2^V{- z4X{Q7Ebi(lBKXO~`dwZ?OJk8UkWaW50@m*G@x=e?DEH-=8~CyUeB}qWHY#p5mHkW7 z;a@GF5HpNmQaPPa)i%dJkkZ*0HB5kwm#sb6MVnOd*bybbR<dhNZ1td%T+ROP8;vOy zq|kEjWVER-h%VWZx;-iRs+X?6<6`>EC@Qtc#1_{w)9maN&QDGPV;%P-w0T2W)!CGO zB`ubySJheR<;JjRJR4*Ti7a64GA+ptJ(<a#<QJ5-{~BPyTSDGIX~f6mXp9XlvK%V; z#pFe6&MAfB@MmU-fC?daT4cwO@?i<hK3=b}V5z_Rz0!vt8?jxXq^eASnpl^ImXSxV zlH22V*ZarIm6Hb6%1V)qN+;I>6X@i-f*Iu3-~})gnZKza8W3f|r7Ix#C6gru96$jC z>M=X4x83z|uX~<>eH7kDMG%N<f7`MD)$sJ+IFmO`LxgFLS&qp+L0lEo>~YH*M_amh zri60jt%z|D%KaeU>O-piUJWJ(DCX+EiT*$gq)MJz^SIUy5)4)|LyPKOmiD8FzP9IK zkvPxAw*0)8YbOEA5F=XB{S@_+dxMoU)uNT39He&UKHso(gV*{))<OonhD+WLY9Rwh zu`DI6oOs^Y2MfwKR<$IF^*18l;SFCYH^^{gk5dRcRZktIVxdNVvzVu9xfmu~;9kK( z`oRO&SIW9yDYpp+<aXXbC&Q&0d}u5<#ChS)itq&Hi=q=~2i}5RCmA4AeR!i=$edff zzr4rQ;7`_~8Zc78Wq~qr(O8_JfawM0&@mn!DgH7ztK-^T(W7BD8D5L0H<6|gS8<(# zDYMaHMSb>*Ql^CsQ!EZSB?y{1)~+qduKCZz3|l~2rS(9^urKYF>vC;AOJv+)lK<PE zskJzH{vURyFj0c1AMp4Qen)+A<W1jWsBEkFEbT5n!J<4$KS(nU87MWt9XDmfDZ{90 zVXG@c4@P1s^%`-z8Nt}s%I+^tFJ9b6C-UE<6BZi&-cl4rC$z+pYD1H@LvBvvM&u>D zCh{GvktH%(m|f_o>1!m|HR~|l14k|o_|#3;$GWar`))RM+=ijjo#rn&^g;GxTXhcP z%`p$J<_B}zUZfQiEPc6oJfB0mz&)^Xb~1DCg6yal^nlqMN!)|=1cqDiX(=dpo4P{u zH)&Nmq>uFMx%yjs7bJsBpz82eTzWP%T4mXZ)3;XTSk4wS0^z_1wec}u>o-#0=t}uO z=B_G%<)7HI!9m<U#Q>N01#sKE{uX-S|5m<y&F$7y{`cAHpZvCuPGpzH`btkuv&C$G z+kLDg@)m8upgDMXfC$Lke19!677&RqH~c2S%XQKH68d?utNE5S`h?aOvMok4V^_Op z(mW^^UmUyp*c)cyM7uf23`XUMO>ZGmN+A;AWGg4mEn7I}hHtA(g?TZWu)@iD)+kkm zXUJmgaLOrxGlAMqn*y1Rs?=4HI?*50hfX9V9r|so*Qz>Nzeh1kzsF7*fm++=3c-+m zFOD@;^z3_5IcW2;eD32=lKP}}^e}GRO4uYwi=x(x0lQ*m$n~2CuMcY|w}u^0MhwkN zd;4`<KY_pDZ`ySq*Y702#39#ay{(ESooet#d+s0?uqA8woB(c^iFE(%c>izB$v;Xj zsTd5H6Pk$d>Kwrm&`OIB<M2x)$VZ@X$H6-4b#wm1S_nC8&L>?%RiYbJA+Yg@X8cLD z@U8eU1f|)7kf|uHLPc#f22mu`uELaRX~hE}{7H+-y-ztv<SRQnmACBN_>(!2MX~R_ zgP!$gt7MaY_R>OZl^oUQEhL!-mE2j&5T9XkIxw1a()fmFDd|A&2`5MK{!b2-8K=;3 zcIxLKN$jM?Y(kf-K&lKGQL~j{$noX@qK)o-c*rb~)A?F}m?g$t;}5Ecj;jQwQHXXx zS93<wI?yxs!M>HcbKvCaJAp<L{bZpnyb<1yMYFcM;0PihK7*5bBfnNgeKcxt6S>aV z5i`lQC{!d<*GW!`zC`7^5CSYI_D4%&%y)rBuIfj!tu&ksR@bG76H6_jTFeaBr8sts zN?IdH^C@V=5&CHa7X+2ase6}8S<BRPN>hidZ+3f4puG`f2-tU{adGk$UqL5oe<;C# z!lAm3{9Nb}zfhj2i=~WKM(tRlD2zU>4(^ZeB*Xey=z8JWt;p*veMQWz_=%XGxA0+H z<28t4UgP0a`ctx$Sl7)pFJoqi+S%@BLYp-Gmr}-8xhIVpr*<AvcEC>Sd!sy#S_xh7 z2uuZaNqmZHfp(FzRLRqsGA;W&=^7dU@(B_ImaptQIK;6ia%nb>&Jnv9N3H+lZmMM# z22tH#D5gn<Tg>Mw+TU6>Mwe66c;bzWc{x}%;^$<Hr7wwW7%Uv&b*j8<EG4HajLr>L z;KFejeS2!f&%B9k?lm>(v@pdB^dEt0x&Z{)!tK)l-cAhP<?WsrNNnl<X7l`084-km z5rkV%6NFLYC<HHWeWB2WOEyMsX5cU0(c1yR&gloZgFcV?oELqm`<;*GwNmXiS`vk$ zU$Nh-Fns!OC|7K6GGO$tNjJWiZKoJdBSC(+v$v_Glg(Yz*~lwZ#y(A`nd(!&-<E6t zvSe*jYaZt2EGnZf{#o43f2=Kg0PZezn4GCOi8Xq1b(=yQaV&%0aXMm&$@MVtfvNG& z)=$@UJvfCxHGWEcxXU(vlXBQvn|{a(O@nGP<Gm14IYuUTBYC}qlu+5jLKk~ykCXKc zx7Fj>q<iI}O{B1l7d*dUJ1G3X4I9qIf)Q)J?1I({tKDKpbI<xtSkFK2*>co9<yYrM z4v^F}Y}IYg%jMPn&kPRj^{tJP87=>D$=!(#0Pkf?Oh~Z5IQ8^Gk_eNU`jdozSXzBZ zoXRKU{)vOQ#P#zns?Cs6qEMuzU>9rsS|6~W%f%C0>gvlXfM}!aY7-hs7#tzNe${p; zBVclq@ua<BT;^D=x|jNplF_%^C89?mG12Gtk*+bzSB89#w<tGaZ|%s9T%u9;d3V*^ zLBJ23wUS2JJXWYfC(z~MZJ(|>r7O13<Vu{}*m1Tc(Nh(s!NNoR!(DFP98e04Z!o;y zS+P~xkDBd#C};AnA}v8GlrZ^<4e?c}GUAz^<rIQAKm_Dxmg8f4UUk6Vko?I$As8a2 z_0UKw-;fHUr}Lw!1%Z^>t;w|xgKL))M$NjJOVuA8I>WK|pOIsT0qAAL2J2#{b>!9+ zs=UD;TcM}7-%AzPv1)EJ28xh~b?g#VNW#^8qohtgi9aZo(BUmn-e@CY)UEeQcS(Oz zXG>qqn)M|O5cv~(BkhIE(M-ccO49MpgG+^##V(CcJAkMZp(Gy^;W{Yx%MfStMX?Ww zqD8BMND{HwcW+Xi9mP46NnjG+(r~$6;nn=+<m%>rBH;rqoRb}8z7$6olOQigaju=P z+PCg#NQ<j5hC`wzRo}ay00q5Ob^K8SbdUVdj*i}ocIAL38xN1oC8pP|@9IrUb%lnG z!BhJWyW>$I|D^>m(r&;i7Kb~To}Y)=uPGqd;25Y2_Yekg795N|<rCzlZJm*L-`(T( z8BL5%Z7w(kC>pY&IoMu`VJC{!9SW`Ija}^iSR%kin}`v~N?+1TC+2w5&v>A2*kkct z!uy4|1{U(9%}sAASHnY?T5H&}A`B8%1|11e$78@fR;}>!J|+vjwpYJxdkDUB+CAx# zV(|SNO~4iA^_}B+GI8o3TX67hD=!6zXBqcZOpglD@Y9{<F6g<?(DSI9aJ2q4*2~A2 z6WxM?L4O7rxh9>%taj&HOJ*yNaH9zoKLhensp|_>rmWqkwFcS?uC8DY(Cita!i?4I zQ$N8n@4JduS%b{FKWowwoTl#=-yn%oSFy@lI3!!`AP8YTH${RFrQ@VkVSfe(f1*}Q z92dcpLh+(XtqFLVK`9I9PM4xV?|ev(79y%Hody5IemAm@<XCv+cUFivtAcYPl0}3o z^1qJeY=qF7JipsCHWkKhu=K;O(jOds06tr}dkn95G;CbVnbqnk6l*9{_nCM(IUx?s zIl4MJ)}&4NfZp&rF8e0h?w3IehL)Vf|3fwYw=LIY?N{NvH@JyebcVo?rdCmh*-=xu ztqv63DdMzi!I;Dwze?fotjQF6np$-MBi%R9vCM(B3V^9P)|4ApBPm*xOSTp_Kb~8T zE=gl+O^^`1mMq0$+0?1~sp7g$P;00=6I`E*i+z{fO}$nXKHC>%IIqA4f|<^W+6L>| zMLs#s<G=G|+1TfbUIkuKkw2Wj6(c!}g)8YVl)!~)lY|8J7A&!k6_5|07e=!Bx@5>< z>I4ZXCb30%watGo1tJ1#)unOlk2Oy>zWOR-xd%9{6Y8ZW*7E+WwR^RZxvz%IMLMNJ z50I?dW9jduF6XsX5bYLUE=rqeelyMVmsr;lwB)V}<P-WPT>PiEV}#j%_hY6kF}5ej zd(TLb9tXEP9f&VngL#)Bnme~B@})E(+8`I~j_MK@EZ3{B$4DT-<SDsEeD)TOC3>`1 zY49&L5v(_6FBfi}10D+WORGg^>vAGeO`FklkR$rNpHWfDSTyc-p=C%1MBnWs2<jRe z`CPS_;(VjJTlk)#^wi2jYRoMhEYOVxmlgz7T1yxeLN_Qf*T?*3)z2HjK~BzlWO}+D z+_BWYrEo#$vgv*E6Aj9}Yl?~=-4A@8k78+g3;N)z#TJP6TzoOTzP9Mz5x+9t$#Bv; z9Tt5pgzLUA56zp;erEE!uGQb(-F+f!jZ1SA6a?*SMQwHFQ-GfzFy|@ADjOf@z{qlu zK9iYQ*VprORkb8HdOSLc%nsO9>T^)cYrQB+7h)|Dt4nKs-xt2VHAwG6Pqg40fHrN& zh(@B{3=*%==Lr#fsLTaDJG{*|zOP@LpQ$=*?++j5{M#kf_ZNciY*mHtFC!~Q@Dj_j z7-R6ytHc`QU1}8}?Cb_6iAQ4iq6>b1VJn10IhH~AwOT@m$iTtKXt5t<Od&&Xa$<<I zr?BfN4aW{G8|qV`bDatLN@If_|Hb)}TUh}=5kkU9KHCBv61zmfEg`(Lt2W6G9ty6z zZd0w&UCi%4`9y>b&(sinqGp_#uK?9QW$4Oe6=)eMeVe@bd9cY-&l<{Ci9d?tuMba3 z#*Aj(xj!ZG+GZDoG@PBBz<!!$nO$g-(ucCFBz{>qHU{TijLdoOXFRLuZccf|tliv{ z?>R^EjLaSH?(Tw{=WAq^HplljKbz|RJSqthChG3>bmDzz?)`3p`obT`DCL_0*BwP+ zH22DOG*j@((WgtY*${J)k_3&l3X4S9LCO{P3pk0n1ni~kJ*x;%!FR-vg)(+4XX~TE z-uoGE^ua5Jva*3dOa%icNNven+j<+W`miirp*>Z3Tn=`9cex<5nIL>yZS>{NLFf~_ zc)XYp!KqpHHDhsxws^~2l-Z86vxYr07DKXudJCvA`577FjGj}Ien)#0{<*nC{52$F z=WE`fRpeRkVXaPPp;#e8Vw>Xoci$*SWHh!oyg|#`8xhdba2->n1K}MK3+b1bbdZnv zcRaW=0KC;JGSsD`zwHuG^NVbCcjlm4p5l`@&$8QY^{VVBg*ll&iuPUz-rG4k@$**> z3+YXk3rW`;8EK6-1gX7b8Hkeu20|H}sV(xcT{B{pU!#pmOmTC1oBMhXpH&43Nq(2^ z2S$|wBk&(bd;<LS6s%OdVmOUSXruY)h_sk>I0ZD%dY35WrsZo$bMC&F62W|v&Up*^ zHT;k~geLvUcCe`kyZ7RMx_FXgzXViI0LQio6?MW5QV#Ms5??$=JW9eT<oTlZNyomy zguBGpwHipSn8PMqXmw5X6Wxs=fqcrVnl`VxGqyXiTRkuMMOkjQ;9BENW9E?$&!h1c zf#BH~&UTLIho`Xa?F(mv=_Lwl5Z>c&{*0X5Q`CnssMqzC(6cMB-O9+f)*&U_!rQEv zzv1rnV{2nndEz!$NP^#Ps@;)VHFJSf>0?<8Pt6*{JleG^;A_?&Cr3IFBogum96D+; zK5y}v9q;5f>bq*_C&oLEfE3^h@ahHle$V26-~yh01&7ss{)^_p*9=|CfZ=)2>{sO9 z_2p6=!ImrYVFT1Pw|C?jlDqxEQ1{Z`_;~6y&3!;_bCQ$!$F6nYbVWO^`Chg?94zYa ziB>Ffc5F6}Sb|g}hbtCQPZCh6qsU8LvSihc(dP@MzC$_QhV=1+FOpeWGLXeAEt+J! z9!g8qHd7nHX~tSZ`3xw2UP151?jHO;)3@{|^;>_LM$6t5Zpz$wVU%w8U83tf^H-=m z=4P&h-~NlgK3;lDK7m(4_izQ%%s(<O<U;BV_#=Bq_PI=S5vG!J>AeaJF&$_1!kQuD z)EP!CRMjAv#PjZScm+SKTZhII#L|EhmN*QUFZttpshPi$y(w76k>+l(o;*C0p#h#} zs{b-PI`|&RHrlWKG;=Ngmk0JgRpHLMz|Pw>A>y|?A;4?(+kpvZCBrpo5#nLfA{C;8 zG_O){wQ#qfYDQCTVnz@**M%G?^oKcl3!%&?eUcYYuelW#Y$_dFQKCyQmN}O++vp-Q z&CDp<8@p|4Io#J)SD=q97QjjUb6qDA63_C{Jmo4SL&nJ*G)cE|PE{xnf}^gi`rI7x z<<kF23vFSa4|RoSBI3sZ$a&H^zwNH&YuRIx1Tskq!3A>Q<2sME$BSBj&dzubKT4Ro z?r*yr|6VQbp8a;N7jCZGf~G2<`KP?MPhXbFd5mR8Vk-ePPvD~^Z%!J85?~6&^Rv(& zFgNP^5)e{k{9r8-y8%Djv!0B6r5`Jsm{FCq6ty^(QN=$*t<jCC>G4v0h32B#f!e|8 zi2eCZZK1H`SU*>0iOpE~%v%_iGg1Lx_n9?O8ay#!DHy!@L2wiE;1NfW#j_S|IGzj- z=6-<^G9y8-PHoViwm(#hBacLU5!`W#Q6a0P4&9sC24`8wg6@Ki8)T<p7#dvtDbain zA8A<L6<t1xp=?<rBkDYu$WmYKP;MTIwyCClIi6p6MJ>j(<==>HKKopoWkAbs!P35E z(daPQy6b6v&SP@v@@w>NMSqM~x`~wrHm&{T26nKW#zyv`-JDqjqJLB2!r8&s$)tb4 zB4mkz{e*?u9a*PVn}~4$zHaIGOC4{Wp>$??y5X|-v!;c>=giQh(Xl4WezaHuKAu#I zhR;H2nQznXi2bSf>d4qi_zewLEN>*O%B%1F3&6Xzjko&?s}V!NPS<}`82GwkSm`l8 z9~PIU|BcYA`2tn2wfD5t6OOhH3E%XanMDWX{!+{i#ek$LauDP{^xI^%2tQL0r7845 z_xEX8%*S2f4#wniu3{{%(KMt?H(dTmvEry$PKlwE{Uz4|2%JXMn(gVJ72_Xh42#s# z<S92~d{rSBi0UzmRO<H#pRDB3(F#m~M~u$$LDz{&e0JyN$O$w*l$5L^WwQ;FB2J|f zG>YE_V(vs?PQ}w?ch&SlrOL6<`P><p8)#jN&A$y&SML0VHOI5PgA*l6O4!7CaQ?N{ z%2`s?-lX5Wt_A|IQH!Y%D_*X|-E$JjGww8oOF$1bYB8p;rpp!29KGJ264A(sYddgN zw_RH+0XF<!7<|q{O8@hsO9gf{KBs~&y>ZO%$8phP)3@#XoNq21w>1I|!TPy|5LU0+ z>wN*lpSj8L&9HrMxQ<y|{RCH9!i!C*?ixcMPUh=H+HNnc2Frb1=u(P>O<c!8n!{Y9 zfwp?RNkgjnZ^c<2qs`iSh@N7LZTablsTtnR#}05}3Y^5*aSLCy>HJi>xA4fsTGMrO zh^Tpbp2V0ZUXqPV=NWc*bIY_mzosE#D_zOjVkz~Kn;bjrb>+Bzp4DTsKLvVO4cs)N zvqd(_Ds>Gr^eO|+qCJ5esB%_kHG2{;cOLfl1N-QOhOGWwZ+)It3XCrvZdQ(Q+3TLC zgBKuVQM}rTSEkSp5w?`Ju+dk@xqGKZbpFeHi%z2_sE5sAA#PeyqGtn4-=8b?u`acv zyyTtMZm2n0`()gd+6_MH51SFcdnTg%pyA1-jl&!#p@D%?du=F;(Jdo#CYl(2;_(P{ zE~OL6@F1LU*B+Q0?z^kI!`Y_qT@sFU*Je+vcP?Edi-n*C$DyM^DL?&*El4!m`3@Ol z45oxx4{#T=c|Ft}s7gC3bOj>N_$$XxG7}ec2vSnQ4B+vlUB~To@H(Fwt}HKLc(YxY ze!qf<^T$b<kLK2SBq7rkaIEL@h&{vcRZ9zeiG~gfe>`WZc%9E_o~hem>kzQj-AsHt z^t!nml)E3m^Q+@Mo|wD?=PLx??G`tSzJLehD?u*POaBL43b{Kx!hi<2%!feU+{`_n zeIsMtw~w#3Q<K>2{BCaM7K{36P(o^K4cD?9h+pL-@BP%K`~vA<V0zE1j@H(}QS#>x z9nUu#pjS-*mjT>=bJvx`3XD6fPl=<}%1Hied&P(j;d9p2D%8{_01JtacvC6;3FM5} zJ6M1$1opJY@mX3t`JC2mT&#FTGFW`}so_vq^o%G``Nc?qrq)cO;1!WluM#65o{>+c zYx?W-zTl5EeRP+)oSa$ZcBk$>9eh2j_M6$MU=ob)8Y*r+Jb;wEl%T@HmF70{M|V>; z8bVj=fCf{SoDcF2()l-K=o4qjenZzDuOY4@N(qNIr%(J9qsL1P==Bo;6GQ~dF4B}0 zH?B1)6^1laf-Gh{)?3@nrtixqV>~+j1&FjAi+zY^T|KIjhxOsiuethq^8JZ3Gsvv| zPH-!>^DMyYBQW;ktg>-kWxd){?bm;(p%$D+z&`2QGkm*xdVi8kB=z5Dc<LT0fw&ao zpxm{qk^R;&`Ot$3?NBjO1|k3Mlv4?gBwICuW-XtjfsE?ybI<oEms7j%F-Jvf8ge9- zofunj*6;4)zE;r?u~*cTr)3&u#A4%2HXi+%B~Ym6Fw9G5W)b=`OMV(A+z`V(zL@q& zGy!#HOQqRqZo%TcSfG)r`HtOFl#I{fw9=%ifMgfz5=CWpqtkj5oaj^3)S<r87Vpl8 z<kd!;6-GTy=K?M_4)UMCf{dE&GR<}{WlQ7%7ShuMu`@j7_N2j+WgmKl9YcV@RTZWj zX_bx|VnC0Fewrr6X^FTjn!Jos+w^^e!CeIHn;CKMSL?__DQqqvaGFFYgrL<iQc*KL zR#E6Q;aAgbtua)MR&7eWWo@PBK%SzO&IbubMA5uG>!;(_CZ*1|J6U95S@rB;`dLNx zPBD2+vCR}W6<Iny>rDzOVU1GE#Vj0Oc@mdHm2H)Zg`erQ_#=wz9<rvR*PY(`f9NNi zsI@eN%Hy9$&Nm?)NMU1!n6#Qb0~4Y(9fyN?uUzwoRPi^Nn9-8hBv6-N6rL?=G=Bp` zAi|L7mJO$z;92`1As>rt9nb?r&SBv_n;X0^>=qkP;i5fFJ&Zl3*&C-$JrLn8j0AN^ z&(qe3d3-uNFB81p&0f(B4Xln^9a6xd=MSw8)D!79t^2Q?7y%CpH|w73J>26(bXB8s z%Z&QS&p0H(#2Ey%9awd7{=m2~D1#}a$JP56SpUR)FPLM{ET*3%4pK-c6aM?a!*<tZ zCg4Emx!(hDGG++k3@_{W`|9)0=gG~Tkj{BLQXz#t>niYi<q}b>v;NiZ_OL7N*Isqe z&h~Skg69}vQp@%6*SL$MFexy6X_^SK`twiW`shPvr};?Fxl;EOatOW=T$h0>mvu7< zZJqFei0Xl2w>sG8@o8q-f!^2f-j`(MI?riLcs~omU%Z2e&j`X*p8=(<CQo1e?H=1o z*`4SMHHo2^??%aS!mp{6+pk(Yq!{pebl(-cK2hkzE|wa4J|qyr8*%3`B5<DZIKlWl zMS}c;UrmjqyZQtDVn6G^ucSW_Eu5Z#;`hFV9`yu6kHGb#34$|5EmL1!g0Jv}?yU?% zZNgFQFMGmEc7|?`zwzLINEx9TPtR?Be~xD9xJ<5Yt86pumibrM!v7?~h#@yB1p*+C zFCM_Pwu33wo+6w(G1GY)<8fG58Q^yy(iA{=YIB_g;9gN(^lWS<d~J_oy2FDQKrvO- zlgwo&Sk016hmmxa<jhnb<oY3m1r>`GHMV<QrBX*Q&DfkO=3`wfa8N$dB+tvJiOx+| zpj(_yud?0*rA(ekLTKOhc896pg*$VZuzG&P&l?rD!UZ1(P;%b|B}i+jxk2SG<q0|d zDf8Fz$~tCkTQN=1vP)A53zGtc3UG;tNeuq@CNM|a08b5Gx-9ntdmr6kHldFpP7%Oo zp&|RBH!$MU;=SMYOD>P3xjyvo#~unXT|Y(GI&3yitAeXt@nL<u=G!II(}ou!SH$OA z*N^b}4Y*sEwz3okpd<+{XNlw_RAQtq1dq7EbX(m8jprfXLLFa6sCAa&L3N|lTf-+A zbKQ^K#Qx&BN$qjs!<C1z$)Hsgk|5|jcP#?=u)_F<uY9M&iU}wn;gsiSN9Lbe7zNqG zDXZNn@U|+lKchV5wFj>K=^}MzDY4+yoxY5|gu?SZ(-9@ZA%4(*hvvIV<wJ*qNB?<| zmVF53>#wi{=QL}l6_kNk@|BPIz#$MMwxdoH3H}b6Fh-LB%5--~{kYlz&#eoM8H?@K z_72Pr8Czhrl!ZeGeEWWRmvck&3O``I4dCPAK56)2)OmwZ!Mk9`<c~vf3PhVAd%>Pn z2Ya&?-sT10&kGZ<M2l;F^>lpnn^{WgzKOj>N&l!E+C)(0=-yx_afr?9QQdE#c9$e? zo;Y2@EwRhZP3}`D@Fn+cbfE*(+z9-te*Evq9zk~m@pt2!+HzqmaB_E`q5#y*)9F=# zM|dh;BAdVeOh>}3;mA-g|Ikb5**p_K;&rXB2s^s^cSJS!T*vilPfI}s{u-hz+7MYc zO!VQh){(B#?R8<fh3ip7FRx!m@9ZGIdIbgF{%X+&!u2(U6`c@VUQmlxBPs?{Lr7qv ztfnx#pl6lQM4myUFoPWai_@oRwzToDjz{9P8!$O%bj6|^M8oirM#tDTAzB45##_9V znpwwoF4H`sS)VCRcH#x%1>U8z>D!~Ok&A0_x{{<jcaA=kpN@OFGJbm5e!X@UG#s}; zR>_n<02!d6_~VW29UVRSa*=)?*aVr>w6?y4viM_w{4X{DYtUlh|F#YO*E!;U&#wZi z2ub>Y_fwxl(znRTyVP%PXag&na?e!cUkrC{Jkyg#p#9+nXl~)Y1uEFKGF{*ud5wPA z#{G=Oy8Eb(%rI<|@1d$ZOUeB?t`<q;J)xw~BGE;Px-{aHvSTm(v-SRT@+5NkchtR> zjHf;QA`A9HZFd&Q31%k}<53IWVimi=%zDeR!GJ8JB*nOemgHyMFjUn$p+7}+a@0ij z4C8i~>yK&fkS&zL>9)ymG`W661@qkz=Of4-2ZTC%3ZuY1;ZK>GlhvzH&uQ552z{Pq zAye6QY0uGDV58v)KW8|;+8H2@x*VGQNE;64?giEl$pL-%@yun5R?(u|n7cL!Q=ztk zu(Lb=xX&*EMts68<LFi}Y9d!dxbRmT+iSdS5mEKq%vE~-lF)Ro*3TLr<u%Tp<)R*D zvWIPl%(U|p8o9ZroX>ars+B0&{N-}~YwX+%bSo-jii5Gd=mh%gRF*`Gzby@Os-rFZ zh^OX}^os%;)u5^-`=dFAvIaO1O7!yNVXX<ETx~>2>H_hs#JWY9haOJeyX14MN5ULM zv)y-GQbuTcy%*epp;hmAJlMz&*th~~r|E>>p+CUNnBh$r@Y1tXpd!_2*1xy6n%Xlm zVLcYI4oE!ZerO%Z?n2@_`EvV9I}5uf)55I;;AHCVKNB+v^EfEiU-#Di;rr<A`SzB} z{%LOv+Vcn@_z+=h=^1zyd*tbCuhFpe+5%CDXDF;`@tG|%G;j}9CO7>ioj~w6ioZ`D zjNuZKf6n$#)`Dhjuu6z8qQ`Tq;OjeEZL6gqsIn2Te*idgc&B+^DiL(qkU##{>@y`8 z!F~i^Y?e;nn624aFfVy?AfoeIv+wJrz7n``*sl>ULT-7Rmy?qO6-9p$DF*p_ah4^= z!1vVbvAmS&S!S!Hwo_K<Xos^7FY!C)`Ryg`HtQ^h8rV_{`WOC&BIrtjDWx=OQR(gb zCRU1?8uMfPH<!q1lQ^cyi8-z)hOYFM47P2|*W{*%L)^&+`fj6ancda>=?HbHCz#&` zGxcsWVf=I1qjRtbwWSX??n5S_D)C;rWyZA~{+V`2@Lw}D{^X}n;iP^E+>x1_^H9Bi zbW6nUg5u0&(KzAcrk8v-Xk)GlON>0bwc$ka$q+@gy4SUhk}R?8nKI+~17wJ#qxA*j zqTdN~-&a8k$q$4(Rha+41OAgL<)7P;|8oNOEJnwFUjbZQ8om|`wW==|enN)%ql^1o zhd*O43^Lc<#D2V@5=fqo+yk3nMW}amb>$c-NsOYn7nvW<4~mi!DZgHHl5_LQmtcfP zP$`)TZLNJB67zkG5;WyZah*z)wb@@dmQ)*zw^(W?YNr==l}#)yJ>mVcZmW=lx4}{$ ze8MlsD7Q{d;8yhJJUq^LpCw8sRmp$Ag*xR}zh}I&;yyu+#r6xi6*3$b(L~uR(A3Wm z^V*^PSjBcdsVB)Fzk4~=xSLM$xd^ro7a0<Yl@A0~2GsHrWtiH(B7eLz;S?T_7<uc% z<zQ7R>-=j^+?i*Te9OgRp1^^}rmmdX7L4}}wvV~hjD+I)A;Cqmk}icSM(WUFV@9^v zJQrVeq4U5QRq`n_D@<O^P!sA}4@B{m4XH~Fh=px4D8S|n6%maya3#CjYTf5ls^F9Y z1G&4Tu@2N+t$x^nA`e61g{d`$?Z^)Fg%l0L_kI=wY<rWRLlbz9jA9_;npHknY1=g# zx1Az3evI#Z*!CG<EVfE%Gfi>d!9v<)6vtdFa=}e&jlZe7AZ1YCvw8)0Jmh2q;CPvV z+|{J+e4Aac5F2tgDfr}2)>&?e=ZlLPzANa9flkh)ys3RYj^jiCO`8LdP2_NGV-(J+ zw>9HD^QrQR$`c4LJMz|UUWICr%5r+KX-S>uwIUF<+tAFnJnH^656SQ>hKuYWL(&38 z;bL0ro@Je#y~Pnn<TuBKeg>8IcEI6D@g>!rQLKHJI|)Mo0X>55|Dx<IqvCGcY)_ov z1S^~%f#B|L!97@z!d(Nwo!}6H1a}Q?!KH8~cyM<u+=_y!w|jbKPCtFtdFN9t;1jj# zU-y0OYw!K*rFdk!^O0lUc!__#e7$jd?b%qO$V2(3*|xhONa8tHc~VOIb0}<T6}f&B z8=eY&Io!am`4g%rSuCxl^ac?RSaJf^nFD&M)(09fsr;qdu-xP+#>ktuNb%Amg$+yI zR&B9(b{3&umbcy&b<Fr33jZ$Gke9g?C>3qXnP5A@BNU-i4%1_V!Q($iRiYu^H9MFj zy$f)9|HW344iQgwo9UUPp4A&9<z0{v!#wdOU7b~fOHguG2&W`Da<j`j$i4XJW9yq7 zG8*{4seY>&$qD`yMI*hiQ9wz?kb0UyD-6lLP97I?gy{)jCY%bb0J3?3d(3?=gsLWd z5Cv7kVT2VJ=i5Sr<oh7cSHGQy0bS#O%P_!(-?fU6Hhph}-oG3AjTc3LQGj}0U*dI= z?j1M@0eLLrrMEMcHQgfcz__qeEX3DVva8L>`fv07JSM%TK)yQBc{^1X2}Pu&IA;^i z&f07!+1iYXD}~k-5mO;zYRE1R%r(eC5Sp0#!IeyY&XaMjhE2%eh~dPpWRbL4yJvFr zK3ln)#A3Ci<O&<gBb7J$`%s78<M7XoTq=}o0dFBkim~==xFZfaBzV+8A@yHgfZ8H+ z8@1QZYS5_M_v}?aq#<+`{Y`pr$RY|2+ZqBbRRE+v@X9-~GyPf6n>OJJsc5k{V&FZL zs@XNxB%Y8PqFZcbgs$`0Bl;sx)JsrZtcIzIWB<(NTy?q9EjTtBoe(D@h#HY}nG1=3 z(Bgb)8hfXfL$`P(#Cj=o0EUb#B<4DfFr<CQ#!T4AyeHY5ef#?pVQ_PJ1|qld_eJdr zRR<~Fr|><2km2UrTiM)T^|}115Ci&cKE}fkE3+{9q{RNThTA=l0i(Dc7P|M~<%K3q z0E;%-u2<<Fxfg<vnX>dI0o3Vq{6Dsve-!&6160$CeJQU&LvVOgK9^GaE*@|2YEJer z5I8#Xa1bsW8G^Zn8;FDMF%&tPWY7kQ<~I7~yYwm9YMjzWs0F&M>daF@DKp?;Omxo$ z<>@Pc6wkw&Q6&zlmfr$-Cg-}Gm50Me;mnHcEtKcA+bI@yrS%%<BN~TqU3U8XxN;BD zpt+gNX*&#?GGryd7f*zOlbjz=6i-!|mn8cLAXe<|GarJ0u7EEGuP=eu;;S9^W#vpz z-G6-Qa*&b43Q|pTkZl@KU}wey9Iiy_7%CWgakcF(()%<1qOqAFYgTg(xDV}B%2|~+ zl~`%uSGOd}>nwUd$-_4CQTIN}eyNtFnh%DZ-K7@FE{~0+kpxuI6y7bWB$mP@hYEPG z$O|KCN|F<+69i%m@Zs5wz^8ESV#Jx<DN|MlO;i|A1+bA%QP@meXmXih|0xqU_tg6V zyu5Q~9x@h^fjUmIhxzn<8N01^9P#a4#WAgORBMu%W=d=_NW9vk>yV)HaLNo|=1G5A zX^?ri;_b0CvNxl;k^lk|zsqS21C;LDzyAd~H+~L27tUo>on(WJqk3J}1KR@tpdXBv z()GN@@4VJqqy9hKEB-Oa|HsK0Y)uYd@RIYobnmbO^f}BGKz0{Te?;cFXod?{K<MJa z$cGbL>)UFdJ^e9`W`wux@q_sLvq`)E0+4u%4WFF5`A2IcBZ4WT^LnP8#`o_DI!v^! zlNC#O6FeVO=}8pUNQ;#PE_K54`gNd&w#F${0h;KN;Ek3GLj-*Z&9}kbynZR`r=6-# zbW`2mx!1V_ElRG$INN0xfW~0-C4m(``rS>K{h~s-t^XF=VXG%?(?s=rP)=Lx=V6QE zXN7w#KIhpO<yjT4<LdE@uQq^%2m<p;-X@v*V%7{!<Mbpu-*3V14dW=z(4CK=F)LSd zkko*Z%p;d%KC7CzPlXpw#?S1ed|)f4J{F-<%^7_1pfB`lN}t6(!mA&;V!h_a$;1+n zajM@RWuU3)oU+TwB~7vH7-bwMir109Kgp`pdcod;RjCDABe3FEHxAA;J?}=yM&%&p zx+->k8?5r?L-36Vp&Ii%85<zg3J=KBEG^)Vp=a4WG!xixtVBbrl<#t#pKj4W7T=Va z>Bguq!;SR@Fc`*0<-`yRENrT@zlr8tlEOM*uQ#*Q?as4qZO=Q64jk8tt8LlJT0+8D z836n?cE1lJ|807F6hsMP7z`4LslE89g=#+rAI^H?oY^zI4a?daXRUE))q2N2CG}W| zaWvsvB&5Us8(%B5JFughw}WcWgAw~vgZFC-|4S5fD{j7}C4=a|%HN7lcOQKviqWd6 zhoj!-ptq92YA4{ESrboY-I77Z$Z%HmxQ*2XE%QwzaaWlke3MR5)XQ5>vHPXT*Is_m z#RTYfV&e%1HDXx%pFJ8EmDCpropjfg@Kv|4xvLwW2DXwtu#Tq`^($Tcwty|W&fXg} zw_$$~kX^w9O-!^o>JE?<49M&3Cj7!Z!sj@DF5<W{JhmZuzE<g1=tG`JXjv8hJ4Qj~ z%3;p9Ey+TguFC@Gj<z5pXPm0ZFv_A`N1R$?U$0G@ru$Z?QHRp3P{=Av^-OyF-OuU| z3_!jBjM!EJ(aEjodC$On0@Xp1z3AIUVX7&q;YwC2ZEc>B;7nSHZ-liBX!c>ZjlAZD zW(O~CF)t9~oJOlcC|VZ0M8Y~i=2Xzb`={&2?dc=I$}Nx1YSnOLp`?4Zn(D!%qtJ*_ zVPWC1J#_I@mz}{lSSn!W1qy*NQn-ZYg8yL?`QPkPCprGr(H>6^ei_SnijgyqJR)#$ zh5z=URL=If%uD%Q3HdgkhFx^-Y%AMss(y^vTTa<`m3!+@HVu7(g3&ZO5-RbFY+dGT zjQiC@k@ZhvjIFuafb6Q9q<L+^X^;XhfF+4gBk;XfrRln3ruCHmuI{=clL0e3`1jv? z9#;tW4(lFMuDAVG)!fF%ReE%@rgRas9v$TAs#viiwql)JhxG)nES%IV|6_cWZdMh* zkdiw~^jRSH>4t>3$?N%zApscK>vFIyZ-X6<JX5+hu;=!xfzlI<3<4goGf@DUJU+q7 z8}T3jmWH6=@U>qlXVj~M$btC}rcJI>)ScMpV)c{hpXu{*#p4<XIrnN2d03eO$i+T= zcJLC)v=~&df2o|}?Da@5gxbh~CP+Uh0{Xd-OEhm)%(53v^Q843rMMJE!sZoBdc{J? zpV$0+E*(fZ6`)v5G!-p0i-}XOGBHg$vtdEZ4wtcbWv*hD4ZuMuOf+h;AM9UHnV(#d zRU;9mfM<)_XKvo6$Y>Ju5%adwuiU8ICI<zk?1$|xC|tGvI*F58PQk;M6LA#kZYG%B z4`JeDBtl_(h&%qyrk%IbG>dJ=6qUY^%!z;vOr66^U*9j@lUeJAITVCVv*7GPk_<R- z2C_WpWXaE(Q(UZHcg&1~Y@PRDGTm*(VtpL8W(L~{3W6OeN!(1WXvg3`Hf;3z?-)*u z@3=t#goB-N>3M4XbA0eG_UZvf)4x#q%KFHFp7JC|0q20O$Fj+;fLG?g>)k(VH7`#f zPZz)OlYGQ~Oj%xoxZQz`hyO952FJ4@7&JZ?W7u+n0jVN>>+Iz}hdrs^$ShRKhfK=~ z6&&|y@MsA$l_JGu{cL1+R_tG2!DMW~O`u0GF5ZoEB;)_Mtt{114%NiZc3iXM>Cn_b zN-V|r^TikOgT5kdm)1$isCS~6wmx9(SKC|K<$OiQ^y%aezcQdgUkwb(_7W!_BZFy_ zA|^ewW1?F9$ie&==4=C_H9u4skIht~c)k#j&-fkmN=KeHt`+G%VBcP&>QtT;tIeIO z7n7{<L8|H)<&vU0Kc7f9={t8HW&g2C8mU~Up+b?2j2YYV<MX|Fz?=vG#O#fXjHp3x z)Cy<8_BEa1u81mY|4}ON|4f<x<LLPxzua7seOL6d&FR~5TKMb~<TyV3UeL6+;f5T` zpblH%d8zvcfeXWE^X=CMwCqwj=tM25>|Nn6cJu@<=FGQ^O~-l%FKdEe%Eh*3tqr_u zcg@G5-EW+Z?S~If#0M(72!)Wi`p<-nR0tjY!$8|~&rF3J+UT5XC#|KFt0xcZBjJBN zm`Q@#IhRYLkg9B@ftVa_Z%whPU4v=I#+PYOXG$R(hfN$MawHNSK|&%STr}pZ4v%TR z<-s7;9i?jD_b0+V+=jsGe1k<$3aO>JDXWcS9WoeTxM9ZuH=9F;?*_+J3p2&D{w0K@ z!s;+?VpeXIp_VzMmkW{4MDsMYM;5haO8PY^SNs?;hb(QKr61{DMq>c<NpDAA<wflj zV`wOi)0sH5$@XtW&OH_1VwmQx9py24*;Lb5YuBjGmY6S7%rAO&KNDPI8hrhs$sKq{ zOG%d&*5;fLMV9(QvzphIq#(@Zt1Kh(i$8N9)16g9q*xq@v-*8@KlXLgZMnDP2pVR4 z(HR7wVadSLULGWCgROBDpmiyrv;l~#vt+LxaHO>*e=-E{yd_1&f60sZQ6G%3`wS4Y z^1aQ4=||TxC&;A$%He7e`n4suT26l76l%X_8Z_xQsejWUqAA(Mtqc6@#Md2#xK#NS zE~XxQ(6tE-PWXj;8(#7oqDjKi<`ipKsiawW-ffPuoE4YR*?H)V!FUS$9o1ba*^gk~ zhLN?tk%`CoUQSQ`QY$Z5a0lUZW2Cjt-T3*Uf958|ij(g^w*-glV)SNz-^}h0pOpar zz+hr<ovh`92ThPe*Mq@!_c->rGj!+m(%J7U(-$&fHQez==pP@;VCy&Vm*OqC`A@$I z{&g2#q;c_f_4(?3ci1C5C(iw=5BxN?5MXx9Ug_fxM){QTAV=MzVlTfE^TYiQ(^U?* zwQHEjXva-e$f8GR4?6kRV%Rm=T=U%?u7$z5Vn)cy$8a|LMXfurz@Hu3_Q%wF$ZB!~ z7s|{S3PKmi47>+=e0K69h>FY$C7}w%2z2PaK?;ohPQ?6D^?WB*l)}5QotUfa6x;86 z>s8{UG(+U&qh$i>>NRPkHS~=wHRGNad1&(w{{r@<iehc4*IdoLL2;>T*%SK$QXyps z0N1$3>Gp>+x#u77)tUhRNSG&!QY0g`v~SBRFfgz#4RrC0!QOdwl?r;M{{<?0_-ARz z|3*yOOqa<kcnNU6I=^=e_WF=h2G0Wn03>3Y_eceVgjeY$QJ~;`3DI9gi_RX(Y0iJa zE5_xo-^@G;Q$`+FCnD3D7Zui^l4`RjTwSua<bGl-#%3bZXfxNd4p~f)Vw(I!kP;K_ zU7>>yAMwHT+c0Eg+$u6#%BCi*Qcdi1_n13J%gNsRy31}<dsOYjte8B}l=&90pH2oU zxb`bgN51MI6dgNsR)Bt$TSyXJW}vA1;`EbXZ#Sx?&Rbyu%Z&4upRe{nDOb>nmrIg+ zlqakTDhYpYTEsv20qNP8BY+bQYZ2CWMztBXM0*Tg<b`iC1pYQgf~0<aft|PJbcb5= zk+L6oqbmgg^_S(TP7q5IxjI`G+i=Gv=1E+&!{YbDs3K>HIPrNn@2u?d842o#nTxpU z)2%N{XKad_nB186R7cuHEbnTV)!b>&^Tz{S`q9hA%~hlt|H_5`shN*`DZf}7tk#rN zI6pznz|xH>wn*|zCJ6sACYiaV7ooK+DIz-+2KS`NPh=SUafKNNQ3+}pq}f=f_F)q% zp68uE8+8!2wX)fHq9D{U&KU!em#iNe6$5W5shW$WG+z}#jxXxl^R091_g_)rru})I zMUdC8V-HipZd{axrUUuj-T79Y`&jRM4)!~b^XmJ12f2;lba2h|zGwZ00XZA%n&-y2 z+W28f9n$7X=UAWFa&D|7bgj~}WFHsAbXo6>(|)pKR->1JigLQS)XzehY36iS&2r=! zG6+&?pv>GGA1~d<BiKk^@&ro6GwgRn$PFLIQ{wF!k4Tu#@^`j}0v|)gTRcw&pu+s1 zhilOA{K-F0mK;Z<oKvQ)hPXJLe^sGUp&;x`@9jMvh296$uFvV>9+7Uo!0EbOl(WN4 z%Uf&*-;W)|pi8>0d4u>uAFe1G39+;=-V$JDGO6Zob<Xz-M&hGO&ju`KZc<mRx=?Bb z?k%b=J6IXOEC)m%#%nXR(_{QFi$0(DAlFjwMYB@GrISJ#t^W|2qSfJZ(t`0C`D5d_ z6Pd!85X)(cXq>f4<?MC#{C-!(>Cp=okt^mp282YPC?8&@!53vPso*`mY$qTSB`a&{ zjmTw)UX4+XRqr|Xk^1`!QnYuUuOfc|e`%ytE7^R)d*8BgVt#RPX?}wWV+KBShR%OM zZUY0l9%OkS{;<9Zq2vmt{~sHhZ*xF`g<a(2_I`rAnE_V`=q<EX>}ZP3`RMQ4lZOVE zZSlm};HNPjDVp~){)}pR?Jy(1wD;FnmSkZ&a+SZ$i{xV7Oti_@=ocpD$f{_Mr=M)~ zY@c2SM}|Hdxwk=*?Z*iS8FuN?E4eCF1$_u<PG-eh!m_w>gj;XV*Gmj7pVg%p!;+=z z?ebrADwq55^r`AzKhbOFWK;gKZ;^f2HQHV6dB>vNxtcwLD`HWL`#V>ju0D|4!5C=_ z*C+IonaYR$$+s*l4GWa7ziEiggVacFA(q%2zd$Akp*Oyks^q8-Q%%PGnTw#s0+K>C zJ=$f`XQ@Ngz?DvU@ujWy%!U~S{=E(z|M12AhsBTlRIg<dpV7A)XY7iZHKUD)+6tNf zG*on<YI-K=Ot2C1rj&;8OGCq6nw$niWb;o~b58nFC#Z#p5gOl3E}{t+GtPi_>Cn#( zQqgzEpsN;8<489q&f%>I_Ta>XwQz}Lf5j5jGK8$Xzl0I_@Q}CpdEfGmO2fds9h?J! zJmy6E{VxLqyG1)FMU8`Xhp!2JO{xH2FMPSQMNphm3n7-5wfRV=XY3vv)%IDv6wL$4 z8v)5uQwJ~$tS=ofKAk;+u`e0OwZ_RTlJiv)7wqY3h}m;0OSRea<x55FDbV4bzd>4l z+-$+&<37sE_3qyrav+<VABaWS)v0>0q=m=-{;S*V;(37qbouthh~{ZDh#qqfm6;o9 z7SQN4T0<L-#wDVnbDA;vTvZde!yf=y3B31g+^ccNtx*1N!jjkE+m`dNUTbn9)_*}h z0#@JT74G$+f(^4o$+6g>i-bq1mJeIJklwIdg6VUgxsBvz;>agsDL-B6uJXerjAKj2 zUMQMDp_eO*vb_4S)$n&I9Eu6#{(^RW7mAT%1SA~Ouh`)nl9G(HiD%rHpAKRwe{|#q zmJq3SyV@ODA@VLba@r};{dyJByLl#F-x?EaE=q%IRxb9CclyjVKF3`1iKdNxzppYu zGJ4h?KRL-lT#QR2eeZa1RO*GWzUkN)$GY`)c_wh=RW;C>E8B5uvzfym67$o`aXs*r zbAm0^-XIvCoharyrsBxmgO~j5^t?JH23G2L76vf(+KFSg1p$p&{>_L@Hv@XG8Lv1* z_jUJp<GG>!ggyGc1&)^_=mWf%We_jtrks@vV#H7v6={qXoyBBNcOY?T+|!th%xW;r z9qC#Kt>9YqXYI$RN?8s0`~H4L4PtJ($H?ve&+&CL4V}V7$I+4sjJ!V+A=T}N4#l}W z)GUlDmlGC0VVu7}dY`}6E|C%GV#v+&{#(fv%05{tl}T5F^b}<v)1LJ%VwykSSgtDi zjHPq^e#=FODr?qp2|E9b)lS)NdYb&89_)?Bp6)#M5{K5A{-LhEYMv0|lWodoG3(4= z_xlaEiGZ;|(2t;drMSSMeHR;5nA~aeUFnY96AlHk@U~77kAic-ur?8p8q6Yi%ky`C zB=@{>5_jc*HhVH@?}eB?QocnyuS(hO&YZxUS=>hSNfOkyo5UC~TcO`IoK9(zpwk({ zT(|ovhtV7Nm(F#);xP|*q??s<T6AjU4YdDDun6Q6t2_hmK#msrFnjTiwd{VDpqgv2 zBw8=2_Q`iX(9M;<R0u7S>bu{okT0LGkUW15lYY8QBJ@2FuQ@vXc)3YVV5}_phKp@o zu8CUoSBFPe#9iB;^`-OkG|8G>s1!UAF4d>ML)B;;X4`S%y_X*uyf^}!?^xi8Vbu5+ zS?x#^WMZlGUOdRXx7!zUq&x7|4FZtIiz<yXvMbaKdmUUyvent1wIb>4UeU6gjjiTm z^V;6g%FkS~Uv$5SIq@`JSv@`oZR>xU@pwAJny_-BG)mtqhDO)tM?r;ocf!0|IIqJ_ zV1`^729sxuH$P~JdpbpDg~c8kVad4W*E?7;t}(Zf^q<7PU^O}fwScHYe6&oWD%hc^ zh7(-A2gZ^7e$o!`18;uzzusfxTxM2*B2nG=bO29ywm8_PnMOx1WqZOK9g@FiP2q4Q zhI%xx_MBFdC)2{PnB8yf<}G`_6kwfAxea0V=`<0ry6+c}pxFHsVIZNSA_Sn9^JHZc zuQf#CyAu7>&-5l<Ng*1m{N-x8K5d3Pu*gGQ*6k{`$=cIkdD5b+Y*g4HKw%Nm)JEql zTwNZy7d>-CH(mh$X?wU(f;_e13ct32vVRT)$f%efed`|#yTtD7ZzW0?vP_+LB7Uin zEveNvrCQmt`L^GEaFBY@{CQ=;S{$<UuZTL#IJmr0=yAx&#Pn~^sw8qIPlYf){>JO` z4diufP)rAS8Q|UBVYuotNH+OrmbvA19A~Ungx4g3AY{%(iJ=&W*Mm(XkpBk1mW?@= zL_SuyO<`{q!~dh%IGuxh?+Os%x;A#E!xT_Y!aTmo&Z}KE_Zr^Hd)|qbUTbMXOpQM@ zx)S|lmMp=o>wv!!+dNLtYs#D1&7(O?_v1@uV#7wPTB_QE2@1*QR`<S7Hz{AX7l=+G ztNoHhZkyeQn=K1NsjB;NUFpexV?cB-7{jVfZ<LNj&Jz{-^!I-qlk@1v)SaEKx<A(S z1x;nTVy~n@?Qe@+ewPdrAwKJbtb|+&!yTpCcF#coae+1Cb!X6akIq2Jo-5y1Gl27I z1?pP#lHKBf*GX#fVUudkU+HYi_It-Z-=`Z%X_YIq9W;^V%y5Pcj~I#2Utvb$niy+q zhy}@`YCCYlyQ>+R<wSS-uzCWH8Aje6CV9jN)Z_5@e<@2$-||L=%zk=QN^=LR0pkXH z@DjvS1|E?#gzDR`TZ^s6o;#oQX4S?4Pqq!@*xOQyix~q3yq^W*t1(C@=wdNH|4p$T z{B%sMoFkl3z=};E)cz>dANnJ$MO~oY+z)vRc&ed>%md#<<nK0D=sorwxeDO1JF{`O z;DN4e;?)iJDhM|N)-d&yMEnQ_R%0M~EoP^$SRFjxKCN%A|5?J=-&&t*dLH0^+vVew zHYU7(wTOumeFRg4%|0S>3vx8z{|kLRX?PxzB_i#KI=0%`#xaJmVvqy7d5F1E954X( z{mh=YXG2N5>{Isb%&KDvm%$gkL~^;5y~vEtPn{D1mru=IFDk#Ep%k!0tN-yW@W07S zoA|Navu!#zXyNKguxiI(dumwdQcMQc>16Y$wAyM6QUe@!zZ9?FFLL?f3f;}e?j;4- z(rdm=q)o8`sMw#Hd1!wx2qO^=i{;k<9r1SO<*fc~3JsvG&uTK@{@h}fQ?02+mzj#* zSiloak@T%v{Bz79o-=pTJg%F2%t_W;OD*NZUb-Y)7XtI2*!?nod6mX3x#-3tnea*{ zcsWzLY=VrcHsF&tjVrcwA2+ZCzd7Mo7sWEI6yPpYB$${uBSs|j;Z~s^#dEYhwgJK< zII<2DJ77lhH+06zH998|@snpJt;+<+PY62^IO-VCww}kmc^e+@hX(=ysYrkjbUhFX z6M<_Y%8tAKT?sgs?q6R0m&e@K={?}{Y(d&mTU3;cLBPYn6;g(C_y;eEaLgq&k#13{ zFS1&ad3scM*gbQ=?;!^dxj|1D8)B|?<P1)J#UH-E8$c#P$eiv$Zk$WbbnejHI*f=; zYCyZQ{kRdotbs*em2vh{Xs*p9F=`-L)phzxFw#lZw3dgY8Ox2ml;HN0`~3R|FEkn5 zfc@-WAjvX!-M@s1SGgm6+Kp5)uw;XEMB#T)Pc(`-rt@la&uZ7l-KfTb)(^?h7F<r@ zRMBCb1O>&otf7|W$htX66{Q`N_pm9nHqcgS4j3za#|~@nLi9*xRqCX<W1kL6Ky|H6 z#B3wxW(46}_KZKR$azW7{xSaHBDoGo&%5i1F5k5kY>J*=qiY;p6Lq)v<}oh*M^324 z&blsu>Bl(4@{B3=u$C|`R?4ni>s_jL<<fw4<&KhHE?v!g(S@_7DBn$156V8uQWYUn zfsGlAQR?kaB>0C@4&^-5s9<LN07YpWYjOsMFntW<BUh)ieJ}5KdiZv$wtxeIL^tBA zSWu3F^#*45%h{4BWWmDp&ev+Hx%5QR)JcF9*T*$vAniq`be3Q@3}TFY1kgG}!;GT1 zA9po<?0)yO9VQ-;fX$1VQ#qd9E3&}vDFKf%eZT#8J~VWK04Rjm(5*Y)bB_K6*MA!6 z;Uj0im$MhV69*l`yO;0#Ru+7;vqPS!q>o};{&Z-n;JGjU{212{<2R*N;rEM*7qZ;B zB)H!u53H<hFX+-8FHWLmglyhRnycsdHs6CFu%6^Q&~^5tzqY|k8>0F@_cWVpe(D_m zu{?a>q*iZw_NQVE9Al2LNmGy!vwI#Z5^HP2Kh;cu#aF*_@wy}}s*Xk)UBh+8*r&s- zf0CefI3HcFuasW;hG^xOKX11FSu2j%Xx5%ozFxD>7;B;@Ta`t02N{QU#l^K%fv<eN z%18hgF&=k|BD{>t<)<kZuk&qU&k`EV!$5DIqo63#F`N{RMTFS<1G(W(a~FnZUX-gG z*`^U@(D<LkDnu!d&Y{ZQtFEevtkMa>@@JgtJ3|Z=9Mio)CkBso5)%g)9V{k;hFC+n zZJww*o*Ta3s-Sg<sl-jl#N7`RL$_8uB$Fi#sPQb>^8Ekh1yJ?$@Gy;>-LVF~p2A$e z4?mkX*4Lo8VD#{?fB%^k4?t2p1_Pna16H=9xj(Dlbi31r<v{KQ;ds6~H$2GDQ=*10 zGT2$^7NF*w!E{wIY9|ZiRjFKj;##6Hqt}<*W=h6r+7ZOUv?+P?I+4chGM7pa3S*sH zdDZ%6Q;aHw=t@<+Qo4J5U5pidok(B9y!WYKN<T)jt3l@V%%bpEH{Z)|y`h2%Ho-`t z0{%asu&0%4abMSI1M5ttCC_Xn0f8nZ;+3SE9}0dV83V4^STmK@is;#XBeh|g!PzI? zleK};a`ORl_?j5#rpGm2G8#zA$fv+#C`PM2vWUd1EN&3Pe(fm~R__F37r<;v<UHq3 zN<1bHgnDjePk4)CRAtFYCC|%EXQ+9}aM}`T5hghvH3y1c0#)>LbkjVS2lyKLjmDMI z40lu^Ci2@H!v{x`gO9sLgHNuNbUXZCvakN4MSpOq_(`Rz(-cS+#;!kWyGMZ%UciL` zMUJB#Oyn4|6020B`mi2Xu_HZ<lc4Z(PQHiAO{|OcB@d1An8~*DT>gSL3aW%{f6Oiz zmXk~F5Xu$84Pcf&ZwRE0V8u0c`(OfacE1&^?F`Hh=*vzV#n&)>+C&t-V}BcDlw`6p z2Y5Cn-kNk4p+T+T2;p7<F9gk=e14G%p$c=+I;_Bm$fCz<wU>DA><oN)-rwqc8F+cv z9#+QjP3r6Y5_H)m2<ot8qZZ-YF%tvX|8dT!2sJ~A247TKhoguFI9E<Q_Zo(5V?;dQ zk?3!o&WMm_BA%*_69a|vUQ{QJ29*Kti=XB!kvh;Y464YWyOV)XGSK77#*6RrRVt3< zKj$-vsP0B~0At91h$s#ba1RbR>#wj_9OIkrzjzBQ9b-{6eXLe{qG;fS!DRWMPaj2- z{@SvpDbHeegopxd{X-Z5cgsy^eH?w7aWz*5U&;=+1e8)cj)Yn~c}2!)sOCvW_lnTU z9J=%S@nrLjehN{N7yWivR#&zTRtt&&|ID#?{qjS|oVolCX&7BCMX4^z$!1PMCsOM1 z0Lni;^Sot6vuA9}%wB7wfv!|iZ9$xxP;i@qarX0o%C3K_5kv1KMH0utSnjFuZAt}U zWY-NhYQ^pGR$;@y7wzz-e&C6FonB5(u3G7J#g+?<{@1E^^CS#>=q0P^ygP<bWI-FN zPsdsR-l^&*g<CtfAr4vJ13m5}KE)hBqR=GN+NaW*UxKJ27}F84Ib6r3rb`cpJO|L< z-tuo;0mNL`$4UWD?lP;o(diMquT|cGPTB81_DcKNW4fA8@}++>6q(^t77-X7kJc)f zieD+O{aLRUpiaMLby|=<f)y)+pwrLMh+9eS`~7|0f!`l29CrfKtyv`^-;>19U-<1; zNzVB%S8@PBr6Kpx)-<$jG0S6ijoIS<XVT1(-?qYIdDTA6fTqXWHEMOaUPr%Y7`CJ? z;9b<jj<OkrfN3LKDkda#TB1`70=TLZG)#lGE+OuXB?e5qrGpjp#|4(*a3n0-kX;=5 z)n~q9nK4hYZ6}E&dOO0z{iU1dpXRa~G%QVDFLMohFu;9XRXaK>L3P9r&b$o%6(0|1 zRfS!B%wEOjIf<TZcT?GN#h=}&q5IkHNYus|Y~cZidK-T}-VWJKMJv6TLqNV#>`kU0 zJGph_GTuq_R}gzIZX-SWwGhj=^4;eITp^JY;hUjG@2`H_HzCx%604g*)XgbRV}o6M zn6)v@XOUCSeao-h8FP!mC24TukERM!1%Lz6aWf3$4%9m}-I*|66t9Gx&|W)E2w)DV zgy%s3d`9llO}4wUZSBnxumZ=mQb=G?N<d}rO*%N<HQ%u`3-M_E@C6gbgH_gB7lg$* zX?b2`JvaK+-PKtxDBLGSo|3&WA8kI7pR=i@?3h{Tz*g1MqFsxw(0~n4E!H9Ht*2#* z?!KMv$9PuM7QKw4ahAc9d*Lj>>|V;&cW-uNl|l^v!q|Lxs^0^kpx2tNyKB&8YmNWf z#K}KBzXZX!!S+B-bc&<@yaX~Lv9YVxuuW2l`k_v+Rekp?c5()Y!*E9ubr@{>Mxpm7 z+jCAdsd0IH#>7d4q^)#~T-YHQox>!~y~q>vs<ta|9m_0^c<hq0_FosexY%==Z5U`F z*dj5S4ii@xyDQE1B_z!x27inyTQoAy%9-s(1oRirWZP8_huNf_VWkyviF3A23AqOy zU-Z2Dk|#tmKPB{soDx?qtDs_Ym|7uv4p!ad{sriYYZ+F7>n|lP#VL|))7gnTuq(}4 z>r+9~3joKU(gxdf0>Puqn3%C?n=c+7*a$9x*4B-mDJUts9``3ZE_yNU!5fpkRZ0J@ z%<HF#`vI1qc~pxrbIN^C(+G?z`c@_0y+*cf*)1>C{<6rx@}L8sKyCR(P$Q5zR}2hD z5<7_}v2O_^P=|0C1tKySs-G=^gb$s9rjxzcSxOX3<P*t<sosog6PuRTcdUOZcj2sK z8+ARaWA55mEYD(${spRYOWB33d(0J1{S0z<dpv9hncF6qe8x%>(g{2F6hM|f%FqEZ zii0?^=B<NBQ-$}}MRULyZ4x@d5I0;!n^uT%W_0AwS+?L<sqt1UO*~Io<LY?_G43C( zl)jNauZ4O{hxg&<4BK0fVDPJZVV<G1uN@n-G;r*H5#6+TUyAQQiy<{(04H#27Ju`} z>_JwZ-&-`*7o#x6gOS|+j+}@q40(|g2(OHJ(*=l#whBj6f}{n9kGey<wn|x(S?R5T z5gPi-kTe1?_5(U2>WEyF++Z|MV#fyhl=k&0$qoy_aFf#y1@^mrrT*PemwEQ%R1Y(* z0xIH%QIQe{MEsmMqn}!o6#U~Hz#{$=GR=38*8QA8_uq0hPmBYU&s_Nm=v`>>TDIV} zzMpe8N<+%H%|$Pom|1`y47NXj4rOXW*`n#?V|#91m>1!!C*5R}_ycUJU6EMyY%V?3 zS`rJuOBNXmqYrpH06Js&$a{<}l_8?_72;2F8Og)zy{j<P9;;|tNXw=$gzUoiDAR_c zRfLIN2Cl2FtIhgP4)dRQUvn3KoQZxX-`Q+4Xo2_r-N2)l)A?!InvxdFxQk5*peeGm znAy^5yjb6~gAd@wEy~+jb`%U1Zam$%*RcxwyifvMbn5YXd%TDcGf}Ni34XoWc!h{x zyMb=@YhE%uF^~SIP$qovi4hMTd71pb1mj@1;OUF2=hNw(2(UVivhayf2l_7%4?g!z zwIuZH52TTV+QprDjJarBpfEB0OF#jJ2i?yB0zu)_EM+x1>kg@kd{$K5=fm<E4scB6 z#>_n*^(c*SX1|;)SIt=&s46V{x7FB-qc^gCa+rrn=l=6d+b4{qo+43kc4hOoqtZ)8 z7mmKg33svCeI7tIonI+s98=Cvq$Wo7s`uU6TLI7YdJ!yxmRdli%f^D+k`6D?TztsF z_`z7kG;9wu0chz`vf3Y<-r92!AdjQ!c=hsJNDSCI;JydH_N$4!4w5;qwuNC#{!@DU z->gz4-f|51xIU%^ioC%5zDgx82!sVlQ}}Gevuw^#qeG6scf=RfuSLq6=yhHxx3>Dv zMl-fB=sB!Hvb4p(xmzCdgCl1jYsw;01;p{Hl3CIM)9R+oX_<cBaCNs5z|%sV#tBP( zmhQz}V-GANs<{JU7vB<#+$XYi#IKiEF9S?6`MG|Br8f3qNA15DoeP*%X?dA_?2BJ| z%VpG%>aY|z({*4)Yj!R_Hbd!!aOPJ7w788FW?NKg>m!lO^vL+F)<?^YiYN*Oe;W&6 ze~J8>_d^U*`dUCMB-Q8DjHpEt;TXJ%Nz`-?hI3YjNlIuwuhk5~DJ8N<CZNk2gVIE( z5+?$iA*~Bh%&A2dh^2KsG|OAHo_xetk@lfp=_pYB3ISE>d0f8KW}Ii-9%4^w-y~$K z@gt{hM6QTj6BTo1+vISYVF04C{1NQ{;|3~I!kN`b_fvv4OPYF$;QDRnKnBam!!Bb_ z$7jMorXBQ=>mi1_eX`}c(3(&7Y@iyFR9tzRR28$8cc#X8f8g<QpOmm!!KudmVAf)X zvutJs_;~qzFNdfhi~%@=esi=eX%c7hzf(g&O~j{}l9Q(bPi#YUve8&p?D8FHoeIiZ zu!?_&0~7h$fd^b5xHECjp3``FV=s8bZE)2Mel3vn^hP)D<veo$i<^Yt`ejbjPtB*W z&&-DhBybcrjrvd|E=Hca#(TgYLmk=Ub*~e%c4_fYtx}BBtaZJaaHL_0-$1&wkxp!! zHr;ymWPc6RI|lnXP&$skVGZQ>8XR9X3w5Rx2tpqmZuWEoZ$MFBHz%AK!3)Cu?!W#~ zL*fXdUAJju>Sq5-Q&QtVFliL^0;3*22~%z@dp|sFdVwN;6W%V|WvLjcvNkwr)c(zn z@BxvBp;Nz`fM$6JtrTf5_v08?D!yJJcYe^ysC$Q+G4hZfLnI-3i*nY4?r^}}Kg;pC zl?q8^VWBov^DEQ<5%SAJyr(`|o*}_j%K<TLgio(5$7f|`1U_4vu$PkARA8FLIQX4V zhn_-nXuP!g>3O&%fq~@KP<f9k18$$T!BYPjrSI)=qu|vf$<(w&`;>liXW#?`N6phk zm=NH|pV><SG&Y*BiWw?B@b&do7ZwwHDa(C2N(K5Hy`0p<ys7w~zNG$}-u9oSUp4xF z(YFABelG_bnH>;+U&J?6^%pc&$f7G!tMEiK1Q_}egxm1qw0%wA8mR`F(FYgb<3y!^ zIJu`v31GL-n!uPb?YDBJ+nT=zlg0Ee`3i}2VMZg0&JPn7IYu-nt<z5Q(jSUO?~SIb z2G}xc6~nZSojZg$i>l^;A<ZHV+l36@r;{TqW)-1l?pY4f(72h?PYU5r7!lcqGQqj> zQ>+%_r?Tp~P_hq^Pm(!h>!1$J-&6fB?^oZ!LjdluWke^}P&Lj)&?2bmghnIqU(N>W z;^5eUcAgY!H@zu-**x4lB!+^F)4xf^2X9qt_di4F3EEhlY?N<0>`@(C+(<Y?IbxI7 zz)nBSq&zTLQ5DTo(Exx?;<wxTW-EHVs+vU`%W6U+-y2H{AhxCM+hz(g-AOB3ZGvx) zlLIxDJbS}~=|{}nn9Fdlt)WPoUk*3>m`h0KlqR$ERcyb?yt3RdZ@U_noE0d?1GP1- zBG4b%%RqbI4KRIX>n~GaA3w#0n|n_ep>7uKAv=kP^`Bw^wI&DMmG??Q9IK&2E1q$F zZ{a=EzYPSKl7PGlm%vel5X}YPVW?Qlk~9MnWZ~|CmC2cTjAbxTviqWmWR)cox-D$U zA%Y4I3$aPuh-LuIFcB{5NT>jPE6^<kc&-aCYpyQKaL);nCphqU%I1AYlYt1ID6FF} zb6_+pWT3qX30BEG*gW!Jbp5i(^3f`Ed>YlumR{@n6~XO!sg5tRe2<+K%|$=Iy6bTS zW<IKN4m?<RJ=vflFZds_F+nu7$OsFqKEK0!wPF36!D^TYvUT3i7o8Pj-0sl57=?ga zNT}#5DN(h(Jh{@fWb^a;YLg5y8!aOI!p|_Zc_6yl0VUOP&;IM9v}9Y`0n1F87;lo0 zjN4ww*I1ve5+*yklt1EJ>}4r`$xjs_@w^@~V@~WAhxXS(R^&y><v}W1<*}BAzmi%C z-!bvGDjp@WU|Z;z;vS(8TB6^mkhS7AZChGS(w9K4iVQN3e?E@OjG%^`mnaB4e|wx= zphJO3qHPE`#o_R{&~15IE!fjsI`QqnIheOxIhHm&dWn$j(6Cj{SL+B1`=>2#NP1m( ziKJsjB(1F(4Fe(L_V?%h$78^kdOnDwFpazMf7>bl!>{$9r>L0go4L6SDrl6y-9|l{ zjlo-|D4@hDyz&)W+|dXCI4tz?u5fVj&w~s~Af|YwR$XA(9(#**4{J}*jZKtYaCjlg z!x(ujku;t;*)_+UXSMmcC4GUotobxUMU?C`3nCt&<H5?>U>O~qw=TyhEgW)J>q`03 z2a(Z;GLYFwReEGtq*U~3MwN{LdLh}ecWyz22q|L(Y<tSv#>kWX5i=yM{6nQQogp$h zNr7)3<C)bME`B5nO)$YwlBg|Y!@Xm%VR+xN(c_q1+-(Xo<FmkL&kV~ub`R<y1w!`? zH#d75RSCF3;@$y26A}<?7xRhDEcLB-+@Y<qCcflAbI@MDg2)Pw;$OOlC*16Y3m+Wk z@C}hi;)$hCS2A$1qCW*b;TJV&$6@8N`7!B`i~exuv@k0=tcr;!QpIogd&k+v-hY{k zxqD<Okk!@vk?Usqs(u2=u8PKd<+Hhoy?I#f-OSMK4DPdVU{{uCL#?UyUZ0dW{xpuR zN`oXeC;ea3D+}F<7}wBUSf!Gb(~U@S4Dyrh^8&+eu=Lo=?N~RD$7KmT<{{?57Y?BQ zur>Ub(F3kD{Brd?{*vy$$VZ+FFTx*wF*_ectx6yx4&^lZ`$s{?436((SSiH@Ffu~p zZl!Nb<b5y}@LQ}QXyz^!D3BQ8eFUI%=hnPa9pz051B$=DHRKu=J#_#z%YZi!x!Wz- za#ym}PJpN5^qYu<z~^;$%a1UF!+!6KkM4mLU*q^XWk}nrkiP1;xq3*1)$LS3RS*<o z<Z&>IZIx^1H7pE=H8>c7wa;quM$IGe$n!PE`Q^#k|K()Eh4(+rz5nYCF1YG#%Q|mS zRo}0FdD2Dt-o(nKrXG|YK8<y99x;74e_l>)ul)oB^?fK=*T;I!GPuPf^h!bLq+HWy z9Uw{S7p?5h&HAZQ>3vqmcU|+dm8NVo+-KV-10cL7N}<~!C3iXdr`OIL$}`JX^b*}= zXKLhzCo~;8f9@I&^wbz{`=a^=I6aOoC@t*rt~+mFP>?x&aJNPJ9l8!m9#Tc9LANok zMp1uL$;$HTiQ@5%5Fw$j=Q|-q`=imb5}@}w`^wT&lflmMVrP!F&{maI;sH7i9^IS2 z)o%91PNF_CC@58_BFd%LQ9IBp0)q9x3mZP5p%GRO#E4B7)}3^04=WC?s_{c^H+Ww* z`ftyrc(}jHK;qB%4O(;Yw}oD9?NXI+>nQC-`xw;uMj`QoeuXIQ!S&(;kq}A&e9R75 zd%_FyWvmlgw7bk@j-K!>f7?jfb}uz8jOQNCjDPE$g5pgfOlJ8;8a<lCc1Fm_lWaF( zeWIPFo$ifxKv|elm<sayJLmFa3sSb&LoI?Pg1z??nW=b}F7DxGiFH)$ky+lO^MB`n z0*dfVmSm;N#e2?7D{bR^+nqRX;yb5WMzYxYNalu<3M{6#X%uPp4?i;5N(!YN-YG1B zlI4YLethVW9m}?U%}HO0x$T~Tb#2D5`n+-##-S>^6v~gs>~!0w8eYUrWw_)~CA&gV zQ9HUHaktT}XYOpj6*yLe*brh=<tkIw^`s<vAtRzvVA%fR#dpHmk~<}4ldq>;TWD6a z3d`+OL(KVIZU|%#)WZm$12+o|A)}`&o9U_(*_$zRDZINWm9dZqVvYt4HC(zf>Ck=r z=9ou*poXV&ofM0>v=ae`uuQnwMGC1QdwqiE7$ifXt883j|1iap8&r!?T@@(CluPjS zhXgjV0|gaeCD{D+YUNcpSA-gP5p$V~C>Pc`&+Tc5YSJ+cPi(-m9)=d(2i);hg5+Yl zXy3uJDK^{CcW7Y}>GI#F9^UxQV*2(`cY$EV=M6|;K(E36w2@nY36XFouRu5d#Ga8` zow$gw;Ur%}_O^q+w`IzKl_+0ko%!YWiBVC~aLp1ew{yBX;l0%x3CxcMo5lKU<Ex@y zqxf~;F7h2L+Kw{K7X0=NfRNE<*fu8c7i%Cz>_2C%U<QfJC*7Yp?|x-4!6GvaL2y2X zVm=ptU`=P!xZ*xKT~E-Lb0@FjC0_l;nl5)G+m#fM7?@vSx6hK`(g%q5Fs0S^xn*p7 zLd)@jeAdFAl`_GjHHJ>M#FEduwKf*b4x=zHj<MDC$OV~3#8p3$boJ4R#Uee~4CgC> zg?$}n;?>M;Y&v-sJ2m!!(wk7WBXo}Cldr}wYjM%TL~NfA?P*S)#DWq@S)cVT-yfFB zx*3~KcdrfiRufHh3*LI?mzbXCBq|7pD-xl6BlM&)_ze=X1rk4yKFA8lhf8Ba1_&${ z>n$`t36Q^F_!QGRNU$RrS6(DR@s)$!^@{p6%mj$}$V6ASFnx18AIA)}^#v=(%l*$g zMe}qA&ixy7sxQZc8a;LAn{_e7>kgJf6@ImClQa9^IUC`PH0lcrSkC_*LpMxrT-j1| zXvKLtH<@bQHTLR0HEZoR5y>%~8e-SV;QD)V`}k<Xm91jUeF|IQwtIpDZVIXVp|`mt zn5z{lSOcTK-@SYD1|cNq|M)^hiNph=V+P!B$Ad&+Fb^lLSqzxY3>>aPSW9TKyF+R8 zEnWVuwSIcdRY_R&Z9WP{$*F-k;yd|54L33>{wAU{DX>H_=UZ1$_%!d0;{Id+1C?5^ ztn|4`CsMx3_NK||GiO$6qL(RGdXLr$Iwd=;6PEeDdGJa^zz85HC$OL~Q`w4+$#c}g zNGKB`WCo8;h+L?H>CZ1pL`q>f7_ESeGEiH-@k(4AUg=yobgZrXx&;sBIi@FRTgwvU zX)zBy&y_>fqO<9aE<W0KSVp!1H#vegJY3ht>nwi%b!RgwqxR4}j@%_4pXdC>4FhnN zp4_U(VHw0Nzv4j_Dt`pLZDgfy36s~>$3w)nU!gyHehWREwB3hByibGj**1j7%l&%I zqU=lY#G8E=`or6;qH<oKgA@v6H8hzIf65%|w^-L>JPD3&vS!zbFd7(i>2A0qqQG>` zOO~!6sf<7AS@w}aO{ps5c#-)1M6CB3*E)bcC>)A!kj#r?wG+L1v-+Oi+kX)$zhZ4M z-$N=UZqX|NWls_;pxq<#BdLA@PDp@idMsyIKH`rSvAKF(U_1o<)X?m;z>yt=LyE|2 z2qXW{?P6Hny9W?3$^#!z9?IQjg+Qe}*<o7|r_*991TE0zSdWh}4ix`%5@0QE7~6Bz zS(j!A1cuyHi2rP(aPg=1`<T69+;Q!9pMMTl+2m7R=tNNX;=rTlEOB!7-6Pexj7^N| z!iIRg=i_=gYuiu_@9jO_9B>zHOQ!1M@mbYpGa@gCMoh1*SHd?s$(`T|=<OE!^TNi{ z41duc`!zo`jidxFE)o*_|NGKHiVz=QdSvH1pa}bmSofPWShnu|yfgpqi3?92^hvp< zv}QAzyz{9Z&&Km<Ti+{t<meuQIVBTdA_EI{O*|+XA=tCiDjLLG<l17Ks0oXOz@6Fr z9LzD9()F#3|GPw52-h!Ts<X<us)l}gBouJCtaW<y!(_MG!^b5@Vo+fO6Vb^%yQK89 zQKpLa*5Bf_@O1rlx_Y!fjKzlpIqtZU2Hq@Vzi+fOE4duBG&Yw@;0#Kq6qRAzl)<QJ zVpYiRrn-t>in`sVeZwLeEt-S5280#e#R)=***{sQPE*?;iHKRFIxytUSW_meP4^<( zNBoB+M@jf~^8uX-!j>MJ>liB#&g7r`)}`~5u{|Z&L#*rtT4jn<{%`Np|N6fDe}0OQ zP=G=~Anw2u;5_UKzT?C#+9%Zyf0zBOjx=2hbEZc?$87?(6?AYMF@<di6J}iiW9xV5 z@}ONzFuCQW$uawLfAcDAKo%%a37?Rg)LGYR;?v1O5mY0wa&c*h9*V;@)wKFKJfctP zo80e8`hFQJQ2}XsKY~rB<act#yRpU46bt9_`W$m{K3w4eA?hSd2tenn-Fnp_-Gf7( zKryU8{Ofl3DutB%9p>09R&F2#zyH)!tnZFk)tH>1^767U%*p8c+Gcm@kZo|%;vhKp z0FVJ<UUYe&<h}fvXEetDYSe5^hrkhOkZ1k2XQH?@0hcrKG(31LVYZI8gocMKx84ut zhc>8XV5zsJD15TH;45|c^|5@<R!Q9BtLD>Ixu8!_?~5SsQ?OAPK6M&ekJUWAj)Rx% zaZQpVy;CM0mk`OMD|NLD<mS@dXyC0@u%XHoU}c%`x7J@WEO|;ldX#`X5=eXldSMb4 zg`*XDrUdb4lA_8I;V~GaMz&qyxW-l0z~s$3`|BREMrg;`QEbVD>L;VC82!`b`~05o zA(Had?|L4-OSvJ>!Y!J=h9Jf&_#`M1J9-}fvY!*mfb(;#C<EPu?6153roXG9hqI69 zOj@heqbQr_Z6szXm9vZEOzY;KJC#?Fc$&{uLHQ*-<||&l?w9ZOIvDVzd~c@bz^CLs zFu3+#UVyKyl;>8nYlgS?c0!sb{PS=sE-7{qli!P(_U(dobteYPCGbstKW0~4e{W0s zwXVb8*Ar?fQ1Z*cA1Un>S?_+HVe0B0P_*a#6?YW$j|1f50oSI3=k`G=iUIa0KLpXj z60!GSkhk|schhs@cw6Gr3BfP@IyQsJ>@UASj7~WigkGStx#i6hpn-csZ|qr2=3I#6 zQbl8Edxv17K)NQ3EFXMnO21!VHk_zZL^>;m6SF7rqx0)<fyVDh%j>2??ds>biQ~Pd znXbhHu<K`l;5s<C_^++^91u@fAGlP77$qj8RXg~CWycrV&uLbzL)mr2qNwBlN5oJd z8o6(nPg^JJvvCqRpoPtW??dR85~52Gb@qhoe3MAM+|H6u!_n=Hpnd#)x9s$ZJNuBi zJ46)JLVg3uyhS-ERRi5E|I1J@%A7kI@m-5B>i>A2{@?Ey6%$hQ+41x1)7oV&bnMY! zV<8N`wOb6T_6Y&6t$~N$8|H()<*dc&)qC~$%iBD)5=rNpTgVuQ-md($#u+bEL7f!0 zZ1TL#b6)S*Sy`tjDEyag!!)8!Qm<q}Cp5*3ufF=Y#aORl$4hN#S<ivK>^W4O@xb+C zs{@5&wl))WX+43ugQ57yjIa5A87^aAvdA8T4A*ugX@nq)-eeh%CdQ~x{wir1C~x9- zi-r+V208)V^M^U$851h8uX}PY;&zGjV)}1Iwut>!D^SOvx#??)pNW{1+xb*CCtMa5 zSoa?OBM2CKL_uy6+XI2YXTsWw*_00k%e`qEUFQ6FL;xm&PBLl@e$5&F*7d)y-U<J* zr2LI3rubPqMfZw&3=)Xsb**sGkZvJzb5R=LWyScsv$vVVttsPlgU=*W_80XdePTMg z(fb?o#t-!7Bqdvm{n(~d$J}h0ZdRfUBDSu?JWS(4n7p(%2*@Xld@_doYE_%+_qNgN zBWNc*U$>c%-XJyYu{`otE_aAY4jm&&0mcQW5|ihErR`r_?CQh+wmLpmyzimnC=Z$| zZ)->^Anh4#BqPAZDFQxitJY0_p+Nj%DVkMo3grG81&4{Mo{s`zpvSmDqNhq*{=X=D z3$8k&Y*`cwZoyqbaCdi?0Kwhe-C-jkxVuAecXtmSWaAdx-DUH3pLfr==e+J7qu*cn zzBSjHRkNz*nH%ELBzL&2{uIa`mN+oQXSGW_9R5`Ou#D!XAkUfpTF`~B_%}r=w7#cd zFRdyiK6!$?vqNedaA*$LID1gJW^<?ac(!{IQ|f`+z2Z@SF^%(*)Z1!+>%{-PF+)dC zjo8mG@Y=Uz#Oj=1RsJm%CSK3>;nJc;7c~9Yp^2I+C{aQ=5_$km3x}(4<$GJ(dRa{C zeXbOK7-r^m8dLt~7bIx(r^rFaf@u_aEcg}P4vFov<0H`*=z5$c^qs$1a%eL^MAXyM z?+Y%J7tJ4Q&x}#vrBR;PS_Y6=_bc6rjiOF0H0ZbwXg4o=Q(6ytqEr)puRx(Ap*A(4 z&F%4}sEM+Mq-c`&_fG&t@@NIyn9amH(B7-4s><0TBsA-0j{+9ebvmmu&JBrcLPSr- zKMl5(`LOzGQzgk(;iaV-h(#q9*WG5;aKNq&u2zs3xbKqhr|QF^{Nm|sZkXc9QnAVC zJKxZqs}+jAC-2f?vNreicfD_)&zL%JtMum6jizRQYl0-g(DmZTRVZzIMVo$k7t-qI zc3gkD&U+dIn*{z|Y;;aJMg9DbE7$=BNBC)Q%<!Gma_i&pH3r10(fyep;*x`mE(jZz z&rLNmr@4m33Am1aoop*vzy7+J`lws}`5xCd)m5fQVzv3PmL%cv^rf`uh`8PfK;P4z z{zWPgXzZsr>N^tuWh7(Sj=cr$xNX1nx;;jwt_ChT!Ih*&q!;l7xSB3YCo#@Ksq~D% zx~K7FMmjWX*_#f9rnJO_nyVG-HBB!Cz@T@~k5O0NKx-~Hy(jy3we^kjxpg87T03ml zVXXBYuMksKtHGgsIFw7({4HQ;Gip68IKR_Te0K|VdYrYLaX%|z9uZ>+S00@Mlv9a` z9yodeYryW_0Sk!)-j@c^#bw9(#d^haJk&~;t2S}iJipDQ;qH1!Z96=@v{D5Y<UD)y z#!4bp9xbz(E{n3A;$jm45E+hkoqjd8c()^b@BEDK=q&a$=1pN2A}4+qZY4KMP_;_D z_N+r7zTmFuK7v}EWEAPH=&(#Xgeb@Z81O)BVa#d!t~VokSNH2=UG9dfyao9Ol<8D8 z?a$a^G7UPViC17Mmv1X_bTupN^6(b#w8ouFHCZWbS4g|<h}S&%@5psA2~<`d;DX^F zPtliQ5-u-BUC7J(g%;(faTK`pZu8CS;DKiKm8Zv*nvVJJo`}Rw9U9POm%cVpak=x? z;`7Izk+@ntczG4PutreA&3=bXx@<wOmCrHLcd3~Io&H`vfG(ZNZjcpAdGLUM2C>_t zeg(D=4-*g+<l|ezwID)5`UNR;blf5|bLT_f15rQ7y4zUclc{HvrS9u6m~4GhD%`&m z2A%&!NS|sz_-BB2RfNv7y*ig9C;Em672NlV4f)4k^o3YIHwZ%S;7IuroGY!+eF|Qn z!xP~id{Ur%8=#+PGV~G!!w}nES$btu%1IpWnvZEg&9g6uLtv(gk}@WXgz2gsQNxIz z^|j?Y%xE}r<<KBNTs}&LtNRbqIraRY+oaUJUvk$XnLU?6Q&F8cwym-F6>=T^Xsjw# z0E}VQoL$p+fn!mzLYajdbR$ixLP~#f>ySvk%YKQwaxvd?8{MdDjO>^5?)KDgNjzL- zf3JPIN6^@Qc{7)F?fso<-Rx&L>M?paQS3!ra?;!|@N8WZ^z-V`tL_J#Kf;{?Uy8vi zV=tZ$0XNiun?*)F-_&pae1H89<nTW_V9|WYpl7rmz;$h};7igaHot(JqXW)oxW1m< zSd<Yj#H|!v&dg%6B6P358vh$gjlLYZ#p<b5e;cZucQJaU_hLdfd+*+Z7VXIIV~Q!+ zvRU?=GP4B7BYHNe2!FSXCih_T{_I~$XI8PbB)b=ishQKa+L!e@CHH>~KRwjmtg%zb zz0Yfvn`)>LK%Sq7zsV3KGfzykoSRSuxJt+M!j_{u%W0N?Y&5O$+QolWd(b_vTDngN zI7jirgS0%)H+=NJ>3<#t0UOD*SFVbPoubc~EGFvX<_qfp2(k>Uuv*Mr3@FRUutzWQ z-2jx=N3(9OGsCwXZXuiSS)49R?iib2tm717#6as%+67f5?bWzkaTNLYv)L5ST+VOB zu60Db=sXfWrstk<so<fmPyKRV0?U468hBtN7GK?o)5R^EAwnIZOjmPS`*83^86up) zo3@`cInyF5TPm%-lI&FW^`r@Pw~gad=SV)SuAKM`jyu#IO1XCB^15J6@XF60nC1h< z6Ex2z6RJs&8vIq6@37!dEDhP0Vjww+CYotv3_Ae|896!1S;HLdOhAm(Sc}ccBN9I! zf7`H#iA>#~=oqM5`v}q=`nK3#IdI&TW<)KG7W0E5(4fDrr)9RtP-{cuWJNH&&$DCq zugxMUS$YY`!_w%jCJr(C6k7)r3=wV7D?L2!6o|{6W;s(1H)^BGkUE;PKQ(=J5HOcl zlZxh%hNb|WP($DW^oVkNvJn=&gl`s7ZERg|E8)tAtW^h;r@C@(R<bt7FCQBwiLe_X zeQ{YZ-^FFBLFom>xlL>-$xdw9gzg*uU-bHa&Y;&X_#&ong0uNMdf+3wc?myBRTy;( zhj!5$(US2S*lmM-8_+D~X8YynapDAq#;x<BS%n>;HC0A7qpkdCBE1~RhSnRu@e9o2 zofw`Lz?oOH;#i-`fo=3oa=8gXaxsIhwA3ysAg8w7qNLS>GgAbVDlVvOADvjTsp7-6 z_S>29>XrgjTi|^XQ53?{aE*yWh?JO-TyPSeP<!R{jVdkruOiRl@qXL{vR{~Ni9WI2 zQQI#)dxmZvpk2DiE-PlxAj#O#%IQMQ=md7nXhmTmMIE3zZpx$6z_FwepSE_9P=Q?V z4pOKWuUaF0-GO^;Bj9mNspsabai$0Ka+=CcMEM2kpFYd~tkD03`_Ul3y}uV;MuYY` zB?~SWk|p$13M>z=hY(Sq9%?6eoKVi+&G_qPy5heo!>1!Tc=QjlrM{f5H=u%(!Iv}} z(5GT*(gAp`Sj`6IL>uU}Dv{MD2*<E@VvioWx!!nuZVZF8a5VhbTT6{P_^xx-YEDp# zgIpT+%e~%OnQRO0mTa=TGwEhTC0#(-lC*vavl4b8cG(71d`;RDM{R~A+|C05rL1ow zUKY9D6JNClmKPZKen-a)Smy0yNbgGrC-*|{adNh<be8^Y1WeGTy+nN_Ghai}mA<dK zb?O5y_g)|dAKBs%!~onc4ZBRM_}?qY{~^WbGW0R54a>~^)PQ5K@RW9B$H8S_Q<60T z+{>lj{&dA2mNhGryF~w*Y`mSfF~#F(V70g#Bqm2jhQ=mTlNocG;jA0MMvpC_XuTMO zQQq)V)W^Qz+i{)oO1_#Klkww``8%K5Fa%J|rzmxd+8}2xB>*b?{caYgUYr{;vw5-J z1wJ%MqWY{!VsRRU4C|A4Whz}ZR<JfVCbKczd9pYz&7x9;f~^)Eo)KeK<`1Kf61p3{ z_YPSt9wXW3wao9(DWaEGiij;-eBRmxf@z|`s?cmhx0)P*2(YCuttNeE!>vAkwIk1j zKQ?tk1A2|WdWlwQmIWA3XA@UL&!>3vH8sxWoy=S`f!GD@U8GTzxRuJIbkiLFs=~e* z_*Ef$&~MzdHeR@Uyqm1idw^5iDrx&CuIEp7j;Eh*HyYnfJ~>>~X`vmgjd@$TLh{vG zT;q5#RaKIxL_IaH#xCrOoil$seM)e6Ml!kj=+tlxtXK8DeIj?Omp-1Kjbs|E_1kyN zdw+J6o7mb`PSXFU<LWgBFEB1yLY<TKgbM=`<Vgs*ar1c2J<_qyTw|lAD+!D$?`61W z$_F*@IT$OK>4HYEDSW<j%wgo%+D)@O{H&Dr*hJPFgq5GpqA;y$v}S+dBQ-c1DtM(# z$=BXW*4i{{7h~TYPljrNUy@){bX9TpDDg8p)jUonMLE`Sp)5hIO-Q6L+SM#ut7D8e zQDKnWB+!UwJ!$7S<$Z(niYylY5V5XVbN~Ixp|NR1k-h`JnZ->BDg(OfTF>~GFX}qb zjkZ@k)chA%)IOc%xN+)nze^}R*zd&S<>k@7Vn-Ha-@7HAwYB0F;1N*2h1*G-dvp|h z{kjvyyxHxW7NTJGPdNYIvd02YnJ=%STO{wtkCE>>!t<oc>2*<->Kt(SK0$PWC}Qig z&ZMUGKd%E9On7D2wYhz+q9@520SQL35**xBP&!7Dg<3i*ueP%r4a+R4=;KVxOioGE zf^4Ytz7~<e8INyvgrTW?ijx}71$SVvF#Mb>c|4Rru_KZKZ4o$a!Wx@cV6*D=EF{Bf zf8Ig^1$CTd@HJHUoG!r?D|Ln|CE9sf;A&C%CTL-cXDs>$+EmKSnA@{v;e?7D13z~{ zHSQJ|$licGM%3j)RRXb_%*cRfM$QDBA%>qkuw-x(OYs5j6I-Et<eSXRANuY;PtTQ; z0>FZN7^5$qK?fxW4pe9aYez9eU1UlJPV9MxF@&~wI)5>Pq3L(?RMEPHUW72}6#9x< z2UV>fj^QSlH3D#QPn`5Bs=(_ReZFV!g#_9$v@WtZBs-0ZTOC2C=Y?JX*B3?Gpm`pw z=j&8kdZHT)BhxB8wA$;YLuf?LpGEqsY;AQzeFw<ehaB|0vSAgmYU()31B+=VKq!%7 zT5<1$N^6`gtob3Vn;WK+{#aneF`r{Lle(N`S?<ZBT5F+f?<i3FI`caZ-Gb^*SY$e8 zp6;&_mxe<E1Arr7bhwv2r={1*?0bOY`GS6-pDCO_y1!%GR(rJ+H{Vkb9D0~@jbUCH z{vLPa@%{9qQ=n&71Sq56kPj{ISbtMxw>0V&_$<W;bSm}0bPs?%ltk+?L=VK3J03x= zU{`;#|Fr_mxl(qaQXZkBUp7%qP|LxM4>kA!yu2IuU^2ozJJ>ugG<>n_y<f?DJt!6W zkQ5W${PfSwo)`CLEBBn^4Fwq!aM#@D8{BtvV<*4|@T#?YK0UY^^6K5bF=x^|#lo{8 zr<lt;_@(J~JRdg44(yQifA4e|8}stV16J`C&fpUMxM6BOj%@rs4psd<$we<Mm1D$d zDsi0Qcu~uz(jpLniKYXDxjWank4C+4VlfvK+)Cn|?lN}F>jJc}SCN%!=Oy1=uNc!a z$bc5~NLQ3+uIY?rw3APv;casn>lhmxQTnOwn&`s&r`WgYYU6y;-Jy|1U(Z<zr6jU3 z>a$kQYfjG<IBJ4fqw@7}Mg+m2c5!Xvg1y%NU|-2^XFttQahII^Kd(n*D9ZcCnI27# z_hI(;3k&b|w(mq;`4*QXmaq@xY00rDfBBF}V#aO)j4iFhQsXV~)6czoYw`%7eJ>SS ztB@SiMlsmjyq)`}EK=Dl2d`1-ao?&~rxg-zr9wj%Z2WY7I23_e#(HI?x3tV`Cn2U! zT4@<~8z<Sd?#HdM6Edcs6!tR`OZAGEdz(qAm~rD=CSQ~&O(Bd)+)Z<o1NG-!X}PFj z+}o?vQC~p9NuHD@V$=(mCb>_U;Fa7dyr-s%lY2Mjs%4>!gdbnRM?v@9CGdkdx*pD^ zc-95vhJ+8y1Rv8t))Au*0;;Re@O`_}_Zt<Ok05t`2+YoJ!k?A5;h=4BXeP`}@m*m! zT-!1tuHL?_f_%qQ=kLw%56=j=__{Ko&?f%kUj^vw4KbxQPjsSKzBj4nidW*umME+T zmOG&|s{tlyZ`G_S^Rz3){Zq>=1WF=)IplINWeLzPP&w#9M*-cwSrPpRr$_m9g{Ur( zX)gbph`1cxfuS;_*YlA`y>qy|k`Ffgop4uG1z?<nh)-muEN<=f7pWtPZtR$NE3tq7 zlPfN>nF2VQN_g7#=x%K^YjYbGst#}+%x4qCS=M{yuTOvSh&gy1dJy6K$=~YaLzKl# z@3&E?bi2`0Z~%&8YwOEymJM5ajM4%W%(m*(Sm<I)=i2)B!qcD7er&?Rkd9uh#b{}k zz?F00FsL8dZrh}S&$c<cl6Q5B;l31p^HH@~w*n}UW4~Zi^gs{PuDH;twmgYRS!I~8 z+!4VXk;0pGIX;6uNiuxiN&DEW4LIlS<>Z;GJ~qevUvr!P>g~1#MYqS(GB=a#D9gZv zihu=7-)qh{De$It!asXZOM?{e>=TfcsfXLvI{NMPh(VT44+;~8k75|An%`I^zoXbv zXLRC?1Yy>YHz<}6!=*bX%RjL2F&bk$02qrE%+SPLr=n~6Gj`@*ke&Ie&xXr9Y;3F) z(5I9E?b$S@Tyol8?Xd?s#^5pVORPz2F-jUVsi4RAQ*78lg5P8X+16N-^z<W1cUcut zT`$2N>b~mn5uAHuo~As9kbD?Z;HVO;b*@9i(|L8K@6OsU*kluwHLE8%_ZEV9$eyo) z!8kT?ep^1Tkb9%j(vtOI+<V~tkb^6JtXWf?-6Ss%c?O*i$9XSzNX!C&$C|4E!dS8l zoPYjE|Eu%;@1}!H$_RAu$P6kwd0DIO0L`(}GNmExZio8v78wDd{1Gik9T67JY6zo# z^kcFTfwN{FUk;i#85pOEe_0#5drq2@G!Sti$vZq$fTa_yt;Z$}*(k&d7{A9PnFOaE zXjsiJ5fAJMe}%1hy-wxwPpOSrP@@p-HXMa$mBfguB0jq>Xq*uwQ(n2^=Yd&Z7Y4M` zbHM^o1AXFnoe-*b{0TI3S&m0PmCK$iE+>y{3Y)S3DKwI7BwyBhCu<UX;OpL<1JB&g zal){BfefeSSo05^@9V3$4-Sb(J<I8Yr(f$DthDBsX#;nVMwmB`_ra@V-g83Kf7Zme zTwh8Y3-x)C)2hW;!quhh3Es*Co&SxfkBX5W8!VNoBixhgya>ap{Bz>1;1C2glZ{At zrT>}B9Fqt&hNd{tBP|d(M(TNXM)A^QT{msb<*qzT`9tydoHs_<bSkKh7`MRQ1d)jt zu=$<%P&_gEaBir)?(@uYsV&B6B;{4#j)-8l>BnA>!a6I5{$Wgpu6ZTCSK&}5h(K<# z3bVzpRpb$7AIhP;H}f<~ZMl~|%Pqcg3d1FumV_98x%d|AM>_DE8$GcAGvdKT!n5)( zCpRI=*vkY0k2?XrmtX`W(uG&e+ki(O#7P4@QANaj48t{iAE$z!l4GFIfvM^P=s{tu zx&rnqi+S%B-}i$vY2ezD1sa@<znK9UM3#U@nNfb~5-u9Kx19bqaLxMDOIJ@l3G=4T z!|cRT)APpmJR~!ESelLC_ucAD{fZ4S*FdD-D3^~7%7;%dqW8Y<Ka&e$`HpHGz)Tar z<m1ci7RV7)S?jl}DSSW7oHFs{<6p=Dt~Sa4oCMGNrsYb2&u<WQFqjl3(9hoReT{kF zG=QE93cs@z*O8)-2M)TUa`S48YW5YUk4qSSlWSSA-=U_e{nd^uL_rPwR8{1jV`oNK z1$FtwUj4Ln7kl1ai%O19BBQ|fJypUQbEKC`Hk<-pW(LMgyQk`p&ur7AOC#j&UVFY2 zeO}RJxI2>Z?q^-8xU<UbWP}GB$g;k;7V8D%f=nhFpNpIDlARVt_J*YlE#rs2sh>vh z2Yc99>(S)=#TkQ~L*`kA@c}4C!<!I4yt1l6D3iBQvlf*AMwjNzWNt3RX057=4dE<i zoZai9`SY5ktT@2iE_kG~Q(4>NbGld!5B>RHe3^gK|8h_mmGy4nzYl|{ra|<+#@o9i z;SmX<I=fHEXHgc%1=yNFP&x=6w|s4-`%(q<uME)>ug$a>G~kV3vLBTW>CKLB6Rxx| zq#lvjBYPsghfKL&`qn)cscFqh@*xi4lRFMGTEAiAmEy`12xR>rKyq}#*g-3GlV0d1 zt)eJ?t3xPCwvWO8v`CI`Q#r&|<W=V#u3}xZN9zd2uQ9q`?2%-|ff_UTL^>{6sl6Ek zl{$$j$&_CYy9xBF70%6|Kgri_q*4nB&MVbF@*O$oef~|87!VfUW<Zn)B=zc>2+hkU zOKsC_1gxdZ@R1waAiz^j?np)(+B`&2_5FnPYdRr{0iw7;FYYnL2Sh+eqmg2LWB%3n zndK#c=6wQkQ))(5`ywlc0$~&S9YW@Dmv*G>uk0j;Q_xzI3DNDCypGwfpuYuMBxOv* zLBh<dLMRfNJyS$7<MDwdBiHkutKwu>0+-TmHd|@F*<nD*ev&h*jQ7vj!>>8Ifi$Oo zIwCDi5wiSNPFmy!n;T5==F$b)Zc-_eGP$^|IyRw1jylEbUaqx=n=5YXkxI%-_iM35 z*q?eLY1zVz$3VbB4mdnj94HlWv4=^MQW>!@Bwlc`98Hf}FD+nsDNl_4r5OIolfPm~ zRoaU?+VBfRNM~in!1jA45BR}evlY8^)?CX~EA>91tm5rsVMez1s&t@#KM^6t@H<?| zU%5m&0kN+&65hg%cAwXMf!I1yNcdyXAfS@PKm0sT{O!HFcx1`5aMPo<6aI0*WicZU z`()tl>yXO1g$*YduvVg{VK!%+{_NXlmY7^{D<W}Qh$Nwe{{8bEiF+i;;K^SJ#gXWJ z?(%Iu@9CJi_u<~KDgXDscw>SdiGqGkC|-I8B>qGGBOnD6`3~xT=VqQJQJ_w9TH_>y z71S&2KhUe9m?N3!=MR6BKbsGS(vob5mI^EOVKHuo`pv0e;8|r|TK$}N4^`BC!`{Ww zo_`S|X~{YlxRBfBn}`Bytg*>C<}@eYqBrUSTqo%o%RGZwInnwKU+XZcieIxpU7gI7 z)JLAqa-cILdCSMfuiRKn`R23JAoM|sTP*I~yQ(_K+IMIkeMKr4ffLbcRb9$%b2?u% zLld%X+d!jf-d>cK=cXyE6olaS(a#I}`X0b?6tWX_?b6)QMZ|nC@odt*QNVfyO8EyH z<vJ7a&{&HG`*bb4@;^l;|CWgQujjZXIIsi+%5sbYopn;);|hgq7~#V;MS1d*5o=6k zsxm!z<EVI8$_D$&1?e7XRf1`pGF^<!{eu(?*Fic9k`fu)<c8ds3%6ngEnfN0U(?R8 zhN}xZUqR_pj4W|3)aYm6Z^tilko=1m=Z6jw0=A8AI?VFk>ahE-HiKx-QAav_oaba0 z2y3-^oH|rl_C|&4S*sjNA~EU|8#xl+iK_s?j|k3R0;a880Inp3Zjzq?%8Mx|Y9V@& z4ft>tE1^+tr_l7OUUvI80oJLOA1<v6F+zqYj#x$itp!N%tr{&_=aHy_UZQ+Wi_16d zoC>O+;4Aob#-{C5x6V;go_H!BZMXsF6&}#rIDM>_lX|vQPwu1rP)q5#g4);e%}Ru- ziq|Vy{(kcYVSMtqu3wyh=ajvA=kUehqWSljn9qKf)_~<UBj&I@0-@HvV5wip-nnY9 z1tGP&PXwI17IpcrI*syjFKd&T0{f_9>el+o1v;3_dgB~%Y{5lmN{$u{5AOKJiO-9t zU#q7oVPs;|V_lIJf`_(KzP?;jKXF$%K6Z&l8)m`NQpk;ghGFnWg3874w$;KtRUl?l zTeh1*S^9Bp2ZI^8uiR!k9<}a~+*fBO4T`K1fp2C4M#X^r(m!<I1<t2PbC;@$^xHz2 z&>;d{n)-guGz<B<KZAu#b|i_6lmU6)yZL<wZ}jgqqAVAl*(X{R`J+^u1Fzg#MQpc% zR=2x*)5U_9oa?<bas>7D*4JbBcXKi;1Qnm;-P_eqzs<r;qzPf+*!a}&AvNceA>F;| zSHzO@)Z(7_l}ed%a$k|*Zv6Q5OUTr7OMQ*vewEq(9SCl*ZF`@q`x8FZ4M>5o|G9zO z?v~2`yEE^blRNYeUTQQ1qWP`+W14V*Bgw1RNnZs(3;+3);~e9S|3J*Z_k>wny2}u8 z(5nQeVYMQ9;#fk)i8oblGUfYjVl}-B5xmP-k*kajYq#1IHf4?h{&OIQ{Gc0&BI{W4 z&7wKi%L|3%t&90=<EP|rIw*|uM4CDq*8@7X#_m^5v-jCBZYx8g>Cw81PDN`KG-x9s zxAdAT&AUsX^5khP4^Vz+oa{{JL5Js*zj&qPv155lV%FY*_Fre{HO~x}vA{_=CBXjL zN2>W}Grlzk&#MrWyKVpaJcarxQlT!9T4VHJa=?9Qz=<j8>(c~tZ#IqM(0`7BtI_{} zjqxBuDF8?i?9hQ5V#v3Aw_cL7O3PJ8_<^<JA03KSCC(4u)?YND0;q=D6#!F(1%o2& zs|N@8@<IyENVaoS8>+x>yKj9|9UIFlSn}w{MJ2z<PZ^O%w~`ig@NXxRPlYeP{+SF> zrq@JpoSjN;xw$ZEUxG(EmZa2TZtj#Ro&FN)H}ds!>k2hT)7p?+J=|9X75syFnSD}U zTlsg%E{TJTud3EXk<DZy-l<1G7Iq3@JwE*rwWxu75TtcX)t0jG-$h(*^OVj{Giy4u zunZL3Mjs7)=7|A6MA&CQp$)@ZsPJEO9HM1oJ)_G{9ammkO_zJY*A~&XspOeqm+F?> z1nAS}1@n<lW?ktVX+Ab=lrz~&s#FXf9zgxDH>egqhumltRWa6Fxc$#nisM|Qk~31? zBe}PVG<Ti(m{d6C4x%!Yrh@UbIiV`!Ohx!PES2zc(e^e#GS7`Kx}It7cy#$(aCv=0 z8<gUSMI*_F1t~iIBY&v98WFE;#Oxg-U2e@-n+`D-)LVq81QqJ8M6CdCfh6T(WXK$V z)>SfNG~R6R>o&|kH>dBzS?kHeQtjUlNi|aYZlW}*S6=MSiP=_|OUIFv@d6>vQ+70D z1&_?@N4k40m_3VP{A9J%*}b;G+fyjT4fLwZ{JXo`Lh#qUFg+N;Z$Ue+j1sSR<9M$l zQ~#8S91{Pjgg~&l^GI-=;lReX1ON@j%qTDKnTy?PDFjtOhoTbG<_@)}7@gQVON6qi z!VCgj8w9p1odRRj98c@dd`2|5HXGkb-*xj|2bleC(>}%=QIwP$?f%7?>{9w{)dso~ zn$nrW02iqTd@>_ohIEpOVhKuuNB-U2+mivV7Uhz=Z34ZKNqffNb6bf?K>2j{s+vCc z4fe|E_s?V(&3*YlWVk71q{cVY|JJ4*qj#mysz|$(ydz~O_`uSd4k^I?DniUtve(C- zV>6mTbrEgGu2=q>r|)@6E7ufh<#(jr)vl!sWp<E;eQU5A!ZNw)L!nt8g}C>pjyR0B z!KJa5s*rQLAzXkr7z6e_4qpnDePr{*4BGaaQh$wFH*zs|=R-sv<+1}pdG@vGrmp|K zPv=G^v?z2NE3v=*+9vmwPbq_UZQs+UzeJh|rSmIZZ2bJ4eayt*W%G)yuNg}LFT2eC zXBYZ^->Ebt|Krka0)ycYfcv#$FZ;{<7QGWa97<1}HX^3rz7ht;&IT$=6rs>vawInF zLGn*`JhU@$rW!bUw@#3bZrCHzBjn>`%Jxs)Nblcl*n;F6i+)uLhRobzBi@#(h)r_D zABz>hF|XeWk`a3}L-j5_Whz@=^|(RJt<jafefDK3D;VRtt+YAOAIS*jxq0>;6V+-b z=?myUfG_!6hQf0BvU=i+F6G#Z^KH2Q>PoVGiB<!Of2NtrCcz;7CtojZcMJ59W;!>T zXC>;dDdMB+K4E+o!tV0j8VCB?){%>+je!0ZrJLoKoJ@BQ^m|-ht_DDT@Le!lLO>8X z3J$m*q=aHw{g`eY?YL$(*o_U4R^fbIV%cVBoKD5~vtRR8RCJqxQImLxS(avrr_-gp zash{`OB^9<8D|>Ib{I<;Mebs89A-a2jm9+1LpltGKJb63P!k?aDYz>*>H5^=sHf#d z-JKNiReTnSa4vSP9Q;{Sb5&b1493^#yc?EFrxtS}RT~=rsucwLL523kd&rK)?pAfB z?0`=6lKc*whF@CS+7QGs4KwcNl|YwRKhzsV#1WVYqvPEfWg#uapGw)0rseL6i8}FM zA`%(j&y8?G60<6&!o=O@>i}a(4$rm+<n>vblw7qct;roR2K}K_k0<F5nDvEY&GCWh zz8lJ+{pdpK-G#*AJ=}|qArO8YJft}E=z(E5D47sjDyB_ug0wipZUNow(66}68<=g& zM1S3Rb>pJ03B4E;+?`ttt<=C#p`EI0%~X#}r6>Io=cOHtR}KXauAJu;Q7I=5YL=D4 zq*rGQb%T6=csoNb2Ic&BDh=OO0U$!a=@KY_G<1UMpM~;$uY{177z?lb>SK!Fxh|>* zSlqaAc`vAWNPrwrf&zHj#MaF%UNLvOX~pKt9I|bRr2p+xGhwve-;nBq-^R^JK#-H_ zQKp0Y*~>cAWbUWzimMhOmo<j+OOCS3l8m@kd+4YU;>*~ZT;-l$VKHV4vcjzUq++~` zvNsmiiBu{(yU^rtuiQk8iT(&v^j92PN5-foR{x92h>SwCM$vD?_Xnn;zI*Ad({ql{ zTl-A7!ApCXNXp~EuqO5t6$|IumMQN0l)F|J?orkZRx7B45?cXzHEgz@3t9{u%TAvC zgmRekL*_$!IBZdy#=N*PW-hjbp#{CV4JeF{AJ_au!vABL)H%9H>DFu>;BjZ`E$SI9 zU`v^e&LohM;19&52gJ+;QzZoPV>|X7xwzb<oD8FKT}$eVEjD;LL$-Eme(|9;f`hJo zw}6eZiGwl2?5g$&v*exQm31NV_xL!In{kDeF8LfDGwkFn+Um6@$Bds-VX#xV-*hM$ z4rmH>2XxL9KLr$S*yT64X&l<n&xK2k*xR2n%l<^ndQ6oq@gMVkU_Kqy|Do`cc1@vs zvC-o+KiOs9Vor?uwlrUm(zg6e@3p8QD~W^~h7rimLmyO<qB%XagBD&ABt8l0vE0i` z?ey2<(fz$>FBuSbvG011q1<%z8>JKI3n>1%3_RPKcKTHl2Sm9FAcsNm>L$i}a4bE8 zKz_iLu@`~IVp@Ak^s<jHED_*l)=R$YxvfvsaItLg61z4EJ0Do}seR(05ls6|%*oXG zXT&n}`3zM*^liW#!w5h2d7UN8IX!QRaDYqO%iXK#5uHexb|waOrAn@{B!nyUYgV-T z!8Gh~aY<8Vo<d=PyJY5aGjw#w_?dNmRXD2eJL8|V-_R?ts?KBHd$NX&09sb`ELAI= zc0rkVlBVkhb!}4&9ZbT&jwdli!+vMJeATZxo_aiIczo%CD&0LL_bQi$$Yd?UbFRAR ziG(n`Tt5spAn_EoWB6EQRBmy<%;l!n9!T4|Ln9k=@@yEKPAYnKj9yMn@A<Hvht#co z2Rn(6vDf+opr2!yEYjXrjyybFs&K$D(GUXbcAl!u>7ECU*tTHd8Q50<pZdaSSY|HG zXqgFtY?%+^NoH7it)_ngv?$JVJ;TX-lrJME?<<-=sn}4J?tN1Nyt)cMPAU0cAmK>h z{|oBoN=SM;GR<%EP+it1xGxL`tf0E=ejhoyL549xg3_;J?J`^)r{|%SGA!Azm7Z}| zt|{*||A9lKULB!uR@{7&sq^im$(t|XH+<>^W%-p$j`KIfJ)md&#_e08g}jg{qLNUy z>?9{SgNb=-Fb;Y8n=OaQB|-#~HnRtUNO8*e=g5F{o7&F-g)*xn?UyA&IN1W)d5rOY z<$$bFWF@oEhiXwPyweHv^9ZYj?RPlj60r7Oy|8I6ojMscaBXagzl%4cCTJzUjdtI= zC~G8(psP0mzDfNwk4*@$Z|zvQ^sDFN<qbCKUI{ey<IS{Vsb5h+yL}JvyacV-`~w?@ zuypBF*XVaXtlH*z{|&{x*z6`uqr&)a0{UMt2LF5979{?e#-s99_+?|Z_tg;B@hzwY zh&HSFSStcewg_<z8EzZs-6?O{p-MbyGQQbQ<!>uPo5)fu?h^ZmblUxXY?D)aZ{Ye| zbv0Ywi~p1STm9o6n?%1<7);zNNhZr9L^EGGC6#UHGJpYrVuYZlNPDXYd%(rZ6zG=U zagnTu*G)%WtaSUll05Tg(J%#zkn0jfNOi2vWpNGj7pMV2jckuZA1TS~Bl|6caVRxo z>g}`Fs<E4?^oYz?RV>U#98SsF1AQO+GZw155x#hIqxuHp4-59cb5=7T_axCqFV8gP zsd@mvw9y;JYZ`o?tMZhEdgGRNfd=u$Yl4h@8MHlfM6nbRa~H*PdeJD<0!@{$2u8)< z>$MBKDU-bLg|DdW)^lhF_n)t|=J~7;7%Ev)IBShCVxh0cV^5<8fF-{@vm<n4AJ(Ca zmm(^2U2<j9KZU7ORA;LEYP*<q4^>$ITHQ{M+=mbuNs%bF9qGXu3K?^(W|Xu<eSve| zPzT4mXUx3Ry@QR(+bXf?=ffflZ6vrO5k<OEFDv3;*do>$sm6Hz1vz^+`x7}&8(zLk zx)E-vJWo+iH*hqVYhalL?1hwHH+FjoB{sP0)*t;5cEW+my8ugQ5BI?A^GW;{?;!E5 zII@!#P?Ldg<~-`u#;dWdkjb$^7QiL6aaz*Dy>Ms6zJ}UQ{<HCZ6u7lbT)Sb0aB|7W z*->usK2_4F@*0sjwQzyawPgbRaH-`Pm>0L;Rk&#MW+HBD2sY?@l`JB;Lv}EG_3Emh zaW3Jy8GZc$899oS?*MyJocI2w+4Fn~I3)G6b^1YI_OGT(AwT*k3|^nfQs~+dp@i4} zuc}I0nR=>1C+t!Fi+^Z1<(auxFOwUSd4gB(1-8+mD}i@MnOP0!h@Npju;?w+{8B8t z)wIy-XBT2t!evLZ@kF8^XGQ$fuODBscW2?7>n__JOtD=&t+53x=&F%0k$<hOi!xYl zw>h&QFtSZ9^C@QCtXEBt?F&yLlAipjE+*lR&A@9B<cg!F2Re|Db2lmk!HrM$&mmOB z6_hv?`)gFYiFv&$AKi1h*nIEVaF}gr{R+AJu&$#Ds0YW_;8ij)Q%3<2i?%jAde@HS zH}UlKV$&voW_+g}on$b8J23eDEiH6&QYq|yy2#j&;`yJ~th9vD^&)BP#|uFCbr4`+ zmqz*8=krwqViqEtR1$;c50hZbfTHNAP^B2+;y5u3pGMN&kVM^pTd!f8o3`K3O5vKG z-I8JI!YJYxqwgs4%L9|P(+o=y7GKnmRDrig1(pjpC2{S3{JjzIrm?2=Av0sL`%VGG zz|g|x!BxhZkRGNe78Zy4LHo|t#(AK}@9CoO9iWQNX)%!6caT~H`XbfR&$-|CGHH}v zp6q#4^Ob<cBU?BiDj2_xa$eBYkhOhuK}E6@fFD}K?)l}l^+ZXC@0A-f+MZ#ZVj$ZT zXYcCh%#Z=aAYA0oAUdeX`*N3<5#YXS$f<W4&`X^UnzQXDNY*o~o9Mg$gz06>(`N-G zyTIi`UBnp1WRO5FK#?IZ9_=||40}&UK0-HrKPJzRH5>4=`FFRv4x|#BW0E#A+a7j> zUTxpl9x=hViN(asKz#LTqfL<G_7AXQB0OEGJVpHr<zg!K!D5-%{K2tL-GGa-IR@4+ zEG2O!V)h#CWJgVt%T9U(?#8bjDYOA?dMa^Jbtk3z6+aH)RJOt6s$)H6`oT|CMq<#2 zXb5j#h$M^jpN1fqzjW_l!6FzKb%?<qFc~C6RI#khmzpV{P9g~yIQhup>Z}r&ZHuA& zf!{>8iQ~6vTPoTj)OUAv^a4AyIidBfrBO6a+C(M{?~_jqwzim<F723WYnj7_ZQ2a; z@~3JucicN&HL9HXdOch}u1feidwTk$kqt;!wk{RiD7KEp7%yxQFIVFOfD(^S8%n?< z6@XnnI1$P{0xh(CwF=l>ocULq-Hn763j|ck%0T((%=hl~=WO%7yWe^~pLv(wdRjQ_ z)%x}?%tB=FetqaxFT!JJTD*xhWLE{^fjXeroYY=7Qr4Y!8?ynSZfqUK@?M<vzBp^7 zbs4;>>O#o|+}?3WCg#_rLAzfZ+tlBJ5-zDkU%Q}{s!{k~PB1X&txF%a<_uF@*zW1E zfod&1AYADx6}tut*<Kc#hT6j%aT<<sWdJQRUK8wA`4EC)hK(>sULen8bWo@o)K~ff zW{0XM=gSgH&}1UtGz_tAvkiacT+nxm!KVIoB0Tp3tL4gWNrY`r9BcZO-cH7|#jJaq zYTvgxESmnc^NSsqVEy<2-;G>{4}KD6+{&oWt6838Ll5KhwF0kauC;)N#&<|2$$y0^ z{*4*;$_qWc_Z|)xa3c&RqJ4)Q^w~azGmBh^BJ_oTe)4R0v&f?rpj$^;R7d0t2VyM; zz2ZgPiz`}<mx4N`0>EpBKNyr|#+`2?_uofau#zY-F`ij^s-?!=DA>}cSYTJsu>{l9 zi8fcCLg=3?1^3@!sO(ejU6u>`Z$<BmEwTnekBV+&pOuaemxiZH)_o2FV)4c7Hg)NM zTDjLr;HR^!g@$?;v(Xt<YWb=v^FekS=JD+O{n^P|UN6T9A!fVn+A~APj~k9SspoR= z#@g%y_Nu6BGzO4>ecBcFGXnH*bhed$&0LMDG63-&=1c;+jR$wO)y@YA*JklC4c34s zp92yo@SKj`k=XDI@Gz^V-@U}JMQKsObYIf9XB4D*^MVC#4*0C?vAn&_MBBPFeR}9p zKJmg$J7X<=)vDDB`+ik#3eBpKaH>U}3L}LdYDRFbk;z$l<kUB9K$!s#!^ncaihjpE zAf=#ti?8GVP&<b>5hP2&MECn^v51R`$7p<8=Nr57cVlO)N(_o!xeDrhI`<b;t@D+; zGR~T5<S$sUxXytEj=g-QEqvxje)%DQ-#@C3h*kG+(d61o@h}DmdkQrT=Y9Y1a_Kxk z0|g8u?=dblD{)UsjG-_g@pAJ64J`r({s<ubgzeRTdl)egM0u$7*1xPMeOTRtaWnnn zge2J4%e^gEu6yEfi4g<HJI>zH6I|HaoW78lQUXE|ZO@<YS-XRhJMb=R{S~^MIRtxG zvhIE0+cX~+o(gpItq|GyARJ37*fobG7%eIw%9o;}Vom~gJ2i2UI9JNYh-Tt}-C>OP zxbz_>n&S7ShA#uSfc>SO2g13VC6alze;Skoq0vEU_Ke?)GHTu6zyw&Ki_A}WZoYh! z?bqt6`JP-BbQww@fK|DxxZmHj(zBSIb%a6pEW6)ysRf(l^QY;kC>!wk#hBeHoh0qW zs-(0&J(h0wCbqGcESOa*l)$AH>c3v^bal}n>n_VOo7<^X8T1*NN2_41U~Q#C4n+Dr zLI{PYiAIkx;76pY>2CMhtaPOyK~w8L2aZmV%ForX0o$cgCiV(&Ud9sR&)HHg=q_;} zS$vM`C^l;$tB)SLFUiB<e_iT23isKyR*u$X&ftQVME4IiZuA`OGy#v_!h}J);53b~ zPESKcQ?mabiYrY~BYv>s{^N~Q3V?WWSy2SnRs^pMe>Ff%(p4CRcb*6{8~$^<N4LP7 zd$~wviVhsXPV`At<3bs5+hxeps3$amF!Ww2T?{ID&F@&~-+mw*q^lA!I!@ro$dY>$ zYChuP3lgIm5)G)S>iUKYh0NY&URn9qks%&s)+$BQ$iG90Z|DGDjN!8S_$fl%>}?PH z7s3gv>Q|<ohU~J%n{C?RfHrw<(3{@t`5lzC8+Fq$EZ&z{m1Me~4rvY9aD#6Lj;%9Z zi^NuAdAf_T7NKx1B05p=8vrp;4Ue@+>6JKb;|lF5_Y0ep5ODHRMTT>uSc;#(Q8@o7 zT5!}O?#ZIVrYigVF|Gu!&4)a3;Bk(e8<M-WcRTddR5Ib(Oum;&=M=;xVOxL>p*Pcd z<c^tML^Zdyin&v>!t#+rmDzfv&2Jy4&`DOp{c))X6jNDr!P>s*hJwMj!XF`R)!9xm z%}No#uW3iq;|_Kj_`+35T3fD_y}~KF0(GeRNzvk&4dWL~KluID*bjd%LuWk~h!HQ5 zX{!RF661A2_?c)da&azK%e`1}CDn=V&>l%6%RT7dmk#`p!bsVub+aA9@8m)CQMJeK zFY^4W+rQG7RT`c8!F$?S#3;6Ofq2snWZtgRCG2=^SNDYAd}xXeW|@Kfr_KHgDPm8c z`;8UJ)Zppyjt9U`^_%1LW_$5SEAVKs<?Lc@iviBY_0-H&TwkD?Dfe8!PnPi|3F&P} zJkF|<|NiQO)qc}CQQFz)Suus6@>3>+<AP81fhll!L2hHMlHHHvjN{(ZFki6F0Hdf} zwzr8bpJ|H(v@ZNKRSOyiyp+#?eF)-lF0<fi(EkUsJ<>wOxwN19>m(LY!oU5Y5YY#a zcHNG6M9CB1bK$W7X5%VPnFrcx^el|{ElhUUekB2tNH@ik)V+9qWRExrEn5b+g#Tvs zCxmLBmwf%YW~%`%LIPLd(Da`&w}Z`~$WwaWdLQsAK(C&Zq88iZpfOohWx>-S47QRL zBK^EGF#)az$1DzHcMW=~iiwvistg^5d+vTn57f{3I|<zhvD5OTP{gi`+Ll^s`hm>S zrkIL{0RgN7uc*RDR*`{L90W5KQH@a(4y~PVudQqT=gl+g9qy+<O+%FQ!ShPYZ~u8K zj0JVu+5`A_{1_e91@zScA`pzUVVi72B`^XF31B)GBcax`E8~K?m!?)R?px<PS9%$+ z|J>Z2F*pbdetG4dhvO7SnpCLIz!YmQ=dk9|T8zfDI<VB&R1#wcyyCT@f$NdH!tpOx z$<$A)rg3^Np?1Rc`e$FT95*(@X`>xOCQNcBbJSd;aztQ0ajYQMh0QpJ(3nr3NvZ~B z8j~>1)y_OSttu#2V2H*K{g+Ds`fDpIg(mqR=+iE4ro;=%a&HY>p985VWYGc~9wXpd zC(E;|4|2q|^*p7^Fn$6G99CuBsL+xhT}fiK8uN;9kGBC^vwDWnUK>N@hN|Ll%wD)C zls#doz`N&;`fTbXc)Ljy(*?!9rd8WwBiELKiCV}*xu{-Mq6)>`Oj{rFXBWe)ti|9b zTmv9OESn<Rq8gxyKX4O4i#a<5c?ff6@OKhj%)SpyyW4~!{uRk^sa)yB>HI?rM;Cqk z$(+9>l1E82+=qrEr)Ax7O)7Z4I)M2OA}Rhe>OtF|kDzg1JNQ1Y0s!-f`1}IyR>yU4 zW(f$R(W{oXufz08&h{5H%R(Qd&~Q>EaNeUM%+cB3-@{*!PbzEc#J!N65X<(qzX^B_ zz>V6pnfsoUbQ)D-{1LnpwRq84-O;z)^afnmidjv!xSVk1%qw5fuwOdyDwa}p2UI?2 zL1E&b8RC6^|BcIx-scJJ{%9%u0sPnl-`s#}L)5s0ntwIUd5b4=3jL^kCok6<2gg!` z{~zq>ytMVOuqA!=LdXuC_4_AKvW8*3D(S=^^cub0_}iSQjc;mF#ubiaa~k5VjC!x3 zy?9!(AF+7Qq&;g3{<+8a@4*;r6<1r6`aj3gp-EYC*~~-V2-8*-{`@wEKs~JQrxFRf z-A=7Vqh><cWJ2hkUt9rR3sO6oXA^V|BHj;l@DGc2IaA@&L*2HFL`D`sQ9x+ROhn$9 zFD72Co$oA>--p_t*%mN$sGdE}uVf3XcLEkK(Ky&f$>0B53-F4oADoh@;5NSnhc?sM zy=l?d9q`VF*UJnJIo{~>boHLd{!gv3!F}qVA?_b{l)$FDs4e=%Hp7rLt`rKNl3X5W zFEj%QYBK%G2z>(6?ZnS|-udXhbuHE>wd9FFU6I2^JHho`ABhuYlOpi_%+d2VZ5PL4 ztQC2z?q*tncfWH`YD((UX?2VRVGf^QH<8ElAXM36bg%)^=DO~WABs0t1rbt}U1Av? zejIq0_4bi3S<HFvDPzLB)fexC`$U$u^%Fdk2a8vJIx)E)PQfu*E)FU&h)z>)^=Sa4 zPGqbIGREwY)bnT)i`oG6fk&LvKYmji_b6`<y*WLD8S?j_7;*Gh+#o#y7G2C-bdeCl z{K(W^EhGYw24!k?cSJDTvC#*HnpSelU4`Yn+kqLWaWBRAW(Sf#cz#4@xS@>dL<dmH z=4M2T9j7uz-FokHEdOeQ5Bpuwq+2?}A2(}pf2IlV!G+E?u9xb31a?5Q)vGkp@~(_H zcfS$aRHndDNwm9F@4PJ2h?>~DbrI1h5KX>43%rc*A^aYxi6!nF$S+eE^BB*B!T3Fe z+jH}VjwPev&?f#NMoT1+3|@BdV!Lf#@W<sv013lA$VrK>1~-~k6S)kZ3AQLO{7ww= z;*e6$IIRLIXUS`X5XMUy*N`CaTHfKe;Qh^~tjCca3wUwNJ%ewsTrft_<oMgv1kvbj ztEY18VUCrXQ|C^dO?d<x!)I1u7d`W(z?BFc15MRv$8)AUb+kN{!zbibk4WQsp+(h0 zu*2s<_w`w@IMt@@k9zEAg;vFd47;zVJf}|OSn=xA!X^g{lZK66S*wNDnZje*D73{9 zN;Ha=RfUVRJ<Cbubo1Ytk3zr`czw)0>FYq+WY@o}R%LRhqmK!YGB)!tJQOJwOxgbB z(~TY1uzReJucucpLTsKQ#SV1Git`e>|4`$>s(<-~mkk>)Sx^-{mABNEWym7etY9kg z1P63&oW>{EB)CfW0u;heV=8L$izNmSXki}eFgnPI$xK;d<^CcuthF5qeQ!2)$8i#O z4w&P~n2<WBi;BO#u0%p<%JTe*_ZI!6R;;dZ)Vw)NRBqf5OITbDY^u|H7*`#JJh-FB zWR_O#0ma3(bd#L6^iJ%Lf6Z4tdh|WLKj<Hf`s-AuQ{#DbqKn1<7D=HNWg?KPNIidx zw1Ekp%K+XkHV*TAFQ^Uuu^9o~;DEA!o?87oeEIbMCX#QMwAN&(86gFdiwwc+ARC?a z$b@sqjG~@_xgoL6Ak^dyOZ8xF{(V(|u^Hh<2UbsdtQCT9+x)N!Ks8!Oqb79yn~+MZ z<&NKavx&F}dGc$(;L6=e>#SYjU{Nys>KvhQI%F8#G>!5bjb0m6f>@5{i1!HH=cSOs zhjoX)H45+Fs*$n)6$az=T-Isq*x5H3a+ALaa}{p==FV->y}8@nom!+QkmDd7?X!ug zo@pX&C!`d39rL7)3hZAf;hCOWx~<1RF~~#@wYl>307AkKSjl1HK+bz4w=G3dJws(c z`8;zhip?7m`9EBt0-DsO?*6SOgkYrg{nF6n0|PDAsxOuFaKwRUQS7YS|5bL##(L(n zUsXx}b!66rV%M*zAKItu-mj?<?J!cC2^9M&?-HucrfXUz;`ORkf2Me`3HX}rJMEw~ zGyas9r;-e0AN!qr&A8cW)2e|wEkf1*gtBnPgfgH;thT10?WlpTZ}^?Y<Jv`BYw8J& zDDzoZog4EM6UFj#dF-iQWU|{91UT3L0x3(IY?P^c8$IHeKo(PID=7ePnKn93t+rOX zvk3)B5Y`a)ZbMW$uHct=#^N6`*boNf2WBiX=@3JcH?a%_mP)1N5=j;WCH@k9Cud!K z5_?=}8$mT&KMyw?S8y^1P%r=pb!qgm^B&6wP!#m4aCNpfCGnP|-#Om%>ORq{SXq1d z8n^XBYi0o^Nw+zp{90#<)u0@T+OG@8MnK(C21meH8Q>mf)D8J~^MTP}1H5#LjqJ?( zc$;~9<L<fM0zF(w=zvnAnEzQ|+=oUA_56|W{<l(-4g*HW2)@bjdF^=lHP0YM)8U!W zSxWrqi^(=5ZnQCBMkmPqs^WWDg5_oBj|_9>PRrfI(z^H}+0i2N8iSu)iUV%$>@p3X zH_OTrHSs6BWrwBQ+jF|8sEhBGC&B+2UwvsUKX+#o!>!mE<CLfBAX=)AaJAyw51wk! zDu>ze5UWS5&zDv;eZ3JllHWa19kF~#h(T9Rw+w`6EfxE<2WX`N#g>zNYNuhJeI8C8 z&s$C&Dk~b5oiF=WEE<DAHqBDXGz^*(*Io^q4l~nCu<!j2oxabQd0r1I;4ODAr|&&} zlE!FXK7(ER|E3QAx1{*LSfBUzDB<UaBj(=H@?N)IxJOHd${-o2ZRj@Ujv#TnPd?I2 z{SH#2-5=l#1UO`w0^)nz6Q;r$^V7d2n!YEFkq4UNg|C*h{yz<l7}UlQ>F(7|waz}r zBm9*#j#(={$vhae{#KezA7V<O@%J~a>k@a85|z(Lq}U<0zzpc77+G7)j%pA-$mxAY z1mDqp$<SqYkLcBz!rZR}c||Vd%(iv5KaY7`m_$s$N;t{Y9$nb2kKeTTxJdh6<hQms z&f}8%IZvTaZZq(1qexqD_BRM6d#$F|t~wR^OeomMt5@3S*~A(gfWlAkA-01a7>ECl zEm{3q(D!M}{;4$5^|fziL9eV>seeTl=K%7}Eb+JXgi3;uU+?dvDK1&zPv*#0{vXQT zGN{deYZt~^ifeI)LUDJBlokpUiaP|C;O+#M0;PrG?(PJK;O_43?jAVV&zbYidCvYn zGyDCLnR}8C_ayhqTEA;u;vKMK;8My_bPSgsPL$Gz`_rW`wRC>GrG&|FmhP>;o6)th ziodyf8FiBk7oW&JQP_x$i>>pIDA63~ZGS1HM&kAEbCf1jc>x7J{6-vcPO$f4&FgKb z5OENPu9h|IP^+@YZKxy0ZmNj#vsVAxuRC%0W@oAiEK=<1T&V$S%SWKX9^pG1;&&L- z`c%7{%*_{p1L=kjn_%8gKP&tzboNJEwKXk*X;pCQP8GO)J9gj9-TgwrFu#BM%WV^# zvSK=|^ZMzeFhxk=%mUf*tSA|v5|J~3s0f0YIuwo=e1iDacCeXIAB+?bttoF=Jsq5E zB9Qypok^z*os6nNkb~Wd&Gw-Yvu(y;5e;KS&>j$?Eay}wO=-}=PMCb>g^AKccsAWz z`~3CKx8I`m{CaBFGwZkKXD_p7EiX=x=b|y6iD{~of0*pVhTrKvY))Zue^gGPI!~vq z)Mup>b+_Vb^1jn~F|+U`AlPH7a(Yuo4m3$=8nr%y51=X3)48+RqPv;Iaapw~R+vuM z{?1iT78SwV4YX69%U~B^%5S;X*2;^CKBl5tDYmi4=kJPk(J1kW5(-_kOe?xD(2W6@ z{1qW<5R%n8;Nba`TR!iVQ$ODw_jjE`QR-Kj*5As#->#7gJufq%W~ow+dZ>BLcgbaQ zc}GJ%-fcwa4j!6i{G>MXC*mkL<Hv4XDS<?hs7*qsO)sZsD_#O=BMh;OJXx=ka_l~v zFg4vHc+Ru+KHDob;oJXnUjFZ==l^z9{>v}x#n(Kj9FnYP`VKKZM*PPg3snEtfaTR* zl((*Pi!ncBf190jF`l+kxqU}Ht<cw~vEBkCIPL#(;6B7Df>5MPK>T}g$w_5GO5Ype zDJ-O9Bu{Q;PgTwm?+oJ~)kgUSDmc$^A}R$k$7WAV@Dr!GHCw%(2a5c3FZ~mpp0vZv zWY@%?B8y|>VW-fP^nH_YR;T~z!`_T+kAiNgW@zqjuJ3Be&ZOkr>aiF~C{t!H6^PRg zcm!1fD&Q-s2%T~2EdhNO`x^9BzH*fis6sn`Nm?U4auw)m8bIETZ&5<W;h<{Z2ksL7 z2C?F$TV>bm$iJ(weJ#;>3BZ+V1rdf^L=d`$J4m1X9^dQ98WXAeRPZ=7#U(2THej`i zF--YtJ6*(ug;^<ps)Tm+VpO6j=3y^bJR+pf^pIIqB96<fNW<7D&;2WfE1cI@Q&(m% zdM5n+CbqvqsiN<fm?_k;mbjztPo7)e%Z~Tsx56e_<Kg_Px*0HPSAFOAQE)XL!e=Wv z#F*dJY1s%eM5)M$Kgo!OGOv&EjMTi1D;6qJcyv%0=XEXlMNJz}3vp2U<5n3hKmJA{ zo`l<YEOskRYQ29H=7`qb>|jy!ehN8~n>HAC`+=GY03!{rQY&;lZj@CAv&};??_riC zyQNWQ8!LHDt4j3~#Pi=*lv<})7a#PGEDp~uw$U@l-B*-zmVjS!*LKPq>U1eeb}oG3 zsc+!h%FX6x_7`nuy&AN#ir6Os$<pY3z-vW$dZ3u{(x1h3RfrP#-|7ieiwEJ1Vz*mh zh#p7zjik9LgL|$N0{$e#<$45kyHsEC=?c7dKfC^}=$|$Q?V$+%_aJ&Pd{enUFf$mu z|1yJlb3=%<PSw>x^=xG`b;&QY>ePB<*3wYkr5Ctmz(v<lH>gi$-0gr~7QYv7yXL^y z%|)MKohf7_3>Ki7>Fn+aX7JLP<+Z9JAgk6zq9>Kau)*o%cDca`m0x0pKhodbI*ch) z_?uNEMLgH1GlWovyw-f%<-uY9MF}q;^HwC%rWkG0J)F$3oikBtx2)tkhH0*193yti z(>UC!WiC~}W&^;zd{Q6rP`xx0ZEQWUPB>>wSh9tutE8SY;M@qSU>!Pz?_2ehsUv1i zACHG`Csz^x?i&wtfY+oBaqiH6(i{E{qy?D$2JCmr@bS7nYqM&45hB%u?`COlZ{zrZ zkJvJm$YL=kdt7F%F>*Lwy5a&gI9`3ra9fc>tO9aC9{jM|xZSSD(2|FF$Kv%n&MSFY zUSL)&<U{`<p072+D!y%_gP>+wov%?~EnS9vN|?kbqkUoZbZJUvEbdB9>8UF4!wG$c z6VsPfrnC4vEmrmY1+6}OhIlv4ENr3SK`jmRn>oQ+<rkdL8#CA_npix&=s7yoCrH|f zL(lp!9DBHtL1I^4W3F2%(-gPpz%Jhn_H`*)Wwv3wWlwM<UYDr?l^ETAs4qni%?Vh1 zU39Ai{mY>#^QC-Rod4y+Dm$ld(Gh!8I6<h}Q1npFw(s&b?}OIfS^R_QhP8I_n|zsF zYC;-@5{eYT{tbyihwI_2<Rnz+KH%5_+#`x8lY>A?|BK?ODnvU;5T)`L>C4}(j}G+b zOQpN%BY2Hf>4CX2p)S9<<{BF(28=(1bN98ln3{9rreqy4X$IIA3w;%*$dzxtb_13r z;ss;*n?B5X1Z;dy>Zvk3k^-ahwBzG*^fJFYW>Q43n3EIgpZBe*Ym}Irvhlq*BS8XO zQH$~DfvS*M_3|I8d3eqY&Tl2)_<a0Ay;k}OllKeYWjVI*H>1qK=K-vV?e@HyKrRmb z`p6TTO1}dBneC8dvgol8@_*^#wu~#amJj4bvsXJxwOKBd1Qeg}zzsR06K8h~n&j_? zRv$cFwT8u^<VT6XvL>sQxx44jWzxl1t7ocCJ{JpNYeD<RGw%6pXuMr^;^HIi-<<&l z$dNpp#4+iQ+ZvGb9>|>);7NW1N)q|+Tm^qDVg!w5q#J5PnZfr+=^O|>zOU;qDTI4i zW_Y@{=XHs95ti|fC4w!Z`HbE#!A0%df|iQK)-<z*M^90`h)L24E#86G7KA24rEwQ& ztg$X~G7H#zUA2y%x_XCxf7bG0Q`C}*vL0%pNP4u2l@P!4EuyXGt{bt_lz8hee#0~k zDCUgRg8w1|4q|rx4Emr}V&KDZ@oN!(UrTh;0mX@w>!jGUdsyPzkfF>G@kq>_4h7Ba zw~6tQJ-Or9cPwiQ-i`WpY|?lwc&jNRyT{MCK7Ja^=e`?7Fj5~(Cui(-)<(t}_U=FL zp6TxpV4j#!AqB4(W#V=`?RXy=P_|{iCD9R0(K4v}qs#QARa2K{fqVSiA#LUfk5*?J zjol&%Zgc66L)AAThR*fBd9zHkvJIp%O1V&z7}2uGP5yGLR8fA@KHQr|w`HN?%SN-& zufZwg6Re?j{J^u(E>xP3vwxs7(h-ZFzl%;Ce<LGarNU^UJV^0We^Zrq8UIs1a2@Bd ztbxR$Ji`k$44(<U`8zRD8SN@awSiP1F;e93m9^{u0vEhDDZgh-w@y;-en(4|!%A<i z&l#ZZ!p>$@0=W<7ky{l7!nh%<$O#teXooRV-@v=Kk^m3c9ej#*Do&ts&E3&Cch640 z44>8Iwm%A@1sIarJ$Nf$Ai5gKmc_LIWfo;0aQ?Dn{JHs)VJbiV9qbUX@-{{jUQ~;E zn|R(B?}uPoF>m(-u5cED%B8Akm2Y9V_b{H23#B$&*Z83S5(W<CUX@{LjH{HjCWCV( z!F^SYI)&W)&eWr-qjPO6^L>X%ue(+TRdf?+8*s7V+I$HAy-!dVl5eRFhQM$sZHn#s z&|!lkE)CyXw*6W(%yQ;#qEwh%kEfxHCw$%D+;#$eZW@-L(zkv+IbR9ljKHuJhrVgN zGbtEHB^uTTqLr?suyy!gJ8?$XZDk_6)zahm{fIEMbCT8zfO-ivxlQU(6y5wmfOn6= zO0xnwtBho*@39}6wOT!IB6?>co=+WafP0)hSG6MDdOpL5y1`zY%0qHKEi5qNuJ&C( zL55di;E}LekA52K%sU%j!s7Wj8^1q7_ElB_`^BR-u@x{(f7|Kxf?w?Bfjyb#pZdgl zS6KTD+ZP|AKQYN~{2Bb=V0;6%(NoA(ukV?j2XO4^t2*1w+}7C}!u(={#k(hYJgkj~ zecxf;?s=y81_LvJP`(}X`!BJ>p<%;awd4#N_zN&I2;K2<j<lE=I`ppN>!#q*K^Bo^ z3l!X9f0eBo*JN#xNsby*TdB<w;l>Y{=K)@HPHk+`fKXIJ8KQ$^T<4WcPv1GlDCrh? zmvXCEMQ}&M%H(f<4O(KyT`8&Xgm1(W2-GP*9;1<_0cb{t>=Tv`I&33GSs?2R$4F){ zDnrQ@tu94x1qX2R%&~FR*3IDg)^mlCuH>diuzbsP{P=DWY?a}A!p;8DAHCe_HMdEJ z_@D1e7^2#r$(^Cl(S3H9q{M}rjfzAO7kd(|`P9$#q}gXOD7E2?Q>O#ti&Ck_7bv&| z0E<BTbsD6lpCs2cwY9H6JTzq-%on7<)U*-Lm4#}Qp0XG9x8d&Zk~W1YZi9?RB`^xL zyz6$5c*KT5e@p0_A~u@d5ec~FJN<Sj#-IAZv1&}K_9E}%sS3U>E%}F_z-fFPFWJWY z7e{H;{MEl*K{5xQICTPYeH<;3jz$SAf=0&bE-cLhC+X}oP2($=N7rHnCX9dC{?;zV z7O<1tVU@2|L-t>+0p)m;q3SwQxW@T&zy>z@c?g~hc`o2vA@t1CY93-N2`8oF*&>dD zcrn!0pCFfG>@b!Vq#4NaJ#kprT9mFalg;LL%GluV*ejN(w{$w6XXoH!J+`lE@aapN z^cG9anImCJ)a=kKXp>IT{X#YU_Dovmyq9l(^pIJPrvh-1)*q3(&M0jumkUO(Z-<oq zM4zGAE<@NMIHrkhM^p(wEEGnQ9R4l1?TTFq!s(RNrLTl=nT?^C6hS_m5!Ud9q}0lX zb#9SYWU6X2rmAxUPa(UmBvWT`|9ZN4EVRC|ime4ycC5^hyF@VzzEg!ATstuM`a*1P z(G=J}c4Xd=OrAxhW!;>D7nSB(RA|<>lHuR=TRfn3kpczg(_MGF7T!eycy8Xn-#4zL zc+H3%+M>g|yR;-xmh?oe93QMc3_L8&Jq>kasyKW0r7YODh`utf9BANq5EeJ{kgdys z-K9UZ2b#fAx}1US+mwf@cA@&~+tDM=(4J_q@mFFvOd$+HJ=n$ta-IiyvVxKQWQPEV zfBzlAJ>QU82WsSsE+@*|1hmuA{sumHnXa;PZ4P)jPmJkG1J^G3y&P7V+myH~+V_Ur zQyRInf%V7n$s>Ku93%q6juJ`C#k!fAQFKj03K{U9Bfc}8+zfb;>3A8@*mJSz6JVe4 zA72lZQ&VCLc;eMc5?v5{rxsKS*AF0A(o8-QLaOWOoLA%jC`dY!c9(g?Pb6OU@m=g< zc-2=deQwJ9-H>bt6w94HrUqC}{1Va|Ut1i)6t7R%o*N{?`rAGp;X3w0gVt^BXd}M$ zI=ULCRF69rExM(nY-}+5(ZqJjr+K+C(JOTAm(`}=lAeDueEjdI(EoSU;`LvXEeJN* zLNt!gIob}cP5FiM{hw@;-W}tMz-aVI>r4&crm=$DB8Wl60;wJw|Cs6K0gTuhxpUB1 zjxcWJ^IA^w_4|sYabtkBg=>`7h;kz8fq>CStV<O!*?!bCw*xPg^=?BM5j2rIf+9ie zNQv2utHZh%w8|lt;#`uXcnbKdA)8(^`1oa^RHO#A)K>;7pP4uy7;L!srSIF=VRx)_ zSg3j<Uh`nrH#3%Zo=pCJX)+{-*%T+1LSnT;jZv|{+!sg1xa#rQI|`=|J)eX}G&k2l z?Z!dtv$gxG_w%^L`)_3sslrWrgu%~gMX^ajJ;I6YRB&T%4AaPy#;==QKR?>IyDhkC zQE|misJ6UoL*0!9El6>@IAd>N)x={F_4p!5Jgi4blX@e$jpVb5an6p8#rTFx;;olE z&6Y7ozBiJ2`>IJiVdcZ7Hk*s{yImz!xtBF(_=A~K*o`F<9?hs&4Jw%OYC_*G+_$A@ z|1X0_jiAn+{(G&lb1YLjBl%Ku5^M+l@;@(*#<m>Z8*)X=^_WNTkiQm8UOI2za^%+} zeu_gXKu@WM#zevEpU&<3!t5S~p-jKBe;3F3b(i!}?PXWkNjrIh3qG&#=y^{JX~?0v z1kAQc1-ykwXQHN5p!kS926I=TM667a7eW{U^G@${Sl(WtjP9*JrWfv{?LaBj>~7Vn z<|(l}pJEqaR;1`Yes<{U1$%a4^<Lx1&S)ZXv&2w&PM^#sLYP*ZjsVC%;o~zlHvKk@ zR<Yg?V8;jKQxlsne53tB<1^Jn6rI_D@LPgwzwk!<rh@!+^X%Cz<F(PQ?edM~11aSQ z4bH!j3$PdwiXxOLl?8IGCDvtV$EPpnn$7x@@0Wcc{qZv>#p4>q*DK)THxkBE0o?OU zMmZ&XmQQL(2{=PCY#Sy?sa#czH}C0cKYu{C*42mnJT8FAMA0Q*-^&gJmB{JDIgNB# zON|0KF1Tb8(hQ&`xJ6a?TG9#JPNsjgXp+W%fHQby?<bAMMgzwH40VO`>>4Q(vZbEK z{+OmG416-4>??mkZ%s6lVio5OrhjL_BllsS%;sC@>3S@l)Ft-3wVP@*dkw&f#L!)P zF!F$P)ea%!Z@X6y&Q0^yb$68MH&35No}l}3VwX8$mybvPl96Y9`~M*$UsXfeJ$ruX z0lY*^034<Pbf353g){XMJl8KVE^BU!@aDQ_NyK7fV0&+9^l4(_vWOfS3-YL5T_R^# zf8_^;i;;TmwG6aEzgvQwnV+y~-Jd3@8Em%R(w&QoqR=pzna8#kjsB`qkZZ@xh2tEf zmd$A!>5r3CdjCj*H~Pi0cH|?6Z3z;$y2t6qts1tB4*K_DH&^pTkeMcqaKkF)#y_q} z)R0_oS0pSu*}fwnQ?DS<h~CmP28ga*F!~EO3(tt`I-ak$X{s}^Pp%luy7#G0wi4t( zQf*x;r2Y%KM9s@qJP<h#5yw?jIa_PofU;db4Ky6Xc_U@*LbIV2OHYKx;-ATcB5kl! zDG&;e3p8;X-D#3)2tU?2eYgnKj>?!obG=%{OtTTy$Gqu3*vr{A|AaK@his^oQ8gad zT|>NWY-*PGy{?oVS(!Db!Me;^wg|hbdN%U87swaaVouhSq`F07Wv7P8SDS*L5)F1S zN2ES!LM3XBR;o%b`~CLXRu3n9?r=WLxygX+a4Kn)<%v+pq(>37Vi1&ou|6BZsef(( zA(+zmkomSz{te>(x(CxB+}UY8mBlSa+1$pPSk$tdq&d?2)-Tsz@eHudCvFJoGoL=Y zckPqe%#3uxf|Y3+3d%{T3nBC8!*i8ZpN|znB7}iRw`UjEoAD&%F5(+AlnH%DjPnqf zJHL=RX=>MuwTE1k-A8#i^_+*A!_rqpuf^dRsM18UD%2^D9w?}?)tVeI-K^fD>@q$_ zUhvqeU4}p3kst?NEr#YlqlPQf?;g>;4J==zEXlavsenArRQR00;xsC>jQ;82w8zeT zCB*+1(78T90~fH|TE9jFfY}C<efhcI0RJg^MG)KY|8N1W!Q+t9zT(Ew<`qOX_deAx z>|?zKajt=sK2>Z@LJI_5(a(t-n`v{LU8KLqvA#TfY<UGn;mUYyUN-5Iyd@9lv`}Mc zMt4?6la?9S9yUGvpvw687Uc?Et`6y!<B!Aw_{sNQq%yOCT9uzI8BV`jnt0FJRoUcc ziwnw*L9WS~`EYw><vgm6a%L^EQXiU&pMzex9!Q4c8`g{Kv)8&@HXWZjmax*B0<F4$ zjk>IvRoZUND+}I&X`@vznTsTud-KWZ{q^;!oLdIye*;JN!|H;upnouq`!{0a{|0;0 z@ez7#JzfZ3r|v6W`LX?mh>B8r;}gX_=UqOWCVoU#tSLXv%%vnEw9UL%!cVw6`gkV1 zgLDC>XPZ8R&eAs%#U0P{PN(Su!P?KOYp7*B#(r@(YGPFI@y}|HO-vegb3Fm?-R@`j zRm`75%x=?lA7Sj7zec6<@vImA`FOz>J$s7qf1+dRZzQ?LxkgKnRMM}Om3p%}qT>oa z=T^cv(TQe?)&id~<>5HF4m^k*2e4;7u*_UGW5epdTQ6$U;?!~)rDW>AJyoFjs2V0C z=eDX>#y1T}>=V&H;#RRvEf{-wGa|b;`3=e|^q#YPFkL>J#z=|fDPi$h8-ZiLt!byi z@-?D^B$eB~OB^MK@X=KJkiD7~Qy+C^I#gS?jzOm3N+YjB+Fq5*yYnrwM(SJov(EVN zn567(*^jtX$OC(=RW;=t>S2U5vsHrKgNcj0rlZ=8F1$>+%0Dqa$zOd`FO|$%dI}O1 zv}97P;jk(du!*T+^r(wV(ENsbl%;B){xg>mCMzo)<YqKTc+2+0FCOArrkEkwFqx@% z>5IZ{6$0lu${s%Yg|4>9ofAlR6P8{qxm>MO@vs`{gz7WUE6k{Bnv?N}>f<*evfo^u zJ%V}SEpgq$auL+LpVzDs_<2S7Ft-Aw-QX1%{HsZ6f5qzFLa$K5g(mQ73R+p;s1<1^ zzXl^p*9%eIDI5f2joes!O|P_#d)?!>oaHB%#lLZf?4yY2vUz192F?nr8C?I;017I% z1}mEbU5ZZAk}%un?bW4uEv}jsr-Fr;r%`hOf5CH#Mj?-ENBSS#U1mV%aTyN>faf^7 z=dCr8^h~;cs#|O%A|w*FL@olFf62!su@mK`VDJ&eGN@*LX)R*vmPPm%QM$-jP1AJ{ zX8WmHp<kP($2;2$dT!fng7~a+EIo5sp-wQ->1JZiSVEk`z5*{XgYlDr2U`hwb=fDL z_no<^995#M(Og|qwYC#K6V<^8Vp_UsGGOsIAQ~Rgl{Q_Jt$1EowY*$c`&Syg0x9}& zX52*j6^GRp1SqY5nnEwc)!towgHmBOFv7=T-`v%Je#3tw{)bb^hYQ~ur7Dd#o)6`- zk3WyC`2ZFC-*%6^TQpf5tWR&78H0v+lcAW8T{E6H6Vblc4|^G}*9CxP7c`AO|8#o) zpHN;b?8LR#7g(Y0JOEy7tC-K8=wd668A-5j;1=gUgvZ5lxHCX*4Pkv2Xk=g~z^4T2 zAkGn1kDu66zPWB_>giR!FKu*l8mA*Z6eeN3%{-!;MY*J-o4@<MZ~qhQb{TzCO%U27 z8+vIbQt#^?CG!Er)}q(mwDW6HsG1ZixTaT}Sm!cE!{AwC!4&-}NUgU(COFPKyZbSE z@+LvvFG9ZplRrf>*<MBt+!6}(C!sKla2O9!>gKDmzI}LK8d00`QMVMY()(%*4r!M$ z-3IIVD4(@5Y96w<S`E_Mq1uRn9;uRetm4{g;$**ca?^Fc<n=<BU3iq{EYT0yJ-^v% zw8E&lAK-H6Y2dm<GZz<(P8c*)9+pMwwSSWz)@1KGP^U)@>)4e4q+*d1vlca(95A<* z<oQiOzV-4a{lcKj%sHUQU~YtZD@X?XGp!m`9v3@nKhkVaFttiOtL<eVio?EeYq&;~ z^9QpeqH?{${trLt88W+Bf-M1O7DJ70)G|?-!<GH{U-G(Cx=xW=hZXskF*+9G=CV7g zec%i(HH-Wm_8D|$qV-Rj)^n`*91#GnN)C7}REd`&)!bam23V4DW^_e+Zu5*7R*tK0 zu_7Emvm}YIHxc>FO)HJN2+ZE}<T}DYflnnU0a+`vJa1N?3lX9ZK4A|jNLls8RD&|3 zw|3m@K=)kl(ho9^&WMoKH+)S=o)zp|&6gV4_8R6zYG#nuw+5U!m)vHXoX&7{0WhDj zW4H2I?imR#QgEZ9IW4%4UD$wtxmshNMkM1%y`A<v2o1b;@Mv8Fn4UN(L})pqy}?_% zfBaXJ2H@f5wNwl#PK)oK;1qv41dO@wv94UyFdmK;5~j_=lK5WN4W{nxI$x;5J4%?V z{Q2J<>O&8Hl8HAfLqBIzuex#vix%GHQtE-HWw^?{iDFPA8J%6QSA!<Z;VLRr_z&ik zv{n7PTP}5y60aAnnr3)D01lFKH-jf2&HXw3;sig7WvxC&^~MoFUd6o5ZdnE#R>MsJ z3K>tSjfVDHa73Q|ajbq#*qid%>dm^2tT?q9U&Q9IepMQqN*={&{G7>H*LdpK2z|fv zF0>(@+)$WI|H;%el)PG9TUmc8TLV`@mW~>?eK^VKNYn=s2TB5{sjKfMXw7gZZus3N zk0h6}Lyp)>O0bF#=O`aW@k&j$)x*MiP7%+2Dd7xX{cPdtc_kWnY7ewN)162LuCp9E z=d&+vW*2L{tr?gGf=`_n`|ift?@wHX=Qnv9$bR+3KHdEgUO9Da^ghT-NC%xhL_=OK zY~3O@2i5=M0D$!iTDZfr2Y$%pYea>a)h0zE{$vY%GWZ&4^Svgs=kM-AO^sDVdUbzb zzTUD+wOh_IS!&hEBibm@^hKSssNDPza!*;!?|$jJu;Ufcn#;k@__88);|`bYsJ0EV zbqc<Q@8jqq(&&Nm&iw!<`F-xe9vi)-`?(R~*hmx|wPK-H0*g*_Ykv}gl=JTtM6dMC zwT1!0g91E%j4+KI$FO|3j0QP9s@^>U_^QIPMBmY<<P9xnK@#&mmmw?5`w`2fj3R_t z+XeDR&d_C}B~$dFIrDy^x3LI9H-^1?XlHR&pmvH(rZ-fD=)gkBZ~EGl2wc@VK)qN; ziuihDOZsX=s0W%jAcXB45m#UdlJsyncNMF8zl58P*bANFp=gKfZOtqLqZrEPH=8?r zNe=5vNCWiclv%%ev$UGxOc}Y1f>ZK`gf<9+m09absYyR&9ms#cM4y$R`JqmEa6zxI zx*E`ZZTw<P&Gbkwb<p@O>73X}E?gry4#_H0htk}4V;U>z#Tw1Zgxg`JG~j);mGtLI z{ga`Hp10LKySpJ)hi@iT=&IR70EJQb?Tuhi`e)?N)}NST1V9E>ytz@3aOxnzr~y=5 z^md~>KFD~LDCgHP^&3??Ii0Rw6j!;<Odw-7-e|(hv;dax5{kt0koCJ=_F5vX62!dn z3e}37720E4xugBMcC?izH@EUWelH-uaO%-%+uXFE!n6Q``BV?@3`mxIO_{;qmBK{Q zo7s}&++<t@jl=)X#;;^RS_b>r-W1wOJ%38c8-*2%?TA|lA}?_X`u1wLPzDfz!xLc( z&2RLa!N~<umahVajE51SR_ZgWM*6?aF0lpOs#JhBB49EawgU8jSd<ig6@S+b#tsjl zs)QLI554p(TtL0fwrzCDk1CHUb`O$-xqI}u>D8HETaC?rekqIh+Ttlz|5)%omDwsd zo4ME?&qoimCiRnp<P&tzwma8(AX1rT_~Kwe{8k-X!wp4SsH%5Z^Z92QMj{q&?g$nC z$P>l}+RR{!k{Fg>$!26$<WW$EiOjP+S#`Qvs&k1?t+wG`D(mmRYt)&i4Ab6K8Aigb zXd<-fk`i?AtQvBup-nPsizY1AsuLI^F!9S1;Ej-p<u{BfwU6Pg2fxv0xp@z(U@?D| zgpvshgbiyxonejp?o#!Vva-{Gg*TqBZEknI1uOb&1Td4uNvAQfSJ;s{l!1p5bK&1) z3;&IH@qd4J?tlLUf7Q25zRF2LO$8~cga_#Q5NV0ViFBgxB8JNveQLX%ENn(jdY<D; zOSU3e&l0HMp?<bMaX`bkx0n8nE(F#0--w+|tR`F*B3D}_+^c;>nB5$7vC5Zu!w)o} zvYj&qhODbuf7HK?d6rwa(Z&Wj20vP9B<YazVNj%o0hyxciar_6lVN~-Mo{xVG0YdY z)n{)fb|sRzmNPdMk*WL|&}&)f#tjK4IdJM1a;BwE)tJd1tIYdseJ^1}G@-`a7tS3f z3h*T3e&yMDKw`-Xr{oVytV0!OGL_{qg*lu5J%lb@LX<vhI|e|}%GtGFvb*SDFQgoa zW<=sKvA!K-w3F-(et&3{wnZ+}qI>e6;9b+(pM;jCp*iDoL+^9R(Y7gVIa^0|O3gRr zE=PZ+YITj%Wf3TN;POW)3jQ%E{|=(Er|PrLB2B5z3r=!Z>l67Kq9B{@xG%DcApym* z<;Ci)yv);|xZMn~6c={>22?+VfpglwUV7;bnpQcGz8few4!z`wd&~ib4cC}D{Gg8h z*valw?cAKikBrJh{SJ?r{HDgJi~ycDt7T;wbo<by8LSw~fO0K|WNFmem%sEb7c)?= zaBA!H)f};;J1+T)9?}YO<7bvt=3vbBC1&u<gba1qF4Qd9w8XN#32Ij%EYi{fDrBp$ ziN;!zbbjo4Xe@z+O0Oy3m7DKbAVlKvw8d!0a?V4D{9w^}K5Znm^aaF;t;wCjYEI5~ zZ~hRcuFCO}7lWzcC;`Q{s^C4C33*^v6GRyrtbhTaEde)i3}ho9c+LP_u$nWTyzG2; zqu3#r2V;pc9{&)>L-mg5s~_}iDZe+H0oLdV{BJy6&Q{Lu*cGI^+K`9T?S_sLv}3L} zpW9n@*xhC(^nI-qpizBQ1G|4Z{aS2_2(|yh+1D}pXgbpS#!MhaU+BFz9Mc_*lHSne z;40|dom(@^Wi09UD`!-pmpP+X_~Y^w;;gj2S*#S+8)Q;}Sf!&UsF1n)k=ij)TNL1n z-5$$ZT?p(kZs=Ng6G8HW&RNq$6GHM{2S838$kU(MB&2O-BRR`9*j0K&Mz^8My1Vv= zFgO(Q`8V+)yFQ6Hf`d@X$X>*R`_KHgSvc>FX15>hPd(G9=Jhj&qjGNPzK@n0Q1y6# z>;GMg|HBFTzdmwLP0i7Ub$DiHb$Es<!gK}fHw{Ss@E8-$T;*HJ53_nPw-m1jFC(Qo zMBZ5m`oFX<-=Y!+cEerUjaf?hlL{aQ+NK#YO^@-Wf;6!b-E547W}`AHId6j{j<tj7 z6%Z<J9C9p$+n7Eqr8JKmUMe#Y<!%Q9VtMc_pQq{$w6u2<Uu$h5iJOb+zu=F(C!a4B zWp*Z{iC5bsig=&c%*&i)pK?wn_*uju%IS_)Tc^!MPvvh$K+PCsV`G5ajyzL5CTtso z(MklO7M?51@z?^8*92omVTM<-VbtGMSY9;?t1PWQCfBd>P6I}erJDOw;Ueu=<=}eT zC$Gam<|^jlAX~!;&V*V9<2L^6Q;L%y(|77^PBENvvANn;1GQb#uvnL=-M><03We*k zEo34)nju+ZWO$x*44LVZrCx>IBK$1Hz02YFQ`VY{mokbV<55<U=}Z2#vX?0l_!60o z=N&Z6_sTVmyeQitnVu_}p7A^)fZt0T*V3%`_NbMgA0<gXfBURMi2X4Wd%hFP<|NBc zuSKH%tJ#;yVEW*|8EPD-85l?3$qoI1xRQNj?Q7=rA-7?^C#(EIYq}*ayS|1t(ALY% z<j}rsC5PeMRY#8(U>bJyS6O3(bc?MGMIHjk#<l}<p1KfvE!-Qpdza0KDduz~*&?(w zw;qnt8$8>}OV`)2*%sE29<~(hPHj||dC^pOrrq3{h#(E!tyo9(893k~bI|gNs&(Zh zW6T(36GN!rD#TGJn9sw<W`RiQ=VVa7tH3{*NT}kuQG0Ke4oAm8n+0O8dHgS1Yx^hh zdXakGrY!$Nc>gU0Yp#~wChFLQ5^&Z{Tg_q(WT|&!KXeH)mPn^!D42O5L=jkXBF96m z#rt%VvcCfZy=fhETSd@$ELC+6(7pd;4l~674EKV{Cs>$&F-b8DTKmKeiYn2#$V!nd zYfn$+B2r>RPpAEOViRFb9*yHW^s%}uxls6;B@nBVHOy)*X;z9C&0f#KzFB3oYqFiQ z;JgNd(WPl)<d~$sb;w%^JH2=QgKNYf*#1nT?O0JW_+g7*gi9t{nDmI(E%pvLNBlkt z)Ug|U+4F&|p;(8%LO#F7RcA%45$?4<>JPo`mUsM$uxOHk*%s_>*P&2o#^XV>*wrw% z+v&39yRgE4{L}geR~(oTtn$B-p4nkN_1D3pj??S7Oi;f9%gx+nW~W5|3s~sf#{8z0 z{>srza+Q7efGyt?9oM|V<P@yU5`pzNdNL-0FDKl+!l|K;hIJH#&`^iM%eSF66wLTz z{zY=<UfDLoWt4HZdiT+C#FP%yN#`Gupo85Lpxrn`QW$3oH2z>cASavkje+2UAt~)2 z+e0QCga@zHeM~{CPE^)kRi&t5_Y8fLq8Ek=4P{j>n17|dIc99{Qcs$CB9}pif^S`h zeT{pTg$7^BobX9{=OMWZK~SCE>v_o6BI|c#a0ah2sJ&nA@>p+Pz)0&4#Ra6_^hppn zlt2=`IaQ{s9<{=9BgPxQPzCS5#S1Y@uY9@;uLiO?@p~u7-@}FTIrLY2E(xJ+R9dtq zDIXuA<}}^n5+!$k$VN5p<%8odo9YL-G-}1t$I*a8TGl2>gW1yAha$EpSi1g#jkwX_ z>w#H@t0{Byn!F@IgB07;_^{~P;cuim{FcX_YtH2=q*&|jK<5yIgZQ_KemZB-mR!;b zinIo02=a!6f0vmLEAucT%5ih6y9*e(P1e7IC;IEH-nHjD*^!DEULlc?(FzcC&wWQ4 z;nD|!GRFfLyenr<KoW4hL<>7m-@VY14qg||Ax|rCYk}0<^h$}=Yb7tj)15emj?eWA zx&K9T3H==5Uj4L8Jt!o@SAa{4)f_0Kf(K)<s4eK>`DCt=7h3|#IHlay@_<p(p2Y;l zyny1nd|<%YWw3TBZ^A;Szw>p*8F}2vo#<VO-ODj4goPD!l12YdTmuSp_!q9zzz1Ar ziFL_fI2Z!N&OUxaSSpB*iJ30<IHS1E6w+p!0}$oPLQ1gJJ!DUMGCP;j7()z=G^4tF z<EuYgBqQPo3K&{;(>0|Fsri)~sUnci@=al`C)KFLvd3wHo(&HdmdQ5TC(rJdQA~MA zcAv_k)S$vLlQ>>BDXj9-b2RJaG97PwUKWQ%-|#w2*lYwQ<I0N8%`NTxQQ^taE<=}4 z==F+-t!6@hY4Z7RF|N>G*(b$}U0sh3N`>5l98$a=4ASDpQVj<uCPLu;RKWhrcA3K7 z>Oj&i;uhDX<C`BA2;QEaqG_WYsQRo4^)UWooKC&I&kY!spq1~A^PgAcGY2+NhTr3p z4ixg-m;7i25Dcb@`Q7&vOhBh@fugk0E-Hts(19|dy~^Ims%&2b`GV7(#@fQFH_ml8 zC=mg2{a`{Ag4;CH+fVyjoQ$ct>C|VSHeXs|*p2y)SFVo@|6=+wX=ETue!#|Z><sND z0ZpQw{ot079J5JTfm@m?%6l<hmo9b5>!s==$`X;`dkHN&8I9-SVBce?$t)>zZJ*}; zh{F4jm$JKBNgE3D*V(1T^G7&~^A0Rg#SzKwXJN)KArj+ZtB5}(aoMwevdV$;I7-#N zi}k*^aEJV2`zx9N%Xa<zAu`yH@q7DCTHKjUBt!nu**7=nO0z2Rke0NQ&%_HMKsOUU zM>zM?#j-B>){M)j(cQNEW~)E>B2=@rS-Ny0QSwQYYU}Uhvd%!7v!9Las)_t3yVY{J z)m&8FVEftVesZkRxL^i7J!`%b?qOZI@3tsiU-FvbfPbo_p;3a@-24pQ=L)TaD95zg zr{2TdB9%ozL$FlIZc{d=yq4g}X7j|4rCd3n(k*-b0J=_#4MsSEE`Fz-NovhH@~%L% zpMw=t9MA5)k6>Y3t9OLxS?`@*DC^3K2LA!Coe>_bK+<W}UByD9ndfW3{?gENyw*|q z0q*x>KtJ`emQ|m99x;R)yr#@A0e4zV8zyl?uCJ8f1@u-+TT?Z+7iwxRs&^~n7XO!% zeO4v^%!u#ZG?LCWQd{|G%@ZQFr_%Ves>rd`&kN7&SpmC@?1>;x!gPYB9Xl_W)6xjG z6y7?wg~GIvrTEx1%haB`AHo;s({F7#`p=C&T3>?MeJ|!<Ya_4R0nLAhRs4~q*HK!> zZ`R+0=TV)9;SgayL9eE~&U`3axx!7&Js^TRqrXqCP19WqT9Qp_P>K9R&k}e_5*ATc z*#*msIKtKsH1sqWPNK-!+h%1KcJx!nUs!1vehKg35HW_hNmNbGU7Ozmjq^}zzp~!Z zTF^zvY@cTTzTWV+b(ODjKe|rEM^mfNDxb-O|2kAAcqZic05}*6uZ9=oL(uwQR@Qu& zg+0Je&6nou)ItMPW%NDe;2Qhs<eog;zrgUVF{??B>r>BH7N+s59SK4UnvX7zdDy;~ zU!j_@J&y3wQoqYIO5(KW6}@kKLuT6wyqX){mTD(u+qRqUK@UuXh<=SD5i!&*)!V(^ z6l6SfGl*`y#>2mfFZ&0<#6RnL+ObgJC81E+S1(8`>$rP_*Tw`^!n$}aq9;XA@9C`R z2Tjj_Ar*TJ#^j^lbP{uG$m>wH4(pF+cDpXY-d~lg9Ovj%>DfmZ1K5&n**M2aUqy7Q z;|*eTq(@rpH3H_UCZqlu#*P0_1WhS6Fw#Ghf-mzezSqc<Cfd+y{xl7HvzeM8*Ee!l zSz4dyXhi*4?A9XMBVxc<3rE&pt&PWjIY3*K6PKR&;$WVu%cA*Ang4!R96RFltGoRn zJJ}nDr0X@npYX)>1*3S=*J>?IdB=H&HqvEm&+l=`Js`MS_H4W-SS0%<T=WbZ5yapX z7oNyi9@;}X&1EeC?SaGR%s$YnrqBtw%Y!W|2@g;}1e4?Cq^+8mCY@Z{f_#{Hts%P} zrICf3;r$P)u|c26k#1tHC*R$yhzu^c7gaSSn?z`Gf)jO8^lihs_mQmX4h~DpN_KI4 zrdj~>O9)BJ<`<EFqIPH!^wGFbB<HPf{t}MDj~A<5ry-7c)&*jl)O$aEJXr0lRWJ!* z#Sk$*<`d*yx8wK=XDX0YcJtQh+}V<_%>CjsA0H|@XE5tL<f%ANg$1{Zr6mb+biKAp zuLfNvSV+?Qw4nTyl-}AlJ4<!F3vx*bh2!icJzi@KK85>kZFth{Jwa@1zqfeYd%u!% zvXIp@&9bHja&yG|c{b`PqKYga2GF~So?e%7gS$O@&pSWc3MvrliSXsqEWFD8)!6g} zfZ`0-+vo{vnBb-ow$T{^ChjPZ1A-W7@f0|DL=_Eps+EZSQ7>CW>%MjJX%4hA@&hEJ z{X*ir{o&u|-u9<Z@z~dDpVw?y3i~=@1l+ts-`#4XfG~yr=H1Bk2cl?Nb7Idlh1Fab zPh%I?r(<Z#0}}MZf!CULmHm5HN)G1gs+tfWDZh$WgRI2EVs0WX0@+36{j8MWX+&W} zBUjQ9D`jU7zgy8OHIT_J`x8U<Q(^<JbWB)hHbWSye!g;-8t>G^b*f`4Et;h;q)abw z_p$iGTjfo>zB}k|ZM|v>kjG!SHHb=cNPE>`+UJ@>R#P?qvh=sa<$SfNg^vQa?z%4S z$CRT6j|O`eUD<QbC}RelvdauQaZH0(8sFv_65U_*_4Nv4k3)HF`$9?U41_Q~cQuH! z!Rt&^!RY+z(5m9ozwDM;E@g@G7=`}pbpFo;`v0o&&MjaK_hsV2t<9+EWt68zd@Xj1 zrm^L1Hb#(6^sF4Jy&3Z9742$i+Gf*B$TT29%A)UmmgU1yeCOq3CY<1kOo>`Z7rxJ* zz>zqmQX$q)XJ56zESjEt>fg%tqGCW|acj}G<rm)1TfF%Lo4fu5HDI7pFipglzlCKU zk<?NjG02q*71I?ar{)xXrY>}AW}(gHqpWW$7fk^8PlR`C_>v6BAIxVQUv>B8MblfH z*h2@|2s!g!?VUv9>Lr}la=*22p*I69Z`nUZ{sv`<AU(Nd7Ma4(-a0BM!7*S2KE1+I z@QiR8P}`hapEun|gqv}?p*T{;4|u-&V6DQ?q^y00Oj7#w|8N23-5M{Zk+6q^zV|8g zPUI_z^-qbsX3In_b1u@!46^3SOn*BP9`5G8#vjyTYyDzb<vqDTPX_$kpSVH-=W;nC zqJ>u>6@7Hn7>!_bgV0trn*AOsH+cg%YZ)KqP0ODxFJp}jI>z^Kgm;+H#D2!?orTly z$B`*jd2%D6J6*Hh;KGi3@93VH!Q4K8Ms8#HhMEA!oH!Zmp~H}g9GDg1reTw^lio3& z*!fQ0=OP=H{fW?vsH+i)_wm@MS&9(A3O`3Ex}F(TAQ#m+OD0y38JzjlsV>X|XmOW( zNcOb7Piwusw&z0{as#<mt!Q6sJMrAV86y1To8_r?Qy*$BeH78ktBr)^37jBdclIHa zy-`E^(Mh6uO<P3^Zc<$MA}<A8)#&mEvg7;uyjxkFxOC%CSDCJwPGe}tk#hY=q4)D9 zvqY%5bqso#B6hPd_PWjf5;LHq|BsL388^a@`@D*~Mr{X%cOq~wK-l+n^ZNeuE*#Kz z>5FkNr(eumu~5YV_+cR!_3%|?{6$xk!HXKK9n!c)+?csgYCxpHzCf@VqmS5Y#56B8 zxcyO2<C{89!l344-qzR<r<Q@?ta!L;1bEoVN}W4TZ##IjK2D)szwP1u?PqO2#T!GP zH@)RlNWYaT1lZijz6?qROL;RzS}{8=JBEG2KOmG4$S86yc8XGD`hFc6hGxET*|G6A zWxG!Mka^jee&QGq7u6Sga$<7{@)aeDa=?-Y6*|l!a1$-{7zLL@u6mvw1+-b>V+Xc_ z2?3rL!Aq1NsCkp#gIp%cVfKG2T5mW0Dy{;8z=q;8UtS%*AiozcdLgf)7y-CM-sm%p zy7@dW2_94P75^ETvA3+CELdt&_p+0R-*KYNgIuzqY2$K|!9!?D3>NQ~j*@UZfOL%> zOX(tQioRw7;j$a)_HFwkINewegi|#;Yu00V`PC^|Y56me(Qa;1GVeiUNo;BMcYo8@ z5KNne4OJoR7}%tDGNXVhZLL%~9&9zWkI(Kl#IA?mx@fZ8J)CIw91%W0K{W8uz7%V5 z#Lio1nHWSGCPHI79J6sju+t;LLEr0Dm|^g`JBTkQHft~(vEmx>VP5TXgG~?)x#HLi z!6P)_F5={y8{8@^-r19K)V#Ijj=c&LE)#0U$#KBq@~dr{#f2>-nW2y7X<01C-;rr= zE98_SLR%~6Q|eZq3kh}t5%JKcQ(=WW4DSOT1nGliT}l-B?@57`&S&r6FG{^%@9{uq zz);w)Gwf7E`y}1UD;Lh|mJ>ud$bp;!*^7eujeFv1TVJnZ_rF0gO^XryR{AR?*NR9- zf|<ee$4Ef?w7zrRX!CK*r#eNj{|Y(>{U)0NUitFK>aPKmqAYRXEt;fzCCJ=Mi3*vM z5Xs=&ZA3$e@$*~r%C3y@r%FCFxVF;WH|9-K?D_2nJ!mSztl)^Ujq6Tq`ee73aUlz| zNWzN<YNRK^&&ReMCf;86qtesDdT}R37ptWejcq{AF;AVOT{y~O>PP4)`j7IW2+5hX zwCEW{Q-cRgc@;pV`$e0o1(U;Dw(}~W{Pdx+1X{t-jH-(?P)I{ebD!OAIzaSP+(ec! z=dE|j`cW=yG#+LUyLjMlySIW&EWL@-`sZ?uM)e=5@D(lo-d#a;ZbI!B54l_QdD`5x z<~gS2KKETZd5$*&FI0H-a8vScKo@~}nCpRc&n`|DNX8#N>glq2=N=TCx1m@n0l+I? zAX#;zGd4Yky5pupd*>S_=?;2_y<bOv%rH(LB%H!KraQ4N2me{Zif82_RMyk2*>DV2 zxt$T5-~Zy{mj+dpUS1T~4gD|@AuLOg_^88%q)X>@TTRRdkhV(an}DUX(P&uuOSmiU z#yqFSGD_a%X@p$37qgd?Ygo~7kVP@nEZ~3gt%<xGm|e&eOZ{HJz+f)!nP&Qg{8Z6) zTb06Z+r|R*T>uki{in0<4>*L7$EUcLB}nXs$Md>+ngVux<Z%r}d?Z|Bp4dd`P)N10 z#=c<I;wJ{|-XaLw8GkM;91E6Q5=d&g3auPR0=985_lK$(15P9e%V&R-V=oUnVQ3BR z2q{R@7VFzs)aUOG%JaB%N_@pH4;QTY?or+{74(BZ$c__l_u@M$<-T8HlF>oAjeTlv z8tLmxpqk-m-Ld`PTN6Z&$HgDwEN&`hX_~>k6U;-Z7c%uZX%C4%3cK?WBAq0{=;V2_ zUh<85MEbZG&(>60C1#W)ZE3bQ9kuWK)wIkp`#G`NWH#oe?xv4fzK++#z0uI)@nWN6 zd78U9Qv&@#P}tVQq=71*t%YyE<s4ObP^!Z8r14n;bg~SG>~V@Cp}|A%T3e`#d?Qyp z?n+osFC4~7lj9Gaa96$%-{x?WNBpk)3IB&OH&rE?SB65<aDQ1P@QLHoY+Ql*VIuks z%iCMVWGb84f&_hShGcO~I+=3@IgvaV-%8Tyuwsu@Iwx6^h%?^(WAwtVAhN}hwyq>| zu74V8oXln%<)(@dyDxD;OykJlAtwhhns-gCo0XAD5R$q;fdTdlSRRwQ53Y}bcRQHt ztrxH&&r={U**FGv{|CxEzuhbF!Ud+5^#uHooB`Q4Mv?w6oY;k?$&V4ehhF4m24s66 zrOhvk6fX7gI;}mqty2ryq6Me^&?oPwbiP!}CiY~wz>5gG+firtLaC*#h@9J<o6~hq z*D8d*JKZw&nV;?uiz}~eP>JF69Fl=IcWD*3QUt7KU69u|w4<o}MI<u}pq(J>ZS#$I zZMT`n%DZ6xwdV!)mrLf1$H=6FgnxQE+jG9QLlmGEIpJ;+>w$hS)lYiHYBT7Jd?d%J zzFE&lzAwgC$^YQ)2-3b{n&k7yMlZY};GP)|nH6ow-z`u-Z4OuM{UtlxR2Md0IZ9Vw z*wYt0*y>)gkY>h4QHb!X_1*h?;0O8GiS6mj+0T;9O*!)M^mcqW#RF-R$VzR1-qQJ5 zM^iMfD|X6yd!h@|sE=>#zb_mg1;rh<0BQal=?Y!FeCCm>F3nA9!`Kg<3N_l%l}OI* z-F)x4Ucy_+n&AAPN$GL_DPX~R)fUVyos*`2c6z~xzfXpgu}5fuAR^cXLIwADzrYfk zSDJ3Ftth=t_V>f?*p>f@oAQraReuIJ|BD4N;n!8r!t1Ko=&VJHDXwEZMR<bir?zsr zfS*zPJ5ZXa&iCNw4_p)%Z!OVKyo869L99(EZ;b`i453LnX4;`qwGWrU8@iO?;^l_@ za$j66$2{JT;Fi10AZhadRS>{5uxZFe*y1k&j8Vy_6qqZy1ZxeNXf!MPHfy^!qO968 zwetM+{!kQ}`EqDP8+64aD~iezB4{e)7}oifg}^+Ewpz(?S^LyOcBln^s*2+G<I$(T z8#$dbIDdK?np=bj!)~y1UOH_8phpTW81<}oThmK3He^>CIuE*CL^p&2#yA?qQ7S@j zHSr~(Cs8vLg%I;YCJe{hvph>i%P^BiW^}uy`vg}HX9UYR5v9+$Ezed%RAEug0WUcC z_a4ImxCXYZj7iE2NxJ>M&NGsCmQa(z=V*-AD|72kYe|`5L7rCRz)m_zJ4<p%m(BaI z@str(&Npcsg*vK>@%B2C4l+w`wSsZ@Ga&>6I|}<MhLz<qGev{IMJ%PxI`nRjO0XuD z`e($LX5*ufAYTZ8P<-=I2-j#Hh;@GCgUeDgrzb{Wb(R8G9yV)bMdiru3Xd({fyIjy z;so<!Q$7OTvL`m}!$%UIbk$z<Z2S~Zlz`z0@j}D349B=-giEYf7&5rloDr*s=Ya}M z8tR9cQPS$d!X+nZU-{BAZyuSB$ci>rJ#(9%$|a6If%08mlSxc+F7&NX581a{dx)0w zcvmzOkJkFxoV@_G&#j79BD$_wyNJBHMK5}BStuOUJ&Yt3!N4EWp4lOYGh@?6`JiL? zSb?0W%}mU~9DmOH0e0Wp*b2}~6#q+G?XwFOH!<438={=|<6tA4(}rpycq?L$vx3fi zAs}BaijBo!vr8AWZ1#)q!sNTvRU2n&<sY<A4e@{g$wRx;_<g-zqxM_tt#ap)av$X> zwC-Fb^YoPIq6Kl^cRmYT_u>1%mo}8ZUpTy4ML%t1RC%>{!i<X`jg+goEp?hj-<iD< z$iXS}&I^y*-hFXCDfExeW<8i0UT>&erM=4MN!Bl!o_RE}lni~6Qj0JF^r`^$@;|zE zk9mId50yeeAyFJDqbHW;e0^t|+3y=)W_|BYee8WSEZ|d3uO2!zvsTVLMUo@?@P2~` zhju){O-_3`_3566HyIwSOFhw&gL40lzWrmV!Wi5rU*Yb&AKgHA&lN8d_xD&gHMh<H zRJVd~XK|e-EqR@%%uwdqp2m9c$-ECAUD^5ziEGxur7uqCzV{czF1E|4iSt?b=4d^{ zXv%)&7g=(j*m#$zZ;9(Pi<6qt2Xq+k*s4pTF@i8!c~vFX$!7ZHT?w4{S4^nPKE*sP zItUs4FUH;~D$cd*(nf;269^V81h*hTf+kpSm%`m$3%B4-a0p(wd*K9kcXxLw=-S<* z|9|xR?t|~NMxB)0&$`!|b6#snKv0{%Xn8``mES)<!Sje!Aa+}v${Jbn0efa${Khg$ z2vwG(FuzXBU5e4%IAWZhqT769cdE91ha_l%+^{I~qv!=|@MRqG3<;XXneB+D$<L5# z+xEH7B2XPZ5)zT7BWC!P{2QOPbr0pPav5s2zxj%3Bqx1rU;*=$`?c>*iOdh;RZ$Uu z7%9~G&y2VaF$5BE&SBW4$&o1+=I+Fv|JgBiw+VrI@!6x_CNZi~ynqS=EXiU<{A}3) z9s-ik{)(NGYMD<+@@~rL2@;bc?i)qbTU5~$w&trSRNJ_^v2t)Ugg3~FB7h?FbS}U7 zro3zBjy&VMY`%e_!JK-TJ5CL8R;NTW6}FD{aWanteA44nXimE^QS-%cD}$g<rhVlg z77uV@_VHLFJ4pq$q7BN!#8mvE%7r?|n)6R8s(xa9G&PpyZk7)}(WnMp*7atWryyS3 zee-Q!L#kzMzoC6!IF&tZ<SxJWl!;+KV7bjnIYe%cUV_thuYj_w*O{FwihIWN-5l3+ znZ2kXBMWT>fkNfcc6H;PpvAbBrra^tP&0LH2;|P0C;g<MFrpe0{qDRX&6-v6v`fqF zoUHWPsa`aD1I@+T;0WfB$nJnJ@KGbPd{#ey4sEq(LEtM0@a-37rK|Ssou}{hIry;_ z5T6W2;J>Q;ml_*G1WN@Ytk*`nl<=$be*HBfVcV^i30yj3aU3CZ+Tc{*)P!nm;l<=T zK2xNcKqE5ZDH!B*ZUKT3@G>doz~e`u^=C}rIFFewN4(+M0)B=i=631}V<Bx8f{a9_ zi`R4j+XD8|nz2HiNgHpK#R?1*XY*e??8mN2D?4i0aKHjK#MM`-5QqTA{8HHGvlks7 z`n3+V@zc|IJR=ve?@0nfe~|Rj)X)S;r>muYr~F<n81UnB9UjN}(cI#}TV#}rViu)% zW?VlaFTQbO`f%C*6Nw2>)9!VSFRbd<10QUTSv7d{k|&%#D*5MdB{m4)b87St8Zq;$ zo28m$;r~2Y09^RTx&*1rf^0O>nZ4-<N86PkiGRw|^_ox1I==||)YV*Gj^^m5xyB08 zKi4O!6@LmA{<w{kGS2aYn)@~)CH2VZwxra!h5kS;!AA4?_(60Vr<+S|?12TqhAP;K z3dD!5Fbt$-Ypp2$wzeXZw`l96KFZBt(Bl7oE#C**`16Dss#W}KkHk&PZ|wOM-<J&; zx<h5(&2<^*Mg#or5dEN-$ft-pqn8C~5=`lEN93KQahwu%la>gTUE)@dO1hs59wV~= zv7^+BepuR!oOS1`%?Cjrt>s9_a`)h{<FYe5${p+S0}qpZVZ-Eh%0CxAw7c_fWTFA5 z-m}yB0LvGdQJTvc_>P${1hYo*fu4Iw+WMnQ#n85_`;ObRR1LDB+_@l(t|d!@Rg&5e zYfMGs(j|;p9cm#Y7ALg?f_UF_bUrlQmc<ZYx0V2zJk<^M$M@4HM!^j<D1!Mm+&tW6 zZML&%3ci~?bldy-)M+BAwNcrrhB%+#RU@RCFyu7F(DkKT>w@7h+DcdR>hO;4hYNRS zjUY=~<?o`c1#0p{Pmt1G4~?N|+X_1T2`m5Cp+2doc)CXW0L?0Que2w$ITrk`5d=4) zQ(yLG8?BT^j`m=Lht7%i7Parvx`D$<g|FSlpaM7cIWVYd3V%y%n*iupuIC1nz`!b` zH(y>GHZ?zu*hw}=6gUH@?{7f#erJ+5d`Fs4>;WBJJw15~lY;mj20y3Q&-L6Iucc*I zYKzr>RoZuRp<h2N;U_I&HV*znz)f)KEC2n7Tq(8mR%!Tx6!R|ljkohU;<Uo^(oFb~ z(|13L2PmiY%75@z;lE3Z|3I{#FXvu0JtZtO2@mIgni<$v>gD)G-sB3pJ<|7e^L1+t z&DIzO@cphd3G1p(kvXDn$QgjW@c>hyvF)YBJ^!xq7W=vIHx}h@SQ=3*x>oxD@@#y; zAVDY1Rv5|Nj6yjsD0)`&lk!u`&Vt}fDIFko55{Tt>j&e0w*A*7wBbX>k>aq+T!}th zu6<l}^|<CL-4G68yQWK!p^@SSrJ?S$L(*3Z>!j9SvB1Y~{mtn%Pwt3=jbU(lc3;v* zy_&w2)$|#P{9N-nUw9!F`I2>jR^MLE><*|<J6{zfkD~i?>D;Vyc7E=ALJzz;gvzfi zPNAdHLH{~;`_~uc@!`^*yzXXeTfy9iq(_y{dHcNGMSLfxRxznNr!668iDuDWiZ1y8 z8VMbtB`wdafsX4(;8;1w8=av8MU+nS{fy`tg^Y5YDEgE!pD?5Cqh{u>Do^k%odu_v zpna~TG3ld4v5u+LRDlv(9d~eQtLB`<AbYVg2tO;@Jf@LYqrQ5ju%;}b6zLvjWVRjK zw)?P$8$;K<(+YxQ@<ykhPg7!I751&5#qt&<n@$-bef*7TXqeeBnEZqx&()zM!#u1? zE1oSvN3q^vdLM6|&bYrnV0j-=W1sY4vG|_#o>v_2&MwXv4I{__+5gPy7*4uxsUC`R zu!{u_SYmPMWBW0l0JaAFOHCi$$kAe888v8Rkb5KV5s<DGx*vAL*VLJdl!mx$Di>tl zBMyEoE}%}VWr3Zltv<u!H;$LaCAk!^!ZQ^tx<)Y*q_0O!Oae7{hT(27M;?fbCR?}& zT>o;^HMBl}R!h1;y6xvl09BM8JGbM(>!b#XV)?KOu2|1dF1poH0W%Hp!zeJ~ru>=% zwGOXStH^i*F(fEpvQr{VXllXm*AMU)a>Gfcg~rr?53Og-h*Uq`i%xhqs+wtMQ+Lhx zB`<)vItf+uR7$h|aze<$h|%RHeB4IeFrBMbhiBx(p88~3Ek&jdD==rVo!4!+mox9! z4>niR?96Jd1y+^uZf+5t@00l#)l!g-Hx2$l7MtS>yvNdBbZ^f(yuQU}S{p`>^4+ID zdL}}px4rP($E%lEpllCL`#C!(ef!<APU+z^0U^GeTwYVV9@8`XE#|c+`*|w`@OWcJ zLS~&u^WP$lALYd-9Avxqf<xw8+Su+&I8C=VobG|&@8`6Af!^m$>)_PUWLii~K~{V4 zFdGYJeOZu+#Z+AZZ0pQ=5RgpZrM~>)$cNIxvPlt61b;3KMVBPx-YW`g0fyE#{&G*! zCSJ+urM^(6(PpcCM6%IoSK3dK;U`VtUyF)L*dZO3{D>^3FI?xQyIZ>}E41vq1GA4I zUclTAqV0x;4?L;oBI?6`ryi3K`y0Xq!5?R5qAI(8_h8WB7$}zg;!6x<a%o-PYPqwN zm=CM9ZRE@xGgtt(i4U(QQ6aL*Dg(^r3!ls!CvWeO&Q}odi0v{eZPz;>SHn<`#A*E> z>KBFlw*RTe5K3W&LH2v{@_cQDB=~ZXL2@k)cH49+{MCQ)?4Eg!`%K{5gm=TJs|gdk zX99C&B6)`+sMpm0wi+ROZAMjhr>jSS4jkZo8YO3mNZe?gf4h{W5%Cw|B}_v!Xu`$Y zp7QAQ{yv<+yBG7I@Rv=I$)*b+QejQ+X`HWjPJAm@a{XwCXUDxMYZH#G;+3PYHe=$H zBY~yPdZDa{qHOXa@aeWu^Y=)CzKPnJh_$1<N}`a~%21E8xKO%ICUyn3eY`ki0KG|C zP?v|lpGj_>(_&~zPSWluKTP*@!s@-1XUhm*OzPWq!<)_6E5dE#H*HSfe%e4GfOD3* zpS8jKB|>*1u<I28ugUlg_mBuP?33AhkKlm}!O+$CGNR5MEd!3r%pbO-wv4IVbqohU zhFeNs&<af+5)SF7@@bl1uB3yUHst9Ai5pWs3Sl3E7DIlf9Z(vmGdph?5~O3mb5~!f zbveZk{MvY5L76TFEq?U25@kqQ(;AzJlAd!e!=Yg_#M(rRjSf^)R8nk(-MYDg94>Fh zb{-4w+Su$dP`GSV&@cM8Rb4;p5Xg(Jr|$f25FZalI)4|WiCmf14_@ZGCEC#&eIAuP z2OJ&C>}<)t{l%1C(>-P=R&)bwk^PZiOQh<mEtWTEJ8{{gygvi6|2$l<#roO#Y-471 z1c`7k`_jC~zkWP|4*TG3<_OG@RG)x#7hKYouSvMwP`TH)%k@8(*3~JUD>#yyu>i=8 z$rY`~rHO>qa{baMO(@~FViX7osTDBqF2?(OXTc+QPz=7i{%480H&kMsBmb87|6v#Y zf8$)|ws;N#;na2{ef2wktaot3yIb0J?JnnQ?b}}WwmQNeYqH&J4j0WT97Z~%eJbGC zwHDD-q-2!{scP9`FZTSkJ|gssQ9JoqGT2blagTwD=p}z&Mf1i~AOOmpILdT2@7gr2 zRNG%MoMk0clDFerY@IL_imj&7TS4x@c*4?n*d80!I3yxG?MTNr>6Im<$Nr8W!G|`> z8~T|K@F)CgZG8EF)BGXWhE7l5=k*4@*00)?w*<CnEpBfk8J0B+KoiB1%*@r{VMT+a z)pj?E5BhTGdSyaa-KYCmUT51BzU|8<XRDqrgBAaB+y9Sp*%^xAf1S|!>2Yb)OvpM| zrahoDA*PdGyUp!&Jv;05&ie+*y%(Iq%$4N#L-}byKQm>QBX(q)a=}X+HodW1jgmeq zdNC>v$Sx7dD}#(K<tAV--YoZ*k+)A%H^x<iohi|>UDY1VHE(Ye*R(iYBCL3yGBj0R z8H)jum+>wkVd@93lq^95mZKX-rjm_9(4I>Mfou?Ed61}k(06JQ{P+s*hP)!#`}Rl2 z$m`z3-|`XzOusO^-japLdjD#78!+3>!K3L5r3)}wMKFuzu;*fxMUj))_jwNGE_1;) zWz~~n9eJ4Q_T>#MfVK3Z%(>I6d<7empJYO@KXq8mA`TM`ur(}5fT0xOyxqz}tTKi! zy!zI61{m$Mmxz^-=57y4wJ%={Hw~=7GfaV4i(c!_3%BI_i{85sv2L_YdEpVDce_<! zGNm}~Cn5hh3#9Slkj#y%ve8)8i>Zd_9!Jq@1tb&>%UNqNgvK@d<fttXe63*OC!nkv zmf=AYrUw|9Xo+l^tUbi`D4vx&KA|HM@NFkyMDUHBYG<MjN3o;maQ~2w=xak628OlP zT7`{BG-nvMzr2EDxL*Xx;raV>e50hxWu%RhsfeMfTOH+0Y8P{2u!0C+ovg|`DX#)U zdryQ<A;5uUx`R{ha&>&h--5IZJX#}wpx|O>>2YokY$87?VTYpp8w>HcZu_7Jy3sv0 z7$o9t#@dARax|`I!2{Vwdg4ge*&8;}+=27O>LW~5MBur2J!PkR86o|Vb20lmNB%lr zKOVPkvD==dzf#qQy=Lw(xn!-JYa38`U?%I!UZwArlU>_OiTpmyU*Z4w6aF6|UmhJ! z6b5LREQ;$9XXs9pQ*D8<VL(*C{~kKI<OY<~@Nw$IWHlB-_wvl)^&TCWTF*D#e2 zI^VZ%1SDy`$3{MFCNefV!OCc6HqUYuJaZ|h?K(wxR6KpMF?vceoRV%nexXQyJoGdI zmDFD;6d$My*1Y!YE}+9L5UrRJ-E*js<gv9S<A?oLJZreP))!{PA!owyE2sHxao~OQ zxhBmR0LlgtERoYZWpq+Z78s6gGk>Fqp{LPIy#p_|uPu52tkOrio=;u1hIgMFc}Zf5 z%=U?nnbJp1p?R5)P;&KsYkmFhE@kV#e*FJ@@t<&!BO5ZDJS7~+`gLy5*US4-9%{CX zxwQkmZ_-;XY*qgWQ&^$%W3>j0jm}W?hf-Bgu)Tf+7KGR&=1B&hS4Q*0=l%cd1qgC_ z@4%A4W;~Qcnf}#;Ay`Q@CWl<<6XV|CUa_j#tKJ{33~etINbii~?Gr;9r0#lxru2LU zH&1I#nA^?e&(C;ex@DwINH?48ATx7ZjH;1yshg=0RhgQszi3qfyGTS3?wTk_=?eJ4 zvEDsRUd^Q7>RoA=B15%k_vaN_5DQ>cQLz`ph&wt@mrHFdrjdnM&80GRoERbHg}qD{ zbD7PZ`I!f2e)Hz2WyOyGL^vnJx>DoY9<=Q7CYPDBKWFi>+~)~Pap7eV5r}F7oIFW6 z=+J*Nlugt>*g5s>dL`pM0mvkZNs4FITIDeSC2%%HabRQj1oiZgt;%U`09HzWCiL5< zMRY@qJ`!%xa7|O`G-}m~jOo#3y|E=|z?HS-K63m`xa~)c^ChMY;xRq8;HbFxjv{!B zM<dk`DK%^H1A^h?I?XuwDT^I7g#(>rutJuW3q^4%zLYwh__tT90)6=Lilt$W73&k9 z)o2;7VlcJ_;7hsvr~ry9PGFF$m2W5vJ<hp6fN=fgs05e3+!QzKfnQ$)kwfAp5^AB5 zT_`XghU%iQQUIO*NMA;Ge1=)<hW3aR@dEa18+5i*_cq&s0ZV+&h@EDa)j$Pfbyw-S zxTv|JVivkcyJmjc%1O4-3tS*4E2VlhGGG+zev+yBN+t+86I$k9Q=Z;M;3^6|H9;ez zWtqLy^@&ErAr=H)ilGOFlVpQT0QD2@aJoKm=Q`!4N9_e!S}X)DDmkJ(Z_I!nu9J#y zL(o-l<FBNE*KXg7y}1U20mb-#6%#x0{QR)}vi&4t@r96)SHQk+UhB_ijbKQ*E6ByZ zsj)GT!rn-)m*yP>Z$7?Oma$Z78E<hreo?)kp;5*@alcuOi#Qgp;NE1+sUFuB3(G)h z@xpKYq~zx6i~RRaM_RvOel{3%N~60iRkEka+NyAf`#TH#v@S&HtCOYr*(tG9jXjBa zg`$mIWIhocx+@E(2}J&)+0;o0_l8_?t$ak!{X5w884}NIpgh`XgIm_zfpB)P)v8tg z*Cx4K{rJ|NH%qp#Jh|hkb#@tU`~J$2_qS~HdA1AxD%5khcFs9200n|~KkpLi8UN>b z{g+w`3w@wrQsVeiUi64>WKQzD)x3creUSB2WA`*)X^aj}OT<?KeoupCJrYc|dfB?) z0W=#|K*2ma7orS3IT}|0xkTOs{T=J&Wf<Id?cs?(+IkozU{LZv*@i>3!|9LK4DRab zp?nxu@p6)EX{ymth<4<o^N5FRR`l+u?Ga5WfQF)mk>TT>Lqv_n#DTN~gp`#@xIwDD zx~$BGzXFA9=cG)%+t+6BCnkDuQus0cNWY1kv_ae#kYop*@)urGl3Iy&AoCKvTTm!4 zjoNgs4{HZ%QHq$bZIXktSf#5{xp4SV<*mk$&70Yb{-s|eSbo@Gc)`3Pb==_Ey*W4F zc;NH*a#=de+{UtQ?(k~gcK#|or+NttVAoY2ZsZIL)KYunRf5?GTd3BV_5|`APCA63 z&AsmcS7j1^B%i!A*RHvi{g9r96|T%KhmZ{<TrOtY6t+yr+L&uKNKES)>SY!pJ){W` zV^FBf@7?{Nk?$SydqCQBw}KD!Ey+tUFKzGOO3xsq1JR7&sQ2X{>~5mKPUX3s#1n;v z={%(lH#^w7RHH)<gef#7q9uvlVghDcu`Ul!5jYJY5D|^kI?Xq~FE5$NElv3o6$Hz$ zd``w=mqGUfR@+l-F<NSR%EyK_O$mfg@?wa}rOpfML}Yg*`JQxBPsS=vILv~3a9y#m zg7G%7S_}ZN4o4|l1mEa^tPT2)Gho`RI?(SuN%qFtoQzy*T|!vNG79eJjG#E0B{w@q z$td6ZWo531;QVQD4l6PnF#9xfO(%<qrLe_<^>4eo{LF?<0<e`BYo@L83`51N^ss}M z>iAUlwy1Pntv2{4(p$ZV`=Z&3f^re4rY95d5(<6|2jBKHW+x_t*K$AoTL}_yKt_gr z2-n7yI*^it8ELnBear^C-LE#Tzk<qb-F)r#4-T+(ghFVGA7h`=2ES+Z#5C+yZiwpF z9+#)(Yl+Z~Y6Mv-b-_0Yg@&wYVE@u*PQD%TWJ!(ZXBX!4U7s03ZYQ~3mCl~iXOC3E z5wPD-vi~DZ0Me1!-zQOM$cRudb<Vu9WGr{IXH0%UedqENkcSG;J0ZQH2zdgXrnBZ^ z9PcDl8n1+7rO(!R5XEC)(%t{%q&(#M_2cgG*P|h9GAr%ZY}TB~Q)ji~S<7ZPJojoH zOqTEOC@`xg-2=XWV`a^1XB{E`D6PQFJNcJhdFR&Avt0hve;cy>r+%~16A68?36FqS z>xC7Oz3py@-tG^DeU4wUZO!043n}C;pz8qTU$impvE+9Hc_iNH8wzfoVPiOc^jA)f z^V0PeG)$F8{4$4fWEVL(P;>5>>x)zYCt!8JEGIGG?nLV<>&D2Qy^eR&X5B<8SN17X zRX><i@(#^;RP3$y9(lK77S~xK0+a4!)Kob_H#_#!A~PQ{5dF(}Gu-|#-pUj-p#4!g zu)7{r`|FC@_CtM$gP3qfulr4K^mcFJEb6x5P{|B9{e#h7E3i#^5gQ0WEq6KW#UIfS z+2kPviR7$E_%P9<oz5+I(D$%ShH2ZZgu!G8i3hk-HS-K@V_56T^_Twb&2*Hp--TKw zJ~u_cc~6`Z;a2&UT(Uy3i}hk3^q~o8m7h-t1Lz<0tuF}>ZQs|g)iDW>Ec~fYz9;gl zs`mTgOPU^xIGALM+eb+HbVnoC)<vU&M%%n^d{xHCO3UNHi)IxbjLH3IFCnABV>?3c z{Fj*{R~TX86Nav)o!;P@ZI-ORv5h!~JR4Ao>c$9kSA^PMmY!OvEXS{N7X(B&otV0m z{rO{^-`PzUfk<!om3CL)W1Y>3H14b++iq}gBUU;+UoT1+V%5iAtS^%()YXoMSXQ!K zSoMv;@907x%Zrm7$1tA{jw8rBvAZb-OJs?4;h%ZLy!7QD?XaI6WXQ_uOj)NPz{@<$ z&WU%+?=98k@bq6Y;BH?f-t=AW>RNoQye7!?EFrSGsy=O#u<nf7*7Z;W#M#Ey4~&Xp z*woHb**E=(E@v)*v6jFxlb_8Xf08XTB0@{6JVK%)?>ti<Ig~Rf1VbES;K;f>L|Fo> zEcci-vWoI=Oh?~*r=!g3BWd<aGb=<p`>l2As?qaiFza6`k38Eycj*A4?@C?)I52n* z@^3eQ*V$#ebzwffh4t0-<<-SpM)9QlaQKs76=Y;5=i8!+e~2zoZV8yY$T&^Zn`a1$ z#NyHJS~U8+GLg!4zNeN+va7e~G~Tfo*OysRd3OL`<!WXp4+Hc)7`fsDvSaZoh)HDD z+As;X+u2NXRfa)qDWH-##`W*!XI5-_0*V%!Mi>(C_dOTDdMwha%`Ji_ppb(TAVI+X zDL*{TYCc;1llIGJY@e=%5E7wR`{H%Y2AJph8E;3=N!!MO?Lp6SoQ@BeX44*E-|*F0 z%hjVg;879q=@HuU9*&Wr#r#`9|G)CB{!!Rad0Nswyaqa=!+y9sI2GoFK!o|;ggqDk zvH=Gc0&IdqpG#2K$amN0&fg=Z!B{V%{tfv74ylo8V@es2z)k7d!yOTbPt{JdLcTU^ zB+cznRbX&=ShiyT{z0-k7?SbB75m_`Kh{h}8ouIuo612J!}2zY(W}9Yp>b4@nQyje zZqh(VcksS#WoI=n4}|^BJ--bg9x+RraQqHrm0dji*^&Q|hV<_=7FNTA!2x~Zgsw|0 z5H8gT)<{WJj%KgnkR^)CBy#g0<S_x|bCjGao>cCBd7R5Z*8-)2E<Wb>)4A|OUZi*z zKY5D`N*K2;p9+uQ?@?bayg3BcI+;HdSoDz5zdvTf`CH?=dayQ++7)0ld-saaNAy9z z?k%%ex9*Mm-9{S$o7TIOd_e4$Z1!MVj3E22G)Waa+T^~19dj})9YL2^T2bbH?T>Ww zRQ5+Zl1Vi!Qc$j$eEG_4H2>35<aZm~F*))x=mHI_a8Dnf===0<3)ix{w%9Cw9}TQr zt}{Rjb0mc&;Id}4XwU>3tlee1)?!$Gt+Y0ObQzxX;A#Q8O}i#9C0Fv;z;~Y4zG3dF z+vo4$P7BS-wo7+bn4-?$V3JH{ww#5td6q<xep<MT=tGDMblWU?SxaeccH>1bj2&;M zKo$%Fti}NQ?{QS2yChjb(99@0liq~u>>Npv7=#uJ(k|=5DTs(i+?oRmRl2ybL+-i6 zno>sXZG|%|?#?k>Tup!>34CMiUW+>|{NKUrdSC2fLLbiIUbL{+C}FnSV@x~XljLTh zxfX!7d5mhv7d&|G9{q}BP8W71r;D&rER@?q%Nm9Av03ZVZ%?#LY=I=PDMBJS(G^;N z_17ukhbZ~iZc<j6VZgq7%D-KxDUja<!Mylu&`DiEjRRa8cE|IL(J?VtSXfKUE~iHX zF%$<5e)Gq-udn1RBAeYqQC1HnjaLP%YQMu#h2vDLD!`Z14q4PO^hM)VbCWcW-i95e zj__hpfd|e*6S<(4Q}1+RllepzDMUJgYI$rMLnDE-(jhtQKAhf?#wu3$!i})z`8gEt z?KmS$8&%a{q`~qZk=Ak2ob=UVLw!Sl`kb^nQB0ZS!!O`ISXngxQ+>9!gJ~=t)6<`3 z{FxY`)Hly$(R2}y-cUJ*;zQfh_CMZ!PB)>aNy?i45qsQ!^q&)J>K@)edC~Fl!t9S5 z@ciWMX=#z-mIHz<Jn7T*DyWj;entUr31__kcH)ASv=8knD8ZzJZ<6IptM_J0Y2S<M z6&*`0FQas`_za(cH^@oZ&HgQszl*GwZcpXs;k?7v?^aqd#(sh_lY0;DUaeeQOxZ5U zy1h?{?7Km2gn3#B^BxEZJG#5Xo)?4>55*qf!3lH&Zq^k(eOw8V#m|nG1w;+rsqelw zMvpg7T}?<GQrY8wR<>aG&}+gIw3ljDZG9z_E?eFUUO1Q)p$(P}qvZRw8*YSxuV_j5 zDPFbu+pNCaPn?s<Gi-AZc_7KEH}0k=e|6D^tZD|8PvaQcLhK7J#MCggCxFC_B}0F6 z&1#7lz=Ti9wB6XN&HFn$wJKkAZQAV=War+tS~5SXkwbR`SMjIX&R}Qo0!i&vD3_T} zOZSwo<Eas_%}}#`3D*#nz(b%tl`lP#U}<E~;k1<YGX@?di+Sp|Vk!O|0j5a|l3I*E zTypg!tOgQPQ~7`c8UckXfxnkrqTjlA(S{pwW1fyB8vzUkW45KP=-drK9})r%<@jlz zdDeN}dmNj=|M|g#qF(;gm-5x0V@&92+(K-v00<^N#%$Y*0<&{b%(qeXYBV0tuD>J_ zlW&TX>Zj50<OkT0vrWG@h;(fkuj7V&pq3`v2(Pb?4)MO!SZJVvbjLtxp9Cu$k=qXE z<{e9iHw|+S=@i0<GwGP&kO<~9nT;Y^`=|D-%s{LavO`m_{>v7a%ykBT`OJDz&$P6% za9zEKsD%?sqBVc}Dx{jiSWi-dP~0w4pISPn62&qbthCQrZ}dyj1U?XfHtfTGrrLe+ zz0BLiyzfhq&~t+CJ`sk_6_n-npLfG=*bf_2*sqP3NR^1tB;JDo)x@DQaHQ>Qt^IjU zd;Mk1t%Ea5*3Gj$Fi>zAJC(%0<$b`TTNOAof@yz0r3qD>=)kl6Y_rSO!{}FjY6A%{ zZa26+7D39nH-PeY)4PROk?@5QdkM=25r1#u!kr?DSXt84SS)ZxqCs4&sa@es-9B+o z0wLAkb%Kdof$g9pQDKefOs&rCufsCZW~upWA6fY3wJE5CGim{YpDfLAr!S2V#6MnO zPMbJZe3qHspp0NHI8Jv2&EDX*Nle@T0|%{z;J?kxG)|w6nO-N<MwFK`fAYhX1;bTo zFopC$AsvCklh#6^`}2Cw3!|hwdhVBfJv~Equ=d1Zvi~hu|M&Oxzbo@bxa7tg=_({! z9()PTev_hyA0`@Kahnhw>0oL{b%y<@>2H7l2a7N8i}g1)61uW`Bn57=%pS*O&iPr0 zz_+ap|3^t>an0V$imRVyezp#H)0H0;%8<J!&Q6Ez=V*~aYW0|6r2ei)*L_jZ&P~*( z5`x)o{4&cWO**<XVr5s?Zy9Ma%t4jDLx_f7Yl5dA+#Gr|RoD|(@u%klku?);$Wpa^ zZo-P#L3bj~k+KVWvqTK8e*06DFIqvW{5ZktMGS+}@PG-<Uu%3jx{!Pnl}VdKB?E(1 z#Bh6pcN`f%+o{2x0R`8F`f3EuPQOT$C>4~Og9J8XcV+GfnsI^~5`TzS*!)_#;7+W) z{5Z6ffPg3C$KH|3mcy=~)zDH~#$$OJt$hH~#slbI1dGGdv1AS3IhS~c?Z>^A7SEjv z=6f)~Y=5cGVdr7!HoIQxG5(B8U#-BIrs>kHjqiqgh9^VFDQi5H@nn@r9f}R)asHU0 zEyJV@QhqAwmm!_I0uK6)gkx9|)X^|4xI3^r$Sgab1S314(duQ@$yhG5w31W0_DK~P zzbQq<w)Bq}^7h5mK$5U|WcZa1+u*r*P-L5hnG8$7T%S4+)yZb5(`<3Duk|l1w^)$d zt!BF^u1tx>-3*Cd^xCpCLHp3l@b7b1{?b-8P;g5g{_D;B9%yXLarUgV{Z`~lTV6;j zC|Apv@+JV@+r$GnT=&)&1G`zbGN=|yp|d8a1<<j<$g<7OTdgeQgqjq~9@~q=>fw`F zi`&glt(IQ0?g?J%6&no%V+u>bYVZdm&Wy(1WKpBa*5BTJf=MLoz-l?#&3>LK0^jVi zz6_;nFRSzyBE=s3i-!@)Q(*X~6PD6M8Qg}C>g3$JH4?t7e7%I`T|QL0odv*nyH~k6 z?_zTaw^>u@x8xvTvfaWKmJTE=V!vglTd6X;Tt68M)|Kh(ZnHiH>nNX%Ww*=ZvYO6b zksGBD!H@G7#HLBde_Pbu8PZM2FSMGabWmb-v^2*qo#YngY2X=a?l2uhZK_iwZ%#5C zP77vIO8}_SYlT&2GWmf<8`9b;#|mLkooshO>Y1wd#OhJ%Jf9+vFH}?fd61bzH~B-F z>6~$ulO)*u{1#j53&3JU`fq7Oo6c`L-e1ximTX2}Ge-@0o7&nwM4ypm2Yf_VyI}N% z4CnzLcfY!w1vQ6@|Id#wd}!yO<5hOYJ?rayt?%O4M6HbQo4kOw*dNP4B?-H&g8;o? zU4i>?rP`dp#!X0oYOGx~8lxP6eUmcsX8c^d_}5G<1=?R^T%-=CH-fu`GI93A$6d#Y z4^xk!9y3LS&*LsP81gNlM8q!&KfowC-6T{cok}Zyn9`GlC@_mTz0@YU)xVp%#mgp= zqcH1Jb-aoTlaP@lIJK3LNFxaPV~vyQ*~s}UaSeBVC}8UJx2Y|FgK<g!GWXsRDo4|( zO3^fy(-Fz=c35VN|8U2(QtwCJ|91QZ5hotKxjxH_DCnY*Ad+K@gbt3VKh|RP`=^|s z)fJk#@cGfM(Fw_mX%^{*kdA=uN!i^jfjidxvfS2hgxJ@&GX<;+$orO7WzO5{4h?RL z{2F8Y9_Ik@9%@`@iH`D>3S*vpW9uB=J&x-|F#K~VmR4KsoxS2&8<NYmBj3Ug%;^*= zREQ%w>`R2NjMV=lu==gcfInd+|AA}KT7WTT=8%@GUk)kQ!+h(}Sdlg}$R_PRosDMP zM4>iXO<3(G31MTN^TE5N>WR7Lbebp&G%*ql*`W`zE^|&}uYE#03f-L~t)6EKj&4%# z=}Gc-L<b;2qERcJqC;z@`t3N+DLTKQ5BY}#va;14**7wOBG>ufOEq!<^I8F`4T=lw zvd~_ky+dVQR_P{%dn`?T^!)KgrIH7BSl!8|c5%(qc>#*bOtFE&h*9eF&RCy#wD#v` zAJ=xQvE;l)2R-cA-6dC-)uvaiTRNa2AdvDb1&CV}M(eypEBeM)rntJrt!xQzwqMh& z!W8c|kbqo$x~XD51Y*?@T8zShnAtEC-Qc@<4)FqC^n<U5=!N8({{Aaia3e7KpQ+6O z<EKYq5o7_#&2;wj%6`Y|ZKdz?^15WU`~^Hw1c7-cCA^hkt^xMaGfdMvi4?xBmtgOx zV|Mr7Xv*|vDXG(3`uF?<UUs>Pw_ggQvvYU}$382rBCjy(#eVqnRGi9L&2oL*CPh}R zQ?T@<*hB2DvLC?&-=oRBFCd9Ql^a(_SBWd+XV542V89slVxwHQT#bvPb<R&Y8!L5M zzYvC9|ID4xkZ?seVv)Yy&8=mcV~*<bbUq%{U#<T3LIWl<bB5JzzMgYub(Q2~6>3k^ z0>qIae-s=4oDZ8GmkAT+tg{9s48C*SfB<(MW7_VjV_aIVcCF?m5&s86>i_)~Z$F%e z?a4#myS2CH(Lt}_ve{`}Um{Ai=5}8jn+@gP6=3m!?om29UYHc?3I>EH1ZlRvFui?_ ze4S24CM`aPDJD+Ma!g_*>GNB-w&9l&uezuonr|EXMtOQ%r&*IH2UhYphnjtD`SUNT zvmo9XK4VrwtG%jF^S7XQIDT`992tvt=1Uyh{T{<UpP~!#O#BZ#Hb;>!-xktBC-Jhb zOZqMNelhqhe9)l6)sOq<OlMin&}a(h4d{O4*(Y=ott82-HcZvD&`QQ@LVLG_h4u%f z^AVl;EADA2+pkt;42>F4rt2K7%LuWL9+mlvj3pDgx51a5L^;c!t@TAFk$AN8%_YV^ zF5o_H!HjDy6MqZCo8;gGQ0V921Y*VTPNpt^lc$S*`_R$(SR`hABmaewpFG;=FQ+u? z)`X+tzb{?@J+fbNH{@uc`-a;n<LJ@Tf&!yu#&>#Bd;VN~7LwCLR*%w!U6+r|C#6*} zod)eFM5SHC>c7#IS;JM=M+~lxXd0J^@_QZ%U&JGyJ_gZAnUj(vKa~$Ds?_+#u_WqS z_=p&i1(RFMp+!=U3o`dm`OvrQ5ii5f7>cXt{)OIu37aI&0m$EAI^gWl`-prajUqhI zFSLb-b1GTeDHqx0xEj<wk0yBk{3QmcXRZ<)bS%qY`<WFko?FXDRg`w+w&+-KumXP@ zdK4pmx3pKib(_^6XLHq#;CtwtuZiFuD?m%qExtYnaq~k+V3K){`k&fAe7*>le>Qc4 zvMOAJlm;dMC4@5*xAWf3TNr4N{^CD+Pbc)gXTxuI`>(6M;Ksm@yZ@4ThuWp61HLV$ z-h9ueWDvu4hr{L->bSpK_Pvd=dl~eshpWYZx5226S@Ge7x<2E;D&D$r7)@U0MU9~X zM`S=pv*w<ylT%=2{i{GPLVlV$Sx<Gtv7LSUI0`X8mU~HoNAXGFnxB8<QJ^uL2y&>2 zW~g%6J2tOM$!46>FU9NkeWza~*k}=T^n^v6%!w(2>npnun2i;6PvhoBip6iY#vpxC z6tGyQ^nk(uMGB)gl8g-XSb|1GNkHu_nJ6!CtJ>Xv7I3n$J~w#CXS%c}baLTXr=<)! zM`!LBNH~1#({I+HT8{BKp||zjp@z1;iu9!K|3|xIp%F!>HN)QLbdNLUv)=;&wDAz| z2kX6UHoaxH-Ouqzo^OiyT0Yhn(NV$}S*;l%voEMBW7o0u6PA@{rTsq5AlB(!?M^oB zf(=>0Z9yjj)vDPv(bBWgJm|t{oCb7;n{-V2(SF(kzNGs`dKJ5uarPT*3|!rxL=GGn zW#D%)WbD^uVK2ZDeKZbaBZ&JH_id)oHm^i}rttjRQF+DiB8FWSHJwP@x6X*;sqcYF zC7|3?`5-i18r1!wrn-f&xb1;Pvp-d$(pgb`M*~k<wL|vg3EC6bOXD5AZBNrv(R$s? z$Fa<8I=o)#tM?T72aMt+-~to#ZrU7^G??-B0H)8<XCC1Zs@0gjJR;AiS&UV%)=sOU z-8)-P#^Y0E*qFm3Xq70*m6?vmF4MJSdz*ZOaiuWQ?%M+l7v#B%l}n^0x>dgPmPGI; zm@}IN9H+h*_hsIJFJI;}=eW_LTVS=xDKEFAwQ^AUYF?O{!n@!}Lxg<PM^Hl~6~onY zK>J9gPYdR1jNo+-EnjOCJ<qk88v81s^^!sRg#3IjKRQH#qs(#CQKhFyu<B&J4n@KY z_Y1}QXG46{1{=?)1=Wo}{-nZ`c+=HH%C38?hBN#qW;)OLO~_t8pi$Hceck~5S7^Cg zcWBU!lz&s}1Qp*)g3!+0Nni$>73o8seNfN3>I4;krNRByFyV;aO9f_l%*Fah>i0j9 zFAf5NGImwIB4?{(Z%1=<_HW)YwE@{2NLBr2Q$D3G^@8rwnP)7lqrPZN7jCZ|MXsu> z|JMtU=8QztYU!90@)b0QDi_3ggF>!zj_F!N1O@fLvyH83*E+a0>1;Q1DtOEvy}Bi} zR6b)&1D<4@I>=VkQ}F6Z4);zXa`}g6Xm`-cV;*|8Sij?ggIx}a$6n{wf!FH7*98FJ z?sT@)2Re>_Kku;rm>Vc2f)nb5VUVGKQDMlmFyzeb^=hr%>jx3n2Bck=>s{8*h+#2l zGGaA0J#m<Rf{&xHEP4rp&eb~PWaLe=YfZMkhAa-pUG?rWGwWJ!{J-f|w95PSc6TdY zlG9RcBnRs0E(`kzRx-TNk89H;Yg2zp=n#0c#T!V&`2teRl_S>euWIL?msrA1kVmQv zm^0o=ujL#;#`WR3706GCTxJIxLBkoEay<xfwc<>BllY+|A3U#7C8g34~ki_h&|J z^#$h*dGPk&O5Z>SHsXMLFTM}VL`_hB&bj<r2PE#RThRS5IqygOf14Qmzq4s~m47-8 zMJh%h0xXjMy2o?t+vCB*_};$zO7@eF|FKoS6B{rb#yZW<Vy$xV=&WOmrQbaWkN{ou z4!fpr>EFbyt}Q;)O_(9*7@^t2I5A=%^HdYqyM>K5wkrC&*iT4gY=u>(wr{God4J<B zUoOT};A394WL_$wvehzgqkoO6hp&_0GLn624_u_ZOnifVum5j*@}Gjn!vHizqo?8q z<mm~eQQR%f%rDaX8EA+p@<J35xCu@b51;Eo^(72#OOkJxf-!Y0r=jbh0<)ffHAnG9 z&T2Ru_3FRS;}zeY-_lg}yWIWylq*I^J02rQOZYfXyz8xdrU^Iigm=Vx6V)hSsGkRs z7|&)7g|UVcM!aJc;ZkcQmYw~A+_~`-aOt(k5A)FbZmw1TjRkZ95V#c2_}Xr>YeaJz z_iUbGPlHPlWz|T^V0Ti!7h8Or!q_z1{3Uz`Pnk)&)Af%!6YV@obEJjm`!AXzYe^_Q zbJ{@hUv~VJl5++ls_2g|UWH4sUl8d?afYz^o-yXeBI1kxa!2hFf+SjPKJe=R;)6sO zv{%=^4jT-*XdJQbSz{6>us0YRxs`;h)Gt<pT@8W>>0)5eo0B@3lYha9U}mx4c)Mln zpUBPw{(6N#K=&NMW}IEm?Y0^n>KD8kGESkF0UybyW^9wwj=iQ|BGFx|B{a<o(Yh}% zGVbYOKa_5&x;Q9jl10ZfF3Y?$M}wy>x!)z9>zM%y1eY{p?22n$8;*=YKHNt?L-Y{< z%Ov%o$GhSsob^J=J;7<1GoB?&W~CUC=hEeSma!#W;ihnv7i>%7qkBiK&@xRny+bsc z7swWJ1EWnUFXlRXn*Fvj{&LE*_D~PyGD3et{uX1#|F$-F#!y0qrB@ss6^6rb(SHWg z(0erCZE3zxStoL`x368--rq}G+xhU*K8)8peFfhVRBS)?3uv~X4^C(6mcP}t-WbhG zm4|W#Q62Ju=mY~(2G3?g=h?DY(tuP6x+y&4?QnMVq$P`tg!#|muWxL#t-S<@DmZnx zGmBFn#cM};WT4mqA_cK)m9q|{14&0a_ELxOwuDi~>-K%2biTzC`=u4LpHH*)o9T*0 zmO?(Bbs7^%<}UYZDBO?rgBu(dmzRedSC0JYtVAHS*4racW&6WcMECP8k@nsHAPGcH z^pCEl^Ft;B>nj|9RLA@F{&fTVxVCx=&^}#XT3*()ZG1@v>pyD!V%?N@;fiey8$DJC z;CAve6&dIz#b;93i)=n)i-fKAWyaubfDzB2b|iue7T`}S#eT`~@@Fa`zAnoc^aqz0 z+iCW57-U$}NH;u|Cl0D^GFam;ssf3HsW^5P+xOp3SMvp-_=%8cMva!1VVpLjar%q0 zl*xP|j5rywj*3vZ$vM;DT|=2qNS@8-4QC+bQIm~?Ji`bXar5i5X+HR)5&*`0Dgw8= zrdk3Jssb!gZO3FC9eDa=mH+%4#vM`mN%qBVrq(OOcoB@OKn3$PtF6{55<;4?KhCLu z@j!rbWwY86(wR(%quti^OnZ0URFDn{z!FeEdN|6x`)9ibz}Dgy>klw>&$Gn*dOXC6 z#@%B_=*Q>x5=}Yme@V-wMi%0pfq7QyOO&U*lSc%*g&PB<g^gWhQd86Ny*4oL+Y_~@ z(@xZdW~V58Do%fzFc)3)t<ZgHEU66nxk&qW@SP0tOiREhJ#6wku&f_Ivi!C~^-@dL z?0<du@5-7n<ZA1zxOH=nR|qQ%82E`3Yzo#{Pi)}k7;b(fjgfp&XC-#N*!`KIm!2#~ zq{bCo&R7SghqLR24WTP;$$7;^TKG(S#99x#Hde<uV&o<~eFCue>w0(gyQsHe$upv) z!r;x&-m3gPxES4t3q?rdoay-?-CI6t)YVb-wlezs2=HRTI<kIuedp|*&r<0unJR&_ zaeM^Fzv#G{i7B!?N@uyMJ{_Evn>13Og{5km_P6Z2rAI|S8uvRSVuVqZFRE2d8l{{X zRIN!`=?w&*2sGi4<zQ^<J-@dDo<`T*A$IMTSM<W=WP|@2KHd0E0!sz+_Jg$&|Gt+J zO8esN)Q1biip;mSKz^q`;dg&`b6$~)b%86qXR5b-x$_IUZ<+=sMuaP4+)k(Ui154Y zMnC%CLGai+E8LU>k|(=j)9dkD-7lpn`kghSeC?C`SAgd0S%GdwBg_uFr0@|3<MNU2 zUD^eF|CKn3o}B`o(XRxgY(B!fIEHi4si0=I>ZyX?!dI}%D^iEK)i!u+)3$?w%<KH< zn2fsTaHC$_$%{*}m1<8UckRzb$MxiOu-haFi=VaE+r50bevg>Sw7K590w9;_*&chp zp<}9t;=zu85x)Pc;k|JGCy~6}r=91sfb(Ex2fhYCSl{;F9#|0}=@F00$J)!&rxdNt z_lY6Ff7N^2YQ&j(wsjR+H}twrXo0L;>`+T|xsAw^#P)iD&6~`Vz6aHi79K3BtBFWI zeED$H&xqbDm{x?h@^0DblYn^GZMis}l<H(BI7n;wOEnHIveY=2Cdi|n`MxI}=pbJi zMtc3h=@;%7?n@oPe7@F?$d~qQ>mQ;+M=&gUry@3`uGlJAH=`3YnAGPdH+6Wk1L%hF zBapR)4cciUV-*?UYLyMdJJ6%NlL9r|g0#o8de{uBT&wYA+sBMG6f>PNG>?QQZIOpY zT}b6vKK0;mafpJ}2uSE0!N}N8rt*FjX<i&b0)4L-HP_Zr9)tEyW=4*zA3H>>ZO<BE zU?U`QUAoj{w0`kJ#%8_{gH!lmAF!1r^`Hx?F>h1cz5m7`x=)}O#f*M$ZP1WGMDMz# zVQH>Z<16g^ijos!LV)XMl$HoXQ6a5jome`^c9RUn{AY|Yvmb|mqze7GRBAPY2YG}) z>on$Oi=%ir|Jr#8hw&JRk!yOnQHe9bFbYl?n*GBv)0kHAkrb5n(>{auF3SU5@^7xx zkQzN<n*L<%m}2Q7xGEoMwhXQE$B7b+^=TzSEG7c={EX2&uHRs9`FrJ?!CpX{3X_e& z50lvOw)RS@2c>yH#;$gY4XZ{6_K9)JD66;MsEoJ%&8r~Ss-H^?pa-MBq<Vgg0CVo> z{j85?a}u-L693!k<@@@__B<B1S^Vukm%7%I^Nq`T+v8r5jYSY@Zr-EFoC#8ZejB%L z<UnTmYpJ06a4yM>DiWD7i|QAp<C3(f*-y$){ZpcdIM!crNN3daNT@-Xn<oj@`X!=h zQGso0z)pav^(bi^c%=Ncmjb?Ew6nGO^X1=R<=&tE(LqBEe;53vf9LOYe+D&23)7R> z10_mrNZ`&-PAE<SQjqUh3oQ9M#bH8Xq0vo91k}{MpvKp^t2%r<kNNRdt&*8vnw`Vc zX{yp?E~ui}pJRBE>#q8nvqN?FR@9taxOv3q<Hk0rGVZ@dan3HRDam`)8j<g*KU#5a znyK`fz3u8WM_BH?r=8Q(A?^{dRb;{YQA=QLIH0pR993Wg?;{VlZ|m<-);Uy&DryIs zrAw!Ee`HkfyiGEB>UC+!+<rC-30Q^0)8GVR;1S!d`<xSJPoua$MD(35vkE+))K+#p z9ZgOu!oB<buOi$3du7IcM^67wG0rfTVG{Afe%QBbe-?(k&ig)tUzc{bs1sJ}TS^)L zwr+Y0X?0mcdb|qrZedW+6YPb1i3@Qxvg|+=LaLU#b^}|#`3qWB)!FC5<+lKJ7|g0U zsykK&jhFCg6OX_-tk!S&k-$D%aS)1S2HCdh`%^6;w(;PIRT`7##Qv|l`lm;Kg9wy# zva)Q&Q#jGLFEwGfcv^A3#?=D##pX53^t`+{3pe;tI2a6&3!9|jG!t_C6&dscYeZA- z-lH8=Scn(ZoOn~7AxFA%26ItA^&57HSbs(*`DzZ$?|l!yJ!!G=OVwo>9iw$E2IsgS z2L(Tn|C%+y8%t{5DmSy`Ko$k{{i5!E8Bz1@|0GBrREqSPuYTZ8{_$j8t+7wxxch)T z*-kc^sVyuS=7c|#ZzB^#t{Qb&8oUNxCeDFp3+q_GeI_!xfelH6imRVPE5K=x<*7O@ zfim%YK+4mx(xZ7~#tDp3p{;GO4xVj?WHLu3xdO&@NjP+Llv6fwO?b2uf6p*G0hXiu zvfG7Q+U!dd+o&)gNoAtaBhYJ<I0f49s2Cj$oQDMDmN+*NAMzyAYrB&NeDx9`q|>L( zk|;h@QxDmLYi>~Eqzn4M@0yI%C5|Gv6XnZ*$QO_mffiI%9|^dEL-2e?Gc_-F$LmX( zs#yyoh-CIQM7v{bXz-R>W_HchcL!%yBzM6!b+~U+LUB_u&i=<T;zqql+e8?^+-SN^ zeFP(-?Q+>xaE(f<IkNQ<oZaXw^X<slMp}yomi=dO>di->S%~lw)@;EmL-ufO=9nm+ z&#ZS*duIc8rjGhPC1mXYeQta3%)F(glI0n72EaWj=d*8q@pbOqMqe;V#SQ-FVW=gJ zUYiX_f8<?m>Qt{+VqIWGhiwqW@2n{}ySV<?xBh~Z{g4jul+bz&361|}rQd&U#(Gfv z4(*MFj~JP51wD}c5MSiv;9rvqDV02#C;Z%?<iwWM7ff0i7`i)FCOEjNc5|)fezVlh z6;&`?LM)lZV*}NC4dLG?S<A!-0n3?EJ{;5zDVE!*ahz+-2KKth7B7pX7Dgs-d32p- z!EHo7PNjYX078CJZ>CEWUa?i%^N*kb>8L=*B|sd1PbyH>7NR(|8!+HFhF^b8YhO5R z(b$N9;`z$ruspnwopsB}ndgGAdB4_<SM__G6>+%l>JF_j`~U3w;eT?USEauGuZsMy zk*t4c?=hqf;q=J($Rm5hZ(D9}555oWm5@oEJy4)eaBICf#=u6J(l}YMHd3imF=oq= zIa+%kf9C9*W%KlJ|3Z_nreVWxK7QPjMEP*o=p$a%&eC_R4k5XL8_CnVm(b=}vO8X9 ze(FZu5J%g`@vJ<5H-^A64Pna_vETM2TE|_X$@*K&`&3HQr4OQ^T86gRQ1&lvOBvsq zn32WD!9pR~hH4c&)u30<;6tM;1?8-Unt{1|d{|QI)KApchHM|~8p__SGv>;4Wc;5J zjJsi#e`#;9rLBif@JZuJdcBi1cIj*fsjT$!)%(%OwgM3)%}=*HU&Gaow8|Y3)vJEx z=KL6VGG;?5CzewF>cipSj1rW_DO*orN1QRTioQaj!1nZLEH%wsw>WW^xI5avgFF!g zgU&qzT4!E;fI=bJfTQV%%SK!cDy@`|rI1d(XScN>53mQGeor?wZuTzZ&<^qX<51Rj zcqTfCuP(Q*ZI92I>TPG0l<h&fBK<(Fm{3%=h_x$%+noc|Hvi2C&1RTkmLMoKji|!( zQMQ49|L^c^zhwdFIvzdANEO>Q?c0+3s^$=MBMLKDWQTDCleMT%8Z@t3LC0@}_kj(6 zrUjKKv5;~g$NKb`xj4LUFPrC;wpVHpBb>c`Gt;ms`Xg=P2|%e~5$}24%1%bWU<=&{ zHB#exgRrUffv8vaZx}23W<v?~JN*~3pOFALuCXg<V}agQtI+OZi$HP#)NVxU2b}Ap z1=cPrsxK3bgYGd2Hx7@+Eh_8Z-8S-&e5jK|LOrMYIi{V-%?}d@({=_RuV<n1E&X4V zy;W3P{j)9FSQDJ!E(sP0?he6%yG!Hlu8jo<K@x(y26y+yA-KB}+zHy)?eE-k#<_d% z@8N%+)>xxo`nSfaRkP-tRmHoQIT7w;Wm_Cxl-9ojeDuoO+oQ)PNIr6{9I%pmWkIA+ z(=YD-e4}kEFfBS4#I{dI#EeNLVd2f(G&>^dr1$b-X!Br)9rte&t0?9Eact!pcz%GQ zh;>Z{y`rxLMMixl-s%}sSKb;{e}TtHfyOBfsDG^_BcDcm8^q3|7<AfT{N^dj;x_!a zp{%7s>#9K`kxp+E*_N)AX-r~)gHusuom^AHQIWA>*l~=Gen*I;TYVzGKaY!MY+#fL zO>Hf=%OVX6wjPN5(=^*F8PXXg#gHXa$_l~oL1vjYoy~EoGx6NVRBjUlU9k%r+a|pn zD30`+qn}XfJE+tvjxGh+2}Z<D_ipi;<6UFpeA!7y+Z~<y+L2eMj;CN|;OQVJ0D4#i z^4Z1bk$dOx|2sQVNg8+R1l(jli9((?U@5xua{XwNc1!?J0*HpM##C_QPy~QqK6_x! z&SkYW=0~EY^cXU!5L%aiKu42*{w31o7mkjuMYJB?*@k!=v<$C~nZzcIaD<?164$WV zc|xsVw)kl<)=+z>*g3II4A#3&@|B>DAoz#okdlur%dg2c#Y5Fix#EYF)EBiy`{zi@ z$4J*Se&?Z#-(T2M|2SynY1UmmJ0`gO%`xgw%wrQ!s!jQ&e-DO(t4;K5?*539qC@6F zI6U=}|JLb%C!v`*tgglxJclLz>|xm7lS<>(FZUBnVZm*}OmS;pj<E<CAm^7Ak=qQ5 zIUQhfVTP|bARefZ%aC3y2>}?OXl)&&5%bg^PiitKx5H6ST$Vq#YV9tPt$V|!t1*kH za{(T`3Os9&78cZCYXCYmkbP|ikZzJmUQMI2)4L)!9A53TR3RT#Co$hhBuyS1{@6pX z_Yv*psN)wB<FmsVz@V*sT`W)1u3KZ6OIeZ3GMY2tJLb%QzApLIIqBDyjXL$8-HBLb z@7?;;z160x12X(dkPW6WPn4lX#G`3nloG!0Rt`5YZXU(~UtMHxM)+16&Uf7eeNYc2 zDKtQcwlRkrW=ueVr~X2c5c7FhZLed0edeqaEzoW3YlC(<oo7aTD(|`G_)w<H`}s7x z%9c)iL8a)g&r!b}CP?duL8DvC75D~|i<IZfqv`He1uthlhoGXn@?&oZxV}3skBv_! zp^c)wGb7yI2{qI3Y$yxF&^6#F!#4If%<&Ap%EcgYlV9KaTH{da{honKkgF;~%xnBR zbP|<{6@<-s5aoc&kbLc4yFt?%&^^>Rb3#JexVZN#Kj8f{D<n4JVskaRai18a-7?6k zv`VkTC(vcpdb@&X#7LlB020%5vDrgPKTu)5N=#v>dFT6^=(-9RWD`BpZC~Ztn6GsA za|Y_&z^6g)b*ayln5BAlL!y)}!7ZpIgT~EQpwVTUhl5v%cZK?%_QF*1L!fFe+NW@J z|FnB<^StS`apkA0B9W)a{j7upNQ>lE6$2IOSNOc3|L^5o4+#+fUQp^le+pLV8Vnj! zY<qrQ>sWhnZ7_u<_gVlK0bMhPCwnnv{c(6_P<||V0L$4qj4V9v50P5HkkGf@UQ?#2 z=49Myq5dtDpd*pJZD_TI5wX=Ylo#Xq)}e;NvYc5LFRiUJBhsZT|5Fn2PxzJ%-rvtj z<h)ah#cuQ>SL&`hI+eo-Tr#9>(`LP|p1A9lT{?G%6o`d#zcl)<S>FwKeS_OvLB68` z70n0<lh^B=)^WDmu^X~zBO^zYY6*&n7_uaH7~LJ-1p-#jEA*STIX=hye-HUzkNkh{ zE&v~>02c^c#5lukI&keKw+rCo3GnX5)1&C)bQ8fEy+)O?KWh-u50s$bU^qMPU>v_K zILEu%qk0X91Pz;8k4`TjNw}OYfO}EZ3LSv(NsPpZ%0%In1W1$vj|)<W3YOpm=)Bi8 zA>HL>x?^2%ZJ9~huh>+?h3GV6f8S7u-=tXq<aV4ohk9!MDD0gP=KN+XLmOriL5tx& zCw)ETf=xrcz;ni_(BwDkbn&B!0jPEHNHBOZkaDVhXyJfM>^<OboBWi+Z~7Uy++2`l z|5W^hLm{SN_5I~W_@4G;raS<_uOQaNBzcoUSj{PiJ=^+hDTz`l)u%i6{8L2O=Xcz? z4)!1Se+52&>1Cgo8<x+*Jj54we(p3adYh5_#1cwh7CqHa{@xPk#FTMus=@YY>~N#O zZiTZ^*L+k^Bt^G8_%SUe(sm5b_0^LLC3+Q-0C%r(V--b^>zQ$td<Z(>0H7aW5mk%7 z`Ug1+f5l$1UV!Rpv${OrtLFyvPYxfEFC{q^iR2wVRLn{ugD6VR2ajzHtEc!DlWp+J z!@M}E-D6YnD|n)#LOtPcg;#(Yq^V~(iYJWOpKtu?PXmMvAB89er=1RD4qB%Pg2N9& zz-;)FGpT%@2Y4je#k*T(y^DygJ7P=8sw)?*C$WY(HA~e^ipno3r#R_wJgQe7Y#>xp zAd!i)kiohH<2w3X|1WNq0#y|Kg46y)&V4u_bVc#dSe)7Qbz4fP_^7CFrw6BjZAI>Y zBmD}{i|!Ldc+=5u<lBx=>*ca4KiF*P*zj}w1YLW%`F5a{Q=qf-%t$K&5G3gCBGQ-Y zDU$LI;X+G5Zot+f=f{?XZ^036B0K=NCa4u}=D|S=;FHSW3&Wgq|GawcT&|SNMSn}v z^(9Yfw!9<@dM_h#%PIQ!J3Bc6vWxt4_S=7pWY}wc!J;Mx*z}q*A5o#yLE-{F-6R`9 z>8ucVVB0deZhbS22))v4`+-4LGyHOKqY1~ZIE$?dk$$?@^+O*uEZAhD5XaM+5qF`% z>ARd>dn8qUE=~R%b;c&|hqBa>Sv(A!E)?cdL%HeXamqF81V18M^WG(T;J;b=$(nl< zlu>E@(0M$@r3lxM)vG)jnA^TNksg&2^>nZ#R2}n@376VE*jMDLkWN?{_M$dhw<J_D zcaZ+Gv>Q8tHOZZ?M-czgiGwUwyKL9LMnFiQM{zd4cSkS(Wt4N`<n&bZvJdz9MZlxc zks<0o3hf*wSZIfeNZ@R=$-?yn1wQtJ9w0A&`dJ}*RlIv0cg0$Y4jvppA^;os9t$rx z4jmg16zo-1Dy@IY6{*?PmU&tKEeC0?!iqS^0}7&n%X&9hWfY27h&;I2m-4dBea?fk z{Y4z}Z)JEyoj;^8wF5)DJ*vpLQQ|Db3Ts!%i${N`I#qN+Wb$AUPe<^0i8^9S@FQzv zoF8q4+`H)QeA+V={J?^!G)55#>Wa*8+YyA)*%B8QmRGx-$zlg80;~`RT&rZijg-fQ z?_;d&2$6Dz1%Uxr;K=+cC*$w#z2=jD9qpuDRsFLs)G@{|WV4auTDa-5&bq<8cAqbB z#!b_cOs#hV5}}NwX1OM-)zA;L-X!c}rxfra9v;-sRk5tbCCZy*?S`Zu%{jAQ4E-80 zY37#-13jP{K)D|$gy<JKZV-k(mIIJ+*OwP~aZUi+_I5d>ohN~E$NONe+77dCAb8ns zrK@U92gjNs%?x)@Izkg2J`?zMERVHFGninXvgc16az2J<EBi8RGDz$uCy$+OOHuVH za^kpCnhMTw@o=1RlSg>Grq5-<NDra5nApU~a}tA@@1JZ&q(OZV!V~I6=d~(|60=@M z;`Chyvo2E4T+TYAYr?>X(a{GNdpzRGDO5ZE(WUM$<GY1^5)Y=m*}zc@)&o362Ii`D zUf5smYeYd|?YA*MU_~c=$Y!TNyeeWth-SowJS}JX$`MX~zD470&NwT7bJw5!(LKzS zt&45ueD{z=>2~fi@tS45rLKeTum~X|<~aWC=6Ye;4pet+|JmHT!!wx^ursZvXnANJ zTeo|Z@)KGKJi3>hyGGH@EIBmv;LzIfV@%!RwbiRDX%$qVm#<eZOAuk;#M!h8qQTxi z@d6(~9%r#$hTN28hc}+?e*{XwsfyuYBT4?3iw+!I(C%k!BnmvFAh_4D4FCcd#Yg60 zeNK+Eggap7;wVv`jDg5_9B=~YGVrr;YMQYjJgc$1>%Iys7xZwRc)CcG_uj~ad~rJR zX{J4^kNYJa7a+snLOlM?@pzuVFy%3p<bKw}(RxdbJjD&-b1I-0cVm3B<++c+{s}AH zMHNJ?G3REEIzQDfuyD@UzNuz?IAM)cCB&7}sC8^Dw7Z6sriu1j)cyyAka~)cUWx_O znu|{UK<dszmYIpERpuT@Sr@hZf4l&Yz`J$X3Ta-|31Dd5%$6}9Neums^iC?4|K^ko zWt+#b77|>a<o|dI|Mi*tuRCusd~CoyTqY69v0*vDqzm$Q8}fLZ{JIMpv08?-xU^R9 zrF+8#9F2ktTJi2l#le`gEq%`F;oMfrt8{$(tBc0jaPC<030@u$)5XTtNDi}L>j>+@ z=>@@IBh}HRP%9%vXSLub8z*;jvh~^z<nklxS(;gp?%{-{<|c|innqLdqENh@&Ahv> z?h`ra!vk)07~|5<GO&`^`&WJv7AWWOe5>ZftXS;nMn)>g%`(0VF+NeG^w+v;jC;iJ zWxAv!cO{0(o9R@RWCT@rQ?yk50AwLQiwP0wPr6mJ{h?lNInK2{fGy63vBioy482|t zz1MQ?aAeX57)_hg!!dFg6MiC>%J0FE$Lh$N`49$o=9{6A9H;6ZVQ*$2C}3*U6tt61 zwk-8-uX)>a3q*+o2da5Q#Y?^!5}U_?AG2$?q+qeI^JIWJ%O7{&|xcHM>3w!F##< zw~xY3GUH-Td%>SSzK0~qF-9Em-XVy|N^#EcFhuPX7)#I(c5Ody#Xal>52W{aW;Ac* z(mxU!QOiCn1uQ2x$iaI)aw|y)Cl%vyO!!OrHJLX#oESYd8f-5bFEoD4f!s<Gy`Ndn z5Mu*CIP-xg54|6H_?h`yO%m`)W4WA1C~u9+%zVYEXCN6j3+0y~q~LBumOw$0-8pBc zfJ7^kh4oDetu{Hs4;)<;Ew(J0ZPE#>Bt7Un_c{E&y{xox^3Ck$S*vi@Q3aiCr-%3+ z&D^5v>hugY(a2Aj<OUuKd$_)*N*ofv&9&cC_H4+Pu-**roOb%_fiJ|^AcL-PO@~q~ ztD`pu=WxGX73u0Ju;wx)GnE>izr|W=VgKB!>w8UzYyKOb{W9zLI{f`Pqu}WVGNJbF ze_(4^MixVT1Nb-?%y41+0f2r#rww{J(uNG*zYCCO9*tw)RB9T#W{ohSa{B9+#p`6S zqc=8M>6A@eJ55#Q>81!Tb1o@etWe8ZA1N@2UEXjHu=;J@rDIm_=~rjyT((ma(p9Lh zjG>sSPWg5Cl#is4*}ZteTEcLv(K&1u7sdmQ2ou^?P^q4Is%;NZ7)I)L+thFtY37^{ ziA#&@Xl7h_NmUj1(fxh{^ycXAutcJ{Ke$gw&$nd<<&pKVGC<?w>-s~^1R>{#caVMI zbDwj+4Sf-Y68!)6iTan|gnh42|EVh&3S~q5y%;ZgKoDr^2KZ$Ge6E~ar#XGXs-LV` zqzrl9&wlv}yhk(!cz^3B6(gx`ThsV{UgoPWT${{}PDL!nI$QIOh={VV-}*glgUc%G z4BBF&I-EqH+4s}5ae=~`t!Uap11tVA%dgyATMkC)hFOXOqu%82f#lBP7F*Xl5|ovk zan3UPddMA16!zvU1h*}|AKCYivq=3uOcd#j+Yb2N30jDr;Z5dh8^1BbRD4(#xwyU~ zE8g#)1bumnwn)j*Z}11~gO?Oxk4}5-RNba1X}5KUwrayBw9x_z+3Rk6h{h}Ib~qc0 zvoqe~-uQYg6`SYKVMJDy{^u$rCqz-HEcG7QznZgcl0O1b`GZ}PRtgWmV7lsbQe-KO zD5G(?qDb1vSQ*uQfTdH{cWgz6SM2rO@wo!G+cjZJV3Q$~FfjBY6wN(M6iK1fgp|~B z?2>qL!hUfv=fi5T>m=3kDhU|n7tyt@8qq0>6E5eQBxKZhHg)3a`n-=-7??$p@i|SS z-~jX%qksr;QAf^zE_(yAeWmy?x8j|Bu?)JozatkP2$82ifp`NEl=Q@Y8?_j>KHN>5 zYg>$!1$NK8HXTIrkV)1W?rKug6)}i?uY-*ti<kYEaiYyPl!bvc-TPm4^gHvqknF}U zmrblf_wRpXFPH`eKW=C8eI@kW4jt`?`SQci;JH!Vwed6lfiYJ<4|TVkq5PatUL&D- zDDO!Q_HXbC-|Hbrk>|*~rJ`jcfT+AR-Y>_$s{HJ%kltGx6JUI@J;xt2Wvq_@we|iW zd{Qh6VHe-BRhs7hsrkIgCoC5qN0MDa;w!4o^oC8Nj(7?p79#$@f~g5lL9}beonE@) z=JCa$ecei&+RXJrT=L7yQPdOG(;rd)J<;bs^kI+8WTdt4|1E;CRbY@hh(V18wS5OQ z=;irH`xPn=f=-)rNVD-EM6aEmRv0yzc@GJFXT8jS!59K(kH)Zzs@GGikpc?SEk9F5 zKN@>))i?A_jg<Fpi&8(Av&er|D*9!12w&?cssTx|i1#oFT2i{~*6)(Y8JZU=i#@jR zAaU+*IH?9ewOkK|#clC`hm_>ObT#jAlFWufP$*!T`*^&4vyQ)3hNv!5Dn6N&a4GZg z(0w?h@q)+wm(s+zUd4R(TK<E7usMX=98T%y&d$tC9o)S4Z(k?7$4AKdqoc^x5c3w8 zH}d1n|E-7rCq3}Lf5S?KhX;rn{H2}hM8o&qDystTd1b%OZ3LQd%iG!5>8_}?4PCcM z<*-@<*w9C7oO!tMt|BHQ6KzHFJZ){uay=V0A>uzm2ZFeD;;0gdRoJPzg}FI&1G(=6 zZAv~^p%1Y9wM0+66kw8NC}T4=K53l8)4V6*i}9L@v2k>>3&$~kieBJp+GDpL^)vsg z+>jfQDq^>P&t9Ld?ntTaj6;j>*7j!iex59APxoNJ=!#E5FX1BTmkBh}Q6qmAl*{3U z|1J3uV-8P9V+%Y*MN|hmz?vu1?qnY{NmQ?<J#e~Vn}2_u73!u*H9koc%6{CK?vCLy zj<hDR#t+P;T6hMUuHb1Xh!t&YJ0caW=7gC1)_q5WV33sE43m}|nW4$=%Gy>9=W_$T zae_m_th*%K+eVNbCx+ft^penuLzCTJ-|e1%z7d0ekHU7@rT&zdBa~Ec*^Jem9{lLN zQqJ!$5|!@eBUR5<+@P*=|7g5`U$k^s^UZ35ZaLY4qz)y?D$J*tRveh_)-);%of?pn z^WCEB?yS{1HY?r~Ip91P<l528$QvFr27&AOf@@x>=1Fn;5|CxK5DlDhw(CbCc4m|A zzIOUM@$B0#kZ3P5ocGW6;CxbTMYPM++Zj1u|8R*xw9UP{$X0}6@7B`6W0+43%Do~< zE?s03O>!gQ07Rqd=0MUme{C=y9a<mI36>NF-e|H{#;bn))4C`n2x9`yK3c~Z8pYRu zbLHfDi~9b?>jkzfS2{ES1rK#WTb#{}0?mbI*VC7t8~|vPsQ;;XXC~%FOYT_^q9cpd zj!i|Sx{AWM#*RWs8>6_|MsR8OrAmd^YwYZAIgB$K6KToUchnba8ZiTiDBra|n~L}D z*@%<f7bxCP23$vgH|fF9mOyBU7NPjazoud;RC_I0D36guhA~_yeE>l3`Uyeahrg1$ z5O5*IJ7Tu#<=vdOt!qkcYxdK12I1agiW~`ePJZ;Ko@Gn6w@toO)R}m-K!7x^CuZv+ zx{qI(7<{@b;aLCU)i*;D`S{v-n_8ag#(99_*%*aJG0IU4Pr(<?R+V_M)H7y~!_o9= zY`si|^dRMd5+Qyo$~PG^{w96SpQeym@#=UnZ@aePj_f8Ba&)4seNoRJDK?5TCxtJz zvZVH+nbT-Px$_;cYB=+ZaH6nomqRLTqacZFRX9VbaOcooBwG}EV5VJV@X!UTmCw$Q zq*<i?gP_jq>a7X_bYZ=c4Zm5(M{U2jfmvxECti=NKsvEnLkvkgZMIh0rv_SMU+&)w zyt@#K&PA~d(q{5NmAq3MkUClT8hbE5_p5W+L5<oPd9g{eOl09hV9}6`Wi!a$eGbts zCXaTsh+RIM`wD1QVTS^BDCM7zhBFgs{=r)<orsXj?l;g!<s_)+t(K`Z+M=2ZUbP1B z3`S>53530<s+nT@sgQgk3mE)G`*uOeB{5bg&-Jvoj1l8Q7WHjAc(_fMj&B(r4U6a9 z=rZ^{RG*?kU0-GKSn!}!=d;7O{3~#+Qf5fG_b?YCd=zBeNeMw@xnlS2t)t&^5D!EX z2AVR(3`r7N6Y=>s7tiLG{Mj%_SWcsm8^`Kq*yQ%^)FYiKS*G80_N{+_d~BuykRb+~ ze!320$=gBGTm&J$F+vRbaL1YhQhXvf1hw<QKQKA~Qi3I-u^|1M4xv<6_x7F>6fR;o zr@{FcWG`7y;#k$L@!h@{Oay&T$mz&2ym)%JW=y>=p$<0gMt8XnhNKU-SqO}alZNXN zW(4jOZkp3*5qQ@FnvD}dx)kgBu`j^EPjFu(u}F|*$ca9QFs0(&v%b7zw#$3ODD4ij z-@CuF!uZr}8O{<Sz7i&mfQ#5(4fp&`6{MRMHU*kBl_+YM<Fd<gUrceym3>MFWm%%u zy>T|h!os!(-J}suj+C?h1oR?)@J}UQmpiQBC3`FP1CfY0;7)B$cN&T93Q9sjG=2dW z5Vd$H#os#E@!{)6$J}M70B|F!z0<EO|M+OLR-iR$T{k)|ldxmXg*Lhm@)-@*TRAD9 zn~|wDBT4xsenG>v@W_mtU$v}7PjU82A#-#Nn`hEK&l15St+W?6ar;ktsfC=C)<^$0 z2>MFwIgP$oW|R+ofe&t!uY<2r`TaXn(zXAc!T#TGdO999z&rkv8Y^o14C-oUz$59# zJqg?9oNeOvFK1u&QM<Y&MC8@OZ8`$xe!;M1wW?;aipIuP!^tiIc}7-rz+XcJN&wJi z)Ut!Z<LwS-OjD1vl7p60KY-2A+rdD{eKu%-G~E*DsL|<}YEs?P%6uH5M)0XypGW1i zTcPrMf6@cfe9LeqYoh`2iWN83F<98oFIxP7u*1R)&Y>KRFNn<(<-9PIv0ppb%>Vh; z(4LFLeTLYd75%54gGf4Sa@l!1m{dz<kpAz($>m_S_fySacEIhDv|GR*ZEeku|4I)0 zH{=~0@fpSzQ0D#qsUj83>c2BL;eY$^`i#W|%ur!rhi!Dejl*u1NeI%tC?@#cQpn_? zU$WCk0(w_%B4hQrtzISB9k>ZLJoUh%h%h`Vu4s*cYx<kf_4&1|+c<=b$Z!PPAoG#% zYZ_b-zbc#k5s7{mkkq(WrEQU|uSzkEouYgJZ6-=_n7Ahf?HJ`P6+0i>&`^IYSsUR7 z-F%pnZbM&yKzc)66zi9l<!6aZ#!)iv$Q#WyiC@8kZ`E<dBvTq5n|{1tL@ytS@Oft9 zP8!M`Y<!I$YWG$iMR=>1DL5V)pc_w`%p<~D*p%X?A7xq}cGfet^LELx*I`Yzcn__D zk<=Ay*D5?mv?#K7_gzqmGW{KE#^ZI>&RFxe#I|0Ky9EIO02^ZpjMR<lgN#1A4ui^- zHM3n`Ltc=EkrgnwDChYoIiCmJDR#i&$XxAN7-uf82Bs4q^!g<lFy62Dm__(S>m=hp z)+Fj`chR5jA?*w78FzIPg(SsVi>F`RtCF5nVyB-C@Gu<?-R&jcQ)_x1Os?(rIgK*E z%>`p?$+GR0%N~4YuDgqMXgjVAH<F31*@^J-F*N-R<EMf$rVG??!rnF8xw9FCsJiCn z=RZV6x)NQ;!r576UGPp(kb6Fa?kT{VjfpOqioS{DU9^`urFFN6dg@Sk?ICX3l<or@ z({zz3nJJM5f#aUxDyqk1L#Mt7*I#G*-WP%d3;hl=nT~!;f?%zn@7pPh`1x0Kvy9Y{ zlV?q=TtoaBW9ST{ZhxXw2G96K+$?Ax>Qp#4W|z@s(`=~7AmsULt2d;Tyj4mW`Xp57 zG8%Ct=*B%5v}c<eCQd6L1D7YJ6jz^F3f`v|eJ-JdB2Nh4NKkVBr6&FNR3zpBD-bIy z6Lr49pBKP?feXxJGd4%q<3mRnZCj``+>4>AJPJx2x@>D(shYd+Z29QNw(-RbKosVQ zW84e)o7q}n#7BRjM=qAK&RG$&?6OEoYK!3Yl}`9%z{q&hb4#EupxLARC(B&=dd!jv zpfX-eaP<&PCoDsg!3|j_H_}0^#)ropI;h!QY+fj*e`rc!1@`WPy3Pji@7|Bela38E zfkcg+E&vCFfQ!SWAeqYn2MyYYh`}4*=f`X?bl~P#S>!>ZJm1as{ocPH@xKUdc`$VU zPqyu*k^Pz{rV3}=1-a}Yd@Txml=)i%CWuD1%Vcht(|#^v%#~^F!ww20vH=if_lD~k zYPQLH2y5~(Sdg&ecz;713T74;KjDshqa$29bCgFk$(jrCHM3;^oqFraz;6rPv8s1o zjQ6D}Hm7RMN>-#`ha+EDM&Fu@y`i-==_PXR6sKXUaY#!u8;Z$XnE4g|c|It_^V|uD zP$^BJCBT4IdHq*e@Uv&PviwM@a$DWc3$e472~!D^0Vv}onQL8%LWJ6OeD5OBh5px< zcUfJFf8T`U0;fR2EYDJC%;KVOAKEuQBbqWny@Un@KIN}!O0FrY_pT+~^SbD=w*`cy zw`ox$$zze0i6ep7euH&!&KPu#0%gfLH|%mFV@HsJBsKyZfXiiUKhS0%7kiRQ;GK8; zgQOFLfos(mlMBv}b~q?uHvBVM4+bUO6}s|QLp)RJMir-OxOs!(R}VsMU=w%-?2@s% zP{^|drTRm}1A{0Xplz;+z+S20d--x7{Kyc@XBGw7a#o_|N_SJuy5<J0#GSf=C^6Pt z9eF5{t!`}sBC(z3hvm;jV0}RV7wW)HJ?iqsLi6fRyQvIeBD0m;Zl@TGR1@Uai{vB^ z6C(oc2+!m~gp~m<uMi1+bfT~U{>CNXF5id0Bx6fId8@|&ES$~FO1sHRUF*%JY(#`L zC>;yHsycRnGZU>9`ZLa5nesEkVfmZue&8blAezoN$mI7zR~frgee3&-PY-Esel8&j z5aWO*0;|vPtEy%OeV$ro2?mPiFgeMV12(fyBVTn{k*;CM_Mw#|Fp6m3R|12Mu_Z#l z;~ZmdGG0x;TdnAcymTj#1OdUQnAXx<YC4<xu9_h1PjQJR<i-qgk2c}|6i@jSnQh); z!TfJ^FcqqS0xY|*7N*zZAgvQ4k)adm<OkAU*($*kN*Iv73t%i2dp)~uYHajv-Zwu& z2cU-n5DZT2%OcWkeW%PVwGNRJh?icg<2q4verL5h50;W@{jpqYB$Ll**)1Qk*F<N- zZT}Rz&2j#RpUngA7Y{*&1wB7g>7g&iv6*hgv+ZV5&%}#WzR<V!`Lm!*&XRO}rxdR> zglEz8sg*&vj{E|nqP7aB)fVllxmpD7?3ehN?lr%Np*ufUe>EpA(TiZL)%J%2m^ysI zX0HDqG0e#fFbS#6JkKI!BLFqp>hJ3%@9SpM>r<7{(_WLcySG8oyyk1|(K$9&w3S6~ zVo#ehNc-rIisDhJs`~d%ZQ&65wzL-uAfIlDd4V3&oDR<WDW!PFy2cr$mDBkca8V)& zQA$m{XGk9eI8W=G>@@}H%~}$xDh&K!$i@?tw1sesZa0D-M;(qheuYAR@Rbk$)?VO> z|2NSYDN|q@7LYKYeN%nuQ%dDT`<3D+$O+xv)4NZH-ARI6oXx5!uF$4-LQ(YBp<JDv zNaqbk=)yNn${OA)XZr`l`}a5U#`^BtH{I*oJ7az;YytLKBHW$#9~%zeHNGVw1a3d2 zz2o3ou|bO0K_4#}W&cawb}Jk75{A3*5glcvnc~L46$g!DfHV*RM{rulCu^SU*#ek? z^BSvx_4y)o88|K7P9oCYZIGq-N}~4NMHC3Ya3;dbWDeCNMXgwJPF$Ist`KoT7k@OS z_SN&1iNSR!r(PzJpFqagg3n){OkRjFJHH!Ze!7amSmU33thw-iB_2OQ@`uwk%}jf< z&_USN*0uQDi7GKe5s)rM<9n;fck*Sy+VSza1#}bwX4gV=R~<fJ<pJbfnMQ1n!lm`1 zpx>K)`U7J|XAp7F^6}?SB2Wxh=pk~UBm4mSo!$=teu&UCF>E*CTsv)=lQ0y%^|gd~ zhVCAbBc|3q+FIT*>un>sTf<CLB2BTtV2mb>X`^4i6ZELb*7kQsAjd^k&GQwkmV7gY z+FrMWca3w^WdrwA2p985C#9`T5FrJ?{WddIi5}p<u=rYoSsA~wi9X^FhNvcKM(Lke zm_USK9rW`TNzB}V!kS^plH^<xs;G7^F&-LS#BLCFbJolH_rUulO24zBm%}3cwI}4H zrTbmVe-Vsem~itQjCJ;ZJ690Ha52tk3<JT8PcIUy@ti2Ze^t=Dm{Z}T@vBEGDjdt^ zjyznP(C-Qk#7CU@_87~n3<lOXq-2BKkeODS<z|-bJ#Df}?|pig{c^M0-Oe{=<@-q4 zep5mbFE#cfe=KC6*5+jXKxKZQD7ML*bBXdVTK>U7>1Z&3-&=|VBF&ydl(BGp_*u0| z*{*$YYv~JWx)J!4NX(;1aE@oOBRjffVrbPLD;!ek(Yxdyi%`C18#{no-6=K)2T&fE z*>dL6{}>FXPF=HcICXhw%qB!0Jy0##xp5x2fvYS8KA!h`Un^VlAF08W|FC#o{ahnd z5I_7BW&+6VAS-z9H6RPdHX#O~T)1xECM`qq!ap<dsCy?xX_$Sn|5d84-qE<cL_44C z4DvrJt)uaWH$W8moEwhx{o=@&H0egGqi#ik^kzM#Lb}b;+b|{NR7ki=F%SD3fZ&YB zEX8^;7LNk^-jV=QGIhWV$E+uHKWQYQQq$^Wje&FMidH=6m{xM$%c_`r6<_k1_ys=k z<=LIN@AG^R0eX-opS4wf+@VS*k$5!COn@R|OVp9skup??CB5r8@=c&Bq>W4OB1_NV zQ{u7lQxOj{!5(=gMUzby3>~NZq2J$q;qJxtc6^&K$-2Q&-z3C;!f^vOl>75&RRPX| ztpBi~yx@HGIqI*=Ge#~t+}G-ek;(5QJuqVlRod}2MXk$y>)$EJ#m476(BdMTrA+?} z+@x3O@+ctmezy;zKKF_L*K2<^{-nPSX)~+zD+$5d0OJ*uiVMR0?a}H~-tJ2K{YwJ; zkJ~hs=Lv+KXd8b+HgcLaofl=Q8F6fK_!h}0l)4457Mr}_FEBO-Ka>->P2$Tm+!}wd z$<eaP&}?No9MN{zB6qS6H7#OY_ZW3Z$FX?x_IsuokB7Neu)}poLj@M8^Z7ARbHbFt zO4t~H)NTc7!08ob^A3(L?8z!>12-s2>^A?y$_dsx;K*-q3-!}Z16O+vs--^TVVQ%$ z*q#*@-rpP|fMq%1wG-%X7oA%BcsQIfUdSY^@`t4#zt*jlf9Hs-$SY~SfBgIHuf899 z=P#qSB#O<a4PEpfH%$<}b@ie}V*np{wCC*M?%dY>4PLI7nyV;D>0Ih3RFi_&OiI-+ z@>JcN+`?)I88nxJu1bBZYA-M~$+d7A-w=1Fl#JX=Oo&ba?ACVk9&(NL`dj%mzeohy z`@+sZ`|pUdE9@W9vu9dXLUof|OU$eb6bK`*rtv$5SsQg|E}#Pia6wb34#eXp_4?lD zb(aWTIJzNqYg`sMi?bvE9lxB{qkb8`njaxtPG^mi40Y)IsEPQLwLU)>Jyfj;E>xS{ z(*52n663pitipFVwOjbuhEgNx51{>~f6cz^8z0;A9%-ku!$z?rulqa6Vd?~(5qH2G z$a)qEZ~_Cm5!Q>Eb3o_-Nzlh6qC<ND8Bfs3_&(?6YJ)F%#n~!9tjS15hCU_DvFR~j z<L;T)akbgwcz&-tD(pXsVV3_D!`(C^*pNqjD)jrmun5ND21X-&L}c64RHT-1>Zl?) zjfOKSkQAX&oNH46ur;QWAXrimJxS?9z7S$vU97K}>&njvRA}qaS4g`x2|9VCEqGRA z_+q3W#=Bzv9w;Ct1w2df>Ga|pu+qa>`Z<nU>bNBtvy{^(=r11j6kaKO&q!X>;Ezj* zWaX_Ec8ljrCK66sj9mNCc!R6D5jY!F`SlL7eWG8y%sBw;)tNmF&d(ouvIk%2b1;Ys zFh;5tb`J#*#->(HBTa&sRbQgMnkLs2U%3)|?bLe;jk<Aq`?K%+*ga<J4O&A4hMNk9 z(b>4yaT!TE9`7bbjrpFY?<yY)?~tuwTSfWvViWgCic#XGO2D5H{<jZ2FR9;@Ej*1I zV|Kco97)tP+2?;Ej4lLoKJO93xT-3p*OjpYkl-Ebl{SZ!b&3QXRt*p7K^HZ$4{v!P zWh}_FQ@nL}k04;>>StGb7>NcuClA~X4OxK`F)5lIei=qsMq)17-~FERN&{h0iyE`< z#Th@wSCGhn>4@-kn1m6J%yG1PLd80Z-@Q@>{PS9BFj}`i1u~LHurDt5*{`gSr#cW_ zhOJ`#A1}ZKkJ-cO4}A-VmSvW09-Z{w{yo2?X~$iLV)a!^v{zaVu=9fzP8jD|6r=xW z<J#Lw86WMHdVwz|dFW9nNjz$;Mo6nsdgUh76;;MH<$I|+o{HS@C*-`|B^WAOw=ghr zW>;qvqUHAwG4+R+?jvc%gY&w2yv&MMw#vrYxN_VHFL^A~wz&eRZ(GkT3Wu<&8h>X0 zlcID=SaYUIlqh5B*uzpHF{@-Zmn7dgw`Jokb@yVH(kvhxH*tJUNR$3Sg{_AKGrTp8 zcQ&5#`2x%Ts%4*Mw<?QF_rDP{|F5HC-Sr<ybc7Z^BCjhz6F_va(0SYNk3owgFUh?f zHmjZs(im(Kbb|nL`^&Mm*3EQfEvpR(THqCfGhc58FL?t1(F$G3tf!W=KKu6z)WJ(s z<Ik-oGRzIRW-<2)zXh~7$rhSWHg4)EL~R*^%9HXxQKnLkNF3HLUP?AC?Bp%hzUI#x zg;D;r+9n{<G;@3VqxInZ{G^UWt@Y)PE3dG-cSlGq{ysbQY-tLGLoREM4FJIV=kuvc zlv?HY$4>cE-W!kWUOUhj8OQb2^?^0ezn}Ae9NxGBR`|MdeTCoPM#Tm`or9i6_p<{p z6P>2aR43n<(L77K)`Z)7Xu?l7<^D{lEuJIk19+(<&OnN3D0C3IbVyJ*01H3smF#+4 zh|$LZL!NEm0H^h{d6pYyJZAO;l3x4bX&qLVo>71uz<XUwJz>*K`;rG=?F=*wG@$qA zugm@Fy1sbbV<?F3yk%n}(y-dcW$xrO({80>#*W!`Yz(1gGiSrEz`Ci4_!%qL#@46A z);isjv)xZXYlv((C^o|gCQA=d5twzQ7jH0IbsE*TA%q@6A6hnaK=S|z&Py%x=NQEZ zVJ}iRGpjs#+AFMYlapj+sC1p6qP_>Hq~RWZcU8KF9L-&9jQR+i&b8BCnp@U>LwHqw zNDeaRkMgAI8MnZaxci08&LHrO=edSM)gh?xfe2y#i~ayK&#!NYhKew+&jjehTUtUa z{yW@J0eqo-loyMtH}F_$YPoWME1tq>Oz<5}!hC9*?wDl5tvvB~MvY?+QPIA`0jrzN zk<f=h+zi($SJMUj><_77*{o<MJgY3=C)Swk`{LlW-|X>@y+N1%E~Fi~pQ1OUkJxO5 z*@^Sn&bJ7Ude8XN2kq()PNeE?)5ZjZyKMS`9J#xs22oBT1Y9Py3yU+{#g*GQe1l<h z^Y_f}^hp3jwD$)fw=IxC6#Q9#MDNx-*PDP~RLc7;>KstHN#xpI2m|P&{r8$iXBU0- zwa8^XwRsR9kPTg4@(W$ZAHO74km?=uH}?MT0la<g$?l?s+3xY{vw7PfG;RM@+uC2@ zYg1d`=jgAXf(K!hqB{+@!XqZdR}KJdqP2`IpDOp)8nt}fZSXnEETUzzv(XQHI>gIM z64tlfr0&zF^Ykyrpr^%&r~Sb5_dl<+Dc}D)soX9M!_iN-2aHBi!H;EP_~^|`_CauG zH?8Pa9Dq?}zqj^E_S-Ld0{}Zow@kzoj#|ckbha7DB2sqbO(N4{a|<_U^0{x$6}GOm zYG>xN6&WJ8@XmlaxQ_cnQOfVKj`H)Vr1x#dmCYW(zYXscw^|MR?hK3UOUO6deOa`( zl;CR;usBZ&%~4l@m%pd;x7TC5bB$|D(7$BeAcYX>NA2Rsf@^|5&Xn`NWGWQ#4Uoh@ zJNyR4LgE5Q8t99x;tx-*-TAV|x}f0mc;&TrpTF}J`i=*+tp8r#|94)!1t$59)KH=N zC;wwz0fD!|0xus#eYfVcX9^nH5!wr+>!r|$ob&WnP@O_7%gy{i4J*1p<2{BSa4CdD zv+*7{#?{RqaO9^$g}Z(*#pq5-t5q4E(Jxeul4c6%YzyqlAT^JO5J8bvfOHsK{YfNd zF|)S!)^*$n(GGilHj04ivFB+si_DP}hHWzFuZXGe@;bB@J3j{%fkrG2zs3$9U*h_5 zL>6g^pxRzJ3Jt0y){yJm&KzF)tDG2OSD%V1t6UlmwUs@C7qfC3eELp|-<r{rO&`K- z>1hhmn(&@~MI3a?mU9qx4?XV$gMEHr@h|={P*=aEOg%x3cG*gq5;U?OX!$#WTBQyv zHhs0g-$~^!Dwa+LYTsm0k_jx-pwzZ?X2W1|dgwZzyMhdYTa4^h0wf6R25l16SR)?a z*xay(61EMU{SK5FU0$Da%V6dUgCL1Zs~tL07&w}2e{fQBBq(n{BQ8V7<TEBfrCpR7 z`Y}9ik<lM+x$cknT;1W&cAJB6rOywfv){ncG}&nvrG#2Ic`|w070(&7(g7hY>QZg3 zcQ~SjcR0HCSf2HZds@1=yYD`R;b-IibeaG%@LoI3e^K-qBwA`~cYv^V5hQFGf$$K& zhdak|k0W(?P7TA1gO1A75DEZK^ZcKW@1GV3Xzzo@PLI%LX(R&Su05|W>f#EU-_hRb z+&gdseB02L_pqW{P>>sVi}r?~D_t!ZOF`=JK{cB+TBIPm)qr}JeV7vTldSX*Z{b&S zV|ziYz>K;Wr0r0aK9db$l`PX!iQdDYMrrm!Va&-6>%g@5OmX&JjM=?&gBBRUw|``v ztE4nXmORw#{u$-Dzh{+|WD81^tsnT>JMr?R;Aw7p=wAiii`#!JzbjQW*HoyhtVrlU zbe1N9ZO*rE*v1{3W*nQ+#^`q1$PB^s9DaGVGZQ#vA-!B%Fz+{jtwW6sIcUn$EBWjo z_@!R}IY`~yw*So4W~0<S>&#raj1i}f><=_o*&N2qEi+7ZYW(0Yndb2$_3X~BGdtU~ zd?sr8I^Ei)zt>ZW)>MpVyJvBl>&m2fYpbfe<lRd}ZBN$^Y~d%dt~FpjZa8t|*y@~> zk^``vUdRRP#~?I<Mh}&)?RhAp!*_mPpSZK7vu1g3M?OD4TV*|Lo;hYYE~_c<{3iks zoNAY<7{HjHMiREh?jOG>6fN+oEbtmR+izFt)TlP?$Q<$oj=pqFqXTmnv9QR2yP>J7 zF^yP#sychZ7NGNMbEa!!`!{*8ElSrcHz4{JP0Ve9Qu8UL*+|}V#b#O~la8I-!!}R- zh2u_eJEoF^)SM6){c;7&O69<``pm!HuV;ltr_{@{>F~vb$G?xIX@Ww6bY!#raV*rb z`%_H%^o~mU2AZBUYDopMG%#l)N4L*Pw`M~-wZV`OtU_*W*bzkpZF8vx6N=pFpZzh= z4SYWHUex6m74`yq<e*7ZpXt?LI11Y|@H&yWi;pIr=6_RcMx*~ZEIi<MC%uKi!&Gcf z<fdZOxz*-$r^H60?uL}yi2N#qdwrhXZH5kzepC6ZUx4EJs-%eq`}}OYZ}2L<B?8bv z39TvfAwYoT_V-j?drs=1)lA(wHon8ohc}@m?j!rtl^6;M3*PyPlT=KjGS;t?B|<?t z7S(9<(~LZYvekrsBBtvn;g(P`C-9217li^TXMT13(=PQoqD!#N@g0S|>U{Ey*!Q|s z2Yg+7`o<1QA1%`W;Yq<)jp3JJK8ZI_laEPdDKAn)#;%;6NizL*Jhk#q>~7dFw>3nV zjjKkuE1cS>JQ&XH+P+tUqf*E1NedgDjkS0?qszg3_t*Rov`u0mEn$t&j!$gp4;`%p zkugRNp=GAj!1c66h0;Y7C9~tNG;t$r)AoqdU!K{sq)|o!S(t~4Tmjt8sjFbgj^G%k zG6VxP9;@Cx_gOpU#yP;jd8NQ1!Ug%5j1^}Aw$fQCRC2AY!nVst#@4mqY)rFO<wNmi zu3pTcTZnSro{DK6oj@5<HlB;{7|te+am(7nB?$WPUHGm}`MJ8_X>1?#@~_50@5g^i z+S3IcUu>kaD)=TR$mP{YmH$myV243Shrv#p5*{EZb(#C?2?=7qFmL8L;Yi}hV<9!+ zb`rtRmVENp0j@WfSqOk*WMdM*coswGok0ah_5ii-^}T_5s)P4;EcamTR>wUb^kqvE zDHH8S@n%w-^STueCspmOy~g<Jetz;+VqaNWuLIptjU6o{vq@Y@wS>h-kyGNF_mbzz zR&M1kc*e+zdw-EO*Xz2mU*aVxf0YP`@Cyqg-3l6v5`Gtcxqr_~;d3iNX&Nm=l!f;% zof-e;top}%(MbpMjruPzz%uOXeGlQw{)EVDKWpc_N({f+PiiI-B4Z)vUfeDvnTF%i zHO+>`)*56$zE&?&#=`e#yWigcn;HmRzHs11g*W?~=vIq5qbhT%3y#fs4h<SbmCzV1 zL3RL}>#Hd#|NIXEqFcM`h5SQTTV6l&(F4|Hn8~W!I5gCRzR*r$Fg1qg=RR92rq+JG z@9s4nl8S$xF9k3qD+el8xRLL)V{7E|`mT~unB7Q5r6VdT7t;Akbw@gzl#lKTSr&OJ zLxIR}>Xm*IRl6&i&MHn>(eX(c8MC6FFO~Z~P-rea4<4T}^Cw`W)J()Ujnmq=g<QRS zR*aP2I#N$vTaXS_)3)22xb20<6M}f8u>pkCgmWNXa~9(W=rrD6>N7G<2qRg1LKnWq zar&BuDh==#4Z>`>6VDyrD^$Wxqg)`PE8PK!>%7Z|81rGi@bfc?Sd5F`m;%fadKIfz zziMn(_f^=O*(cDnVtW4R+grKs)~?wqu4Rgv%spw7!riD79W|ENh?Wnr?Gs8EO(0LP zaYTJUwrC$g_Dl>$q~~?ZJ3c{gTO5Nb&Z0k?AQu*r&WxTduI~-dF|ppoobx>X?i(hr zwJKL+8gS;vsxH~ZU@<=+)c#(Lm>Bg&{L-|fEEX(`L4Sobi1w9m#n9nvGUjBnJ4$bl zMgvudH=$2J0|tv-GN*?uLf8E@ovmO$5a)rX4I_i?vNn8qiFjR7Vj=r?dCA^Fd?;!B zD`1jPHps;xQhRz6+4gjqjP&Nx*pB_(<ekc#%e0{8pp315y7e}!2SJE_l`xNv6Fz7V z!J}Ty%N->_%(^|YSMt?fX>e8L{9y|#@IZ!kmzDBUEy2H;dYd=?A(A2Z$uE+@kNI7u zHTPG^u*M0yz^M8zRdhaj?ka=sG0t!y_0SjBjOZW^U^L_EoZhc%9&4l9Td4mI0g~W~ ze(zhyz^R^(modlMt`eU_TTqFdrOuK`&6}p>h%~<6kA>8|uq(-BO+Qq)%Mvsa)5R#g z%B;CAT+#=|PE0DE<;hxTd)DCycu4@#TVYKoG0Pl<4$SC9*D*-d29wW+8Wlg53HSJ1 zgC0#=yu3rWAl6cjYBx|)ufmxJYc8XY+TTTQ7jH;;vjT2)0Y^#~wM_pR{MCf{Nt(aO znZ8FAn*FD0ePDfJ4Sb3Sd?9?@D9tPw1HO%=!mXymAv%y!cW^4ZTP^2az_MpI@9OFU z6#3v7S9}ugj>=e&4MG6`3u@dnJ&5;>^Ao;eI#ZIHh6~>KcrhJv5w4u_JEIvBNm^h_ zi7QLWPYUjRF)5h>L38*|YE(ylCsFxE&?yiKzM$P_?4|lxMrAlhzXWsdu&*+Jjt5&~ z_w%H@Cj!aHXr#)hGPf{4{o23XlOcAsOV&KkL*$C#M@eGkN;qQ`H%kfIj~nhisB*+P zH=QxNMpLjWZv#9>&4$D+`inOg^mUp`qpn}&=k+BzP_mc#+iUVfWAJMkxnAYc#eq** z+s>)I885~**PGDyUbqL7ohV7Q%Y{7uyq{quGT!V&KH{(f0MTLHe^EA>_eRy7_s&4$ z4DyyQhoa?~=v}K`o|Z94I84esIn_#SXt$;=abPO;>@e2=bG|?ZQ;Y!lgf8)mbA?D; z(b*j2jc5S`8XIlA@AkJlWT%~OqC6YGOg>BTbnX_CZ!~O(6BSOlCqv(T)~a0>gg`oi zhQ_>fX@>oMtW6C&D8Oi=ld@<XCIYs<Vu1*?VPKp7;JmM*17Yl+BHd`sBKiXltEH*c zUrtu|`YJEcMMtk)U5)H}TWZX)ay%}@m5g`>Ai};F7<xH?%k3%_SS=@J`gXB#IvR6t z0RwOuM!UjAi0YKSr0yQ38xjBE1`CJi3=WHTzcjs3FJ9QAHko24fSu2(G0EEw-SriQ zsKy!x?keZbI_Tj5{@)TH9tQhLMczz`4(&RMghwpmkQv-WrP-sbR<{DRr>TA{Qe<22 zLR+HM=;_z-!lM;VDN%2O=|gNEW*rMM%=>a%*=eOY$H$h}y%|bq+<w;6h0Nc>xPNaP zf<^2<w9B2o%b_w}b2cg!%7r{@z~5ugE0ol!Js2E`$kK0dclV*HN|)&54_S3G>p21p z2qh<Hyq;`xPx}Th-4dMjPFc>Yz~qcQTZd4Y;U&(-T@L5RI&WUhbADc(24%f%1op8M zjo7V{f%qm>Z`5%^3srmH+5Hw&yk>;f;)!oNrPc$%1JS8IEa>4&Ao$RQem5nuiXz}3 zg+x!?!_(&aTT%<zf*Wd&{qeP3R}c4S{fZ;u4Y%Xvxw4<<yw1&^<Ngz7*jWiitcesE zo3fw^m7@X>UT*eZ{{;HIxJ^K=PM6UUS+n|&iptt6%k=7!gnXGhJQe54WqcEuQ+@)> z7U{6q^r#Wo<NykmfQ$BA7Gb#w_~Q>Q<i+NI=CFuy`2qt35F8*se?WiDqN7qzKSnRq z_k;NIo6$)$d%n9WxFC6e5Z#w<KQ;imy!3g9qJl{^56{e~8&7+A|88$hhshsthS^2Q zpx<JW7r5qV0W(J;b&Y4Cwi^~X1#+yk2{y8S#qg(K`*IheSfoX3O`=~guFFWxchf00 z9^Vd-rFokH;nuFn`cH)6hCd>VKi?Ysq$F~Zg<OKX|Ez%y_@etMK4JxizIzrZD&KBH zu#c^r)T~CE(A=VDFK)nM8RX;pp<^PVzC}$vbFOkzExiqzgxmuVJP$#@APn@;1WG99 zmz)pcCK}<!K|UJ6l!!>D9$OEsL(hGB{lhJ5ty&RBeZ+RhSjZL6pE&zcD9wy{<TA{8 zj;o3{d<{(>#nGM^ifBI33yA_n!7G;dBDXyu_mv^N7iQIC!x<WUe@w^7rzZ0$!)@d> z`Dez%I$fNtU&It7dX?(jnhhl&g~W1-S4M4SRvMT<^zQ~efttTPFt2+!&#!<VbE!vD zwz<*S7OrIBZW(w>{JL)%@r~xD6yIF-BRfTJ<zvQ>2*7ka!tkC<l7^M3At({~uO&(! z1GQWAhGc9&G$npsp~$b}QRXq6(3jKEw_v8sf8<$$h?T<}W&iWqmW%`WK_54NPtCQC zf>?@@wU*BInN&=A+&@JskxB-&J!qI>uN1|<Yd&Fa#;bEnp!jw#xfO&XBr46h7RRc2 zaO8e^>T-y!@AAb?!4)ac;+{L;eeGs_-p2Z0W{S(~`XbfFe=ppEy(D37ijB8RztmMX zI~l77f<S@fU+9gL2v4#cUyq{8lU>mlH*<zohZQ|N8|xbR0qEgwerUXZ-v9=D{g`%w zr{<mO7pe?RjFJyG=Ds<aH0mX6dkE|<L|8UWd<%Z-Nuu-VfOVs-a(4B`y62;Y^Tctb zPQ40mrKl5x?W;XKA6u10G1b7qa^oLij*)>;$((&*5@i!iSEfK<Qc$n9H^#fj)LC1} z*X_MiZ&+I{9H3W}QT0taY!n_Gf`|~m0}qL^=<~}Uh2Qo3|HIf@Mzz_k>%zf{OL48> z7TmQ+i&t<<fEJ1dDK0^Z6)jpEN{hRDg15N4Q`{W_fiK<ToNu4C_PfVeKcAm-JoBEn zT~c}#g3bBipEp+jih=THcO*r{YFn7im@>J?H;U`{WYc@StcMKHO$R7y3t=)K2c_6f zC(rV#GJb}C9JOZyWmD1ww@$<n0P^fZoG)DD_~5nxYD}!El7pk-R(l+Pa$0mAv>ku} zz>blB4@sTcRcU=^G-Wt=fL+%JtgiDE=WG4gLBLmMk#tNzS7LuY%@)wun6pDK<?;MO zK2vF#!pz4bMO(Mx&iK6WsJJFCgT<MrI!8a@g*Hd>@A*aO6CnG=^!z-K!wJNwGnk(Z z!h>jLw7Y8*xAQr7&sD9wt`)_ZGGq#6DIM@hoWYbzv;4YV(v@ay1JS=Ejq$7Q3-KGr zPau!J^q3yHTD*zw8p3WbkAv9dKe#RdSLpO;ESyq1a?!6M7GUXU*RKwo5z7{}dcTkn zOgqP+LucY-A7|u(SOrXe?M0n98BRo5w#h3!P|)?Xl=ky14!oN6tSGgx=y*h%E20}+ z^sTrmC)jG%e$`u962?cJ3E3oQ7k#vOdoif`qXK6|w8mCcY!rbh-9-+z0O|FHFG6%F zUO+`ZZ)s}R4HF?tV8K4HOS>Gpn)bP+ikHzR-`uTcfTI=tjV|*T&%pHs<_*)wtux&? zJt6l>6f9?h+)h!Uhy(4_CNkky!huYHXSG06nxNAk%JcdFKrZS1lxy+?Mf$~C)#C`V z&r_xa#i{qL;qe=hWJhs7RWHXh?dQH}IcD1Z9H-k|*<Ev!mEJ3Iau>H#4{2~%(9kL` z3R2tkfO@vLItmz0j-B8c4AKGolWq94izQVvNUoZx*@fSXKTVu&CogBeIs*S7+Oi2L zfmPrLrx!IUZ=RUl#F}4E^~&4@$zCqFJp36i<;{N)K9ENq@jt2ae;c%`H>i+2%AFZY zL=gnI{H5TiTsduu*c5Fyo1=C_3z$T;+^F@-33g{|i}LR!Uem5*QkcKQ8+2^3$=?BJ zp5JXCR%zd~j<c_s)cnrQNr$l27miAndrM_rXsx;>S-^Sg48yo1f*-=m)Utk47-6-< z2blN}K^zqC87!*AV4Z<kW1Br>&-LrS2vtV88auS?#Tm!?n{t@78V?zZ)<KpV)wuZ_ zD28|1gu`6;;PsGYI;}jEMzy!?o_Chd?$?)$D2`t6t!oU;EY&~N^Z!mRUTQ(jcwwG| z-9hZfe4NK?T)>BADB|VAolBOq@v{I!Lp}WWh@S&(xNnGm5w+|>*pe@krpt3b#{sso z<IMcUagWL6cu#*2>h9X96Eg&O8n<Hl=^uO|#7(yXuu4!3{?@sVOc}pJDI8!+*?yv3 z%p0C~DngFF3Q*ctBiv3-tC=9DbBrd2%ru8!T3QIwFY#rhIydJEzkEs1pSn`1Kq&H_ zP2N!8Rp=biXx+1uJzM91xDw#r(~8IH16Gco>YQjmMF*-<n8kr(JYNm@suD(El_fBi zHwHKuZK4Qy?^P#n%Fj&i9l70p@ds7-d*zvH6g7NEt8f`#qBBWkJXrFSglydR!0QQM zXVTy+T}ld~i&v5NR0|J**CJtKq6#?>>v5Ra#$0ooQ)0W3AO#~C(VH266sGH1+g=bE zaq)3#FbouQZ{GRi;X@y>JRjY+VSZ$@jHI%;klp(qehMeb5AB!jx`}uOP1@oORm)TD z@)>;e-mpe{&|zO4_ciXY^HY*bdLaV0-CpZ~JI?bzVg@cSU2=q|d~iWv89kck^a-qT zbxuai@<3>_i>j-B;Cvv%O5^+}X8^6Uw4rZ_h=?Tk(wkA8AYC@a?ShH!QbD#w!0*lb z-cV;=ClL?T^E6OZ_j#yn_L3y40NpxXK42W5-SkPztLyf^y9(oocq})x)9-c3EV!F8 zKs2OA^*M}&IgN=$BjXoU@JDT<I6X0=CmZF@wyD%CauBKqsMi;_zY^@Ik~^7pMA%l{ zEU_ublf7)>+LW*9mXDJ>mb>_eJUOg&11u}vRwK2$Ku3gAd;U>rIu2i_)9ZWBOI1QA z(qbZ_!tptEjgvf#A2%6Av&I>mu3_gems&&ArY7xq2;zF80yceL2)f@O_Fc>WTj;vz zY=Hh3xRX3;=(&RPft8sEl}b4rZ!hV9u)97KPmc?=B8kmUBhg<T__I~*13HWA@uxYe z2^y$I!$A8<XU@0n%7FwfQjI?x9j>@#n4Z%8SP6j0ybwJD0JQSPZS{b;Iz*|g5#8ps zeGuSoTEW!XVH)RY>FQ)b@Oro#ex2thDVrrVpxiFyiz>;BnK?Pduiv@r@ED!@g<%JR ztqUp?S#Cz6%a9`Y$)=D;)5JSBk56Bo<I<hYwv1-q{^D!!zWOMYl1`{x0rOk$skNQ{ zt2Vo6(sKKT@}JN8?*aiH&8Rl@`rxhZ-4}G?AoTH@J17!0C7;T=Z<h7EfY1Px+m<Od z%rOGq<WGE*c<N{m%W{D5mqeJ&5;$T5vNR`*Wt)EHAp-W@^i1Y-ldrV%XG;dfU4T-2 z1Io5Yf~gAone_wZ{5Ctc-T6{%zW1%!#`%}RLInJ->|Lo&=Gd|gn6}s<XSy^51jJzf z)u{O@tMQTO&&3O__pviQH|odxQ}$~Ix33GV$awj*3OXmLcuaa9?>za%o4O?7>L&Gn zu>c}f*>o#!&FxhS7Ugv0<N|Zhljz^$BJhK#k#sKl>@l)muYw}QYqoekJ|^MID$Mr1 zC=B=jZ)Avdf0b}WEs0&KoB0x^f%O<Rn#S$qe9+S}3v!#e1`+l?`Pez6khB*+pOz2p zC-!#nF}EQ=;$u_qK#3<36>8n<7Ff5VMnNHdo>A1|&G{im0%Rj3VNxPNI1&=3V#|<5 zqkJlFQOe)qeNJKyFQBEKTwQ^A?M3=W^6P}T<E!?}n?ad35tJnY8L6**t5?|Vs?iZ? zY#kS&>$fMjMPq$4pVLA$x%{T(+2pHV<hVIp+1AZQx*yoj;EaBx>#uz|*mI5j^|9}p z1T24Oq`P+--8{=(YxgvDgx1X(F+22*vu<m1I|2>tfn5|q{KVuQPEc#0?}c#=lrbs_ zP0rh<haE><M8BO*c!5r;O_`Kv!-gu^#wXbLbTM|I?F2#B_B;Z~x7K>3<MX=j())Jf zPd>PMs4yJ->_w6ndawEeR_0bpKy;>s3?S8LaEr98HT|G6o6U)GQ)(e=Al7mOmw%xI zHd0bIqIq{)yY_1}rY4n*#M^ufEOn1BIo!BN>8a7O{DQnq*NchehhM}G1H*o&ThN@@ z5Tbuxs)nHxfB#D+4Xb{}AC7({k2X>Vx<3VFW@h@0t34X1Pq4?PK3Qp7zh^vLN(pvQ zL_b|vJiq|-U_Z`T)Wo4kpm0kRp}mMi8-l={U#uLIMm{#>P7*Bxjh1j2JYg;g7n=J0 z*#dw0Qid%%O<IljnjrBFbIyEsB{==`#rU;gM|M4ajVmc=AZ3z6^3NN~q4lTYT|m0c zgmQ;c2Ex!>uZ+V$^B6XUu%n&XiaaXE#cypvLEdNGr{{JR-+<mmtyjJex0xQp-VRGG zH1xIq;j9;KRE+AyA*GpX8sr|-{{=ui3EqNUoMj=;^xEVNG^&~5udo&X80xeBIw(Xj zbFy2!t=^|T!9l>gwiO99cs{<c8LK)5yh-AAWmy*kH(>nWU`{jUx7px!6M#>_NrX0e z;xQb4rkp=p%yyA#=}$N)x$(C;9v-;box_@P<8t_(`}}Qp9`wM#r7z(3WR7Cn3~3J- zJf8-$4@#&LU5-;*>RR8fRm)QS*`!g%&{rveZb+2uaK27=T~Y;Ef21ER-y!x0fU`)6 z_k4Jy6Ym}Hjf_DrNvVnLw#K^>osxw&c|LAc7#PbI=ly$QVhmfC4vaCP{@^ql-S#{x z4s~=A$Uw}Qv@iY+h+gBenD7ZAZ2)QHJTo84ZiVcoz0^nPrEP=$++$&v$aUSE1C#l* zKWc`GEIc}x%KvTrN}yq+1yN@1vYy;Kr^_>qb~a+SrRlQl9~IP!i67J|)+w*BML_CE z@#fl?v`5)S6894WS>K%(m)Na58{N-iBP`{u?QAVmKZTcO)kZRJo2Sm#!3S+Pyz&Gs zUvpY=9tG}~GSCrXcJjjv1vM+%=Pe6b%n+M~87CsQ0v+LtSvk-Q1;S=2ZK2PPjd%G0 zk((>-G{|o3S71K{fStOI+GN`MKviXEN^EP%yX&>_^y1X$0DX|LOUJURa8km0vbC94 zqPoUGBnJkc;l<<Htjo#ldfLkgYGA@n;i!$k^7wDRb^s(l$X?iAUX%fd^O*YF_PKw% zWPkf9SU81s9Fo7Q&hvGSN_9Y6Ah&ov-U5Xx9M{$$)<I|X(By!Iq81YG;wk(hUdbwb z7RL?&?8FyXD+s&K4g2nn5Bse(<}+_Vw)K+){wb{l;HduPjTP*~f)xYY<pSpGArA-3 z_dH<mN`ouXF_{usJ_y*mjjpNUU!f<_F)~6?AgFM`^>sTNeguGb&j-&BkKQfmkq1(2 z$}}yCh(iBho8lHwx-3}rpAys?HrN(eR^R0ac=K!JKGRxp=GyI@Q-)mfPQC^h&@e*w zG6rRMl9w#Y3{9QhK(J(=vaLo}d7g4=q>B$3!Gjd;H6pn8AendWLOp|{FDO6K^ZeSw z?{mk(;y*g;UOhRnNn~Wq5ZaBpl16@N)%8XokCJ_0OYP6F{*#6jKL1~VS>Cp0Lhj)~ z4#2)EhaLCA?r)Y+f%y>P{7@9qBOrG}mW7r?OqWg~HoN?0-pC)Kr{XK2U+^^t>RH24 z6stuosebqU>C>)SFXxT7P1VH+6ZGBl>TY^mR)L<p{rv-7fpSspe7(-5$x^ffa03-} zCLzFOd4X@sPY{I-rW2uVmg(pnbbZw|{GPf(8ETPT&QacRLi=!!En5BxlBDP$)eF`Z zaLgjRT`f@?vS{YWEx9!O5ZN~PjKg20EkH1Y40}u;aSj>bp-7Tp5A7tY4U!QLi7O&I zuWzvr*K%l}K?a*RO^G5tbpe(2ZypudQSV1v<@D)2w>3?<zktp80d?%uXZY%f3&;>u z8a~67t6NpcPM<gBy3>hthEaZ3lP~_xjoc?Ux($3Y?x`y1U0?u!xHo&ezu}>sQ-Q)` zCYp5U+o<|er_J0_b0rZLhiM(p8q1HBrt}yh3VTt68V&NqLts^NUVX!7IExbTBsKg* z2bxF@-k9Z~xs?IG-}*%nJ*}bZSJ5?bjH_(>KRnXA?8FF8LE4#D*X|z{B)#Dx5V<Te zmBB2rExLh7{&W(=UL@XO!He4s!d%jpZ_$l-Ah1YK)Hn_bF*a{)H~K}zc*X@AoB+qg zJMp9XgKh@U-$GN?4BJTOC9`#%w2SrjiPcO-&5|aW`KIQ%`T%!fZi2bVzurT>Sg&mb zaWNCHR%?DweeJF)lKfWn!CT37FP_1*PP(Z%IbCRyp30+vXd#8k#3tPuaQ#tIS`DYO zEcH`zrzT<TS?OGZTa83>Y0^~!Z6U=N2Js}BLQ1hX+1=3OisBX;<6cK)Y9u+HCH0zd z)VY-T;|KF4u>k`;>6;T`=%4(Dlb8p+xYOhqA%lNxRHZQg!jeeT<36+FE#P3qR$p;} zZu*ML+fIAv$}txIc&CZq(;Q~0faOr!Nk$;g!fmHX&jy)wfcPwm;#>V#KgY%j=jdv@ z?eXNnN5Hq#ceJaT%}R~X3v>YW@GENK9zqn(X)~|sLo+<}2!_r1`twrDZC4ocYf6Ws z#NB|`*?XxGUd3YYfq`@VeFy0{JhN-*O;dgjp$d*gJQjjxU63pkYg>{&8mIGXoeCNt zhOK%$zTHk{d1=Y(v=HWgw)wo?p>;Z574Lr_1^>Og{jY{~Mdq(cqc53Z6DbxW*<V=0 zCO-7KJo8}@*mg%K1^nQa91pM{bXJGb7W>II)?j42`@JZ~-VC-jwL^6)#4h2OQ;Y!O z>f$-P5r^{py86irE*iZ6><a={LB>d}5g1r}_cvY(j-yxw)1cd!P2NGNVYTMH*$zfi zMGXy@nol)U7?KQ*vJ09i07dQ3P-g}`I3;SJ(+$hCgmS`0BF{VM7QAsoR5OPk5}H*b zROJd8^}|;zSFq?7TV)HJWvLXPL90ApzqpRCg<93K<JSJ*j29~NE3q$0S16Kr*X`Hu z+w*6%bPdBXRY&AJ28aGe3QHz|E+VRL`7MI#{toEMo%y1X(SrzJ#W}MB4a!vOsXbW{ z4du#(J)fj2LP@m2;iw%9U}dyMZ3n6)j1cMD0R>Ug`i;a!(GwEvv*glq4Hu8My#L&O z$ZH4M7R8mz@dIP8)JS&AWjMp0?g!Ziwd15UC*}Av(8=;mhc8_<3+9AaO`V!6z>L-H z&kBJj`-*Eu64-ApK7lp{E$r0{XEg=_jF01!=Ys1L63%$(DqiQsn%DV>=+?J!?=cx! zv#fsR9vwq97$?nozkW$}%&@uR3Mzt|h|%HMt_No#p}pKd7`8vDx#kVNHWh5cwwUq* zADbhUr*y0a#=Hn3!sJ`fCKe(BFoNO6^lmq#Cp5Gv_F{*7g2=@AD;M)tu=E`m^A##8 zO*D@V3fhOZMNW~=1|dM2^<4*VKOZHA!(9S+@yREnfP03Zdwb2;p5(EcvJe}Oms!1< z!br*Q=dkfgTEeh<tP>-J>BqvfMeSdvVjTk(V6=#z9vA47WOww=<w#;#WWVfnuI$AG zv9D11|GH`kRrs4gqdnu;QAoi&0ANMW)N=zBm0VBST_f(gTE&>kumqZlQ%tL=u|4u( z8s7@~2vF36IX8DJZ;2eb<QX_EfN$(KtLN$J;{D|k<Bg(wD%#Lt)X>%)(c5NG+3&7A z>m^fBIv$++v(ZJ6W?tSu<Dn2W^oqpg8Ak?FDZbwDL7?E2WZGc(0BVObCSdV}b$r&m zjh;aH3~O<ck?3Xa==Hgs7>Jt@dUv9Bo1AsCA{e({|DNop>VHCoYk>S+1fw)3q7?%| z)dEm)R|`en9o=o>XQlA~P67|IrQmYE{8P}5J446N*#<Y3Of8B_CG0cAM7{6A?1N5i z03JxRurQOs9_HOKmfG4<H@MHoKY^oE81UDOVydh7=k<y2=^Xo+`L>PyX-eJfbs$3Z zv{UgmYXPHpVUJqOF_?y^?apIXJ>O?lAiYfVip`UTE`$*0!0E(mkZ4`qN-rCaZxP>2 zT?>f=|95A){3%~JgS9a!`$g}@H9qwpQZWyE_}FRfSHJi3gW*uz#<|G*j(H>X2eOgr z?5(4(xHCd`=%Slp#@1CWe*NB&^i(>Nxtpdj{8=n-J9|B098osQkCyHCy-gO!E@Lxv zN|vp~&Vduh(!I=c9wSvDQu#Ae=Mcz`rt9<~837b*8aN8OUa^wAUO5kE+TqLW{q!{J zl{#*yd6r2*U)sc3hM)O*e?ONO7yntY*zcn8YKxxSI(r}40zyiJeNZkz-33q3Xc7*n zb&6=RYrXf#1-9Lhi6px)?^JYgS-S8(cU^hTvl(^ZE4x+OySgti`m*8Owrw{HpWrso zkfvG~*}t58*K#xlW8cag86#Ts*mAb$?5un6Ta_fBiw?3jo2fvPP@u>*vh(j%GCPiW z^zxBhk`dZ!w=$^qQywS-AO^`O(}=yNQVDc=6Z)wwVM4DM?sH^83kXRQ%<y-wdYcVB zL5aA~hVKsS%NZhXC|r-mR_5n_lVk&-UcY}x%C?pe0gKl+kEz*Ie%vjp46oRSk0%f9 zHB%Q$N}K?_QivwVSG6v@a+1WVHMA}A4x<8yidkN-Vs&@8_{)*H_8>(ju6*vEGu@_S zA^!}k^?_t+-v1*r_4xR2e&`gnBCBL~WFpt+rbNjzfm$x-Y#}Wt*cR|jnV-wv8nT_+ zSK*u8=-AXM{_TfzcgLDpOZ)kI;XDVQ9H(R5wd)s^H3+RkFJ5@qd}oA`Up>MH@L~Kq z6MtT4r^aeoT#*xxEZbWXvTN|HOjzels8o=vN|d(JESjBff7dytn?|@cs4)e4=Ix5T zS!r2aIf5KfWMIr7cxlm^m5#Q<7<kJ7_RB)S`shR%Z$?68CO&F=8TZNjZ(Q4d2jfEO z|4wQb@gksaR&sP#fTlMH*!>*@IZt&DZqg?`NgGEAUbV;ZXuG6L=vkLeSqs;v{XP_7 zqzU}i9ZLhi-oyVhhT~uOdHkyCU_-5_S&5nN5xJjDv2}u%Z*T$(AmxAijDk<(bde^F z|4FFpTP>6!R^nu7DJvLk=}#J>HF87FG`pQ&y@1zjFWjB#9>oP^^!(wL1YQ=eKkZyO z{nomySHiq4t{_^vH6<^2N#oJPuoropGN|Rv6_|@wEk(|BO+dXR@1V%!iyHhQWTwkR z!q;AY6gpd+bEdR$1x8H7P3+Y#%=c(woNc(0rXPGkQij&u%sjcZL7U0+tsOq;=5W)i z%z5y|6*(Ui+s{5}dL8<w=3)o5+%wg+v~*43xDA?leuV-gjKF>&@ex=02RzCb!hnHu z-~(A#4*r2jC-YmgHy`QrBD;OdPQMVT4Wt)w@}Get3~{~_x$V|(B+0M)kGB-8<e&Ff zkGeDl?EDgOQFh`zpVosD!|OS|J}Vx3c3r04nLYfi6*54JBX2uD<FsAS+Z-Dq8tD{r zj~LZw(_+RnP0Nv{JDYP0B`fR3hV1p{b(qhsaYfnt{4|4G&VbLUz`UweS%0jvhRiHQ zNA107_qr|h*sg`I9iRWSCwJJ1A`(e@53uk_6<+fz*P0ZLx<yAa{7Ar|hS4v)`R!IZ zm9~1p>*0#8nJD&Q65DEea<O=KWo(T%8`V6cbb%IoD(c0Wiw;fR;nc1ItVRu+ip(6@ zY`lz0dv^C<53-+yp_7)xUSFv*WEFn;!cBSp7Nepqx3Ed{ox(o4er9pJkVVbSw~p5+ z{g}m@9nk$msLaViJX2BvtQ$l1@*gWUMv=e7mKjU+HHyCwzH-<-0w37o=;(-p8(<;5 zZuyig(c~uw8)n($_JTPEym+!`wg7VBC61L|H-C`6sewS28fE~%mlhtAy$)p9>A>^% z)PB1cb9S3n7^X%kX~`2$hT04>bJGIm52#%A9czE%(j?ElUz!O4nQRk2`^HOslQc`B zda7{F(WO3aSsc!h_Wm4#$Phg=NAT^uLMK4!8>Y}RWYrm#T2|k*6W{lCAid1h0{#<h z!EyFq5_pinW3o{8V*uCjPrbIw;rl_Ww$oBbx(4eLjGO9bfNynHDs%+O-*tssnmo&w zm-d)lTZU+cscZ+B=BW9s0G5Dn?cfgJHHHnfctE*n`+T;b`43GM|LO#oN*x;ZOdj+p zUG67KLh6Q5Ti!V%o}ijPa}r=vo?)yn&O*JRq9rDMQg&_`9Oe*D*k|R9d0WjerU~ap z>%)D7;8E8O-3&`~y>L@_+l?9Iet))(Kx&TnfYm?F>yn~y6eS)M72|~+dFI#O*h_sC zG1aCuty3uB7psiBT>boQyMOh)mw@h7Pg14k^gCS%`h4h25&<70w>A$td~0XI&DKkF z86Eb6Inq^!-Jf%r`(cm9ZX+$F%oin$RWUB|>Y>9(g(?rI=cY#M&3N-<)M~#+yEd<g z5S!WniUzP~6)P@&r^NKyCFI`qo3e-7vBDvjVD+Eqd)<PumJiC483{&+TB7+Kx^G|S zP7s!UD)O;wV2d7kl_{v4y6g5wnPjbHu@N=Wl3K#;qcn=3<*94;qI5rGh&<Nai_^zs z?fN}Zw-_<PW>@zo1DD2!-hxO8JU(PZhie<iV%4Lv&_pJpgJb^n?FiK{^~&BC`+Ft& z`ax&w?E-%0^#B?$IjslP<@GV|)UgG*h#4RAg6@TK4}NZTicPkj1-zl}*<)j38!I`V z`q*DoVUQw;{uU7}@`beLqYX_jx_~_EENJkLRpq=fZR2_vga9qc2s6<Xe@qlL6yQG} z@dik9HA#Y9yJ{erf(BShCCqm(+@pN76d=)<oA>I*J5SdzoILzREZ(&uLl9bK5&8C! zqOVn6G+R+LQyY)Y7j5`9s5q#Y`BliVQ}}FS<3o(hg)EA=qS6PFmjCDRs?^=z=J0qp zCsK~wBaMPOrWZ9`O@259!Z76~4)NUa2G^A=H7ff>yqi5>OgtfImME@{kx|3^OO#-{ zp4G0-FJe0kIQt1T_;m1?6M({|(SRj;-i9P~u$$nCrU7?3U#(&{4+>2@!!b(n0L#z+ ze0sx3faq_v$a_nOfdSYw=p<KXdk3E{Uv7)YzZ$vubH0CleU7R<vj!2!`|+a(IF9Uf zy8{)_BSGmuDLqkAqOboxFLG?k9b{OHd{~E>jQ7<KXIT$Z_%K<65_sH>7RFwq4R_oo zr-lu}nvZWqxqh~##pFmR<wEIcP+K~l7>57&3&Ry*3<Ar%DQ!JqA(v#)Jf<nC-6f~5 zh}Dg=pOAxWE3vKo)I3vf(H{CmKkg89aQS__xc)1dm~96k?(jJAyT)|u)>JIScT64q zTu^H(m~K91*3yEF;P8>H^6hm_O$?SU+8wuEFiLnqki<^R$NKU!BSmoNY#8TmpPMZt z83WFbJ$Xf0$4ovIl09`0c*!!7OWDqvy+Gm<+Qdv%z@9MQKpuS|EjjqLK!R%&r|TI9 zS+%JZ9m8&Wh^u$QHYn4VK557dj#E^4LH>nGakH}T>k*VIsMJR=niZT*-sZHl!>-QT zb0=xRd&5i3KPVqamJI{=Yao^}TsJ;8sx?C8AD+3e0>JNayK$@@h1z`rypjnnu^6V1 zy((luX`ZJWcZFyQ1+#2-Ws&r9&)}hgj6ISjw8!2vjJ|!L=*uu!8aQ3EpiaXTF-_S{ z{A3F98c(k&><OJO!mP`(Xe4(sW2eK7LNc}?oqW6(Bb5YTXNaB4zrGbO-ed`!n3)qf zsRS(rqdmXf|IBZ^9&10737cd`tL_i?x}o5>7W_<jpZnXXGyEnk%-Mcfl{*!c6+ifV z1FQ(Co#D^(5S|~h7KOg>U0YqMa2P~Gpy+*nE>@Vn4kmvZ+9^KRS>)QSC?9IFSuj@j zwrNRD2h(vtuc)pn0tn#Q(8^|NO*D+7{N8m@ZNji}Q@ICT;)@;IAC8`1SQrX#q=g5D zEni|>^cZV6A{3@Tgn+Ca*>))!>fY~pw8%|1zY{9dox6lBH##RS_8I>3y}kY~g7Q(I zO2ShVmOv$7+SL0%_HJ?6_h1hsIP33}B@pyRxcZB|vWk;s`{B@#2nIaCE~!YnIM~Sk zbDjt-A+`IQ2Ndj<=IZXA_7%(+8DLadxw!XKi7#0Y*<Y$#ykTy(92~XqL?%WGjp}E* z{fK+JO7LciuTnp!WyPx1P#E#>A2dX&$(L^{pgWhX700%0qwH@~?-3^4$!9m{Nue)$ zJ5M~s(&d(VnY{1%Cb|A1cor8ISHM4C|MQXl9WcPi{x=k}^ArM6qZmi5``yWMzx)2- zhlu6dC{k&$0sfUAGH8Fk20oEzTtV?A8q(}s_q=_jjy?dsodF~Pd_Dc)ft98fa1S2? z1w=z#Q<c%O4QfaYUNy8?Qr)~rzsD-?H>6RI76o7kKKve_E8kn(Y#A+t)YAFOo_F*_ z?xxuH_y#fa*&PQ+gTa^J`ioZncsq$PIs*k{4Ha_%@=vOXrLExi7lrlf&LMYvOM*sJ ze`0<vhOlUaNq>1!#D6Zd3ABXq>6c6jSQ5mOt(~AiQb^{fl-2JTa}!2obQ3*ak+=m+ z@Q~`p@JC+Eog~bVZ-e~KL1tlTFG;`t&iIPwOQS{iY1~cByc&3#nj7)??VM}k^W}%j zZo`|TFx=3%cZZ@^1ReQ-*-+?A*>zGd2Ec-90foF10xU@D_^Ljn84qoP=ujNu$K+Wb zJw+vVHvgpiswzBwxA)SZ^2e7@P7yyo%_-0_oUw|bbkRg*x?P;R(jC(&Ei`(a48o#A zCowju=_2`UpExhNm(cm0(YnaY2=2fv&u8+tx!<)wH2FE=H#iK=Pp=>Z^!+P*IdlWB zm1<kMpVwfRzuW|t_zn#l&Y3zlHd4@m=g+(DSEEi)rZ*)i_Zud6heWakwl><y-l8U* zfLyF!ws#->>ht4~-y@B(U5y0c0Gmd7q6RDsxRHzM1AbrqVzy#?fzlx;8%6*)%EkWe zZf(FDf4`05TX$J$WdM+i2K26zm;gREG^874P+ckp;(+(%&igU#v-dxet|s<hO#+Z8 z?KNzlJj&;Z-0XwEBuO?*z%WrlYC%v+>JvK0qG^dG8s4`T#A{ECdEUfFd!2?tw-sa& z<HN{!t$OB0tZ?Rkbc2AqC!+c#sGdeXfiigmF&+R<>BS1fcW*K%2xEbxru}W323`X> zU3!4q&-$xNHxg=xCQ|YA0*Cq_6F#`U`&>i#tA0C~JqW5wHE=V~csyQZIL5I3L%Ezy z@%u`viF0tb+%I^@mWwasXprZ|7wqdEo7^{yC3vO}cq+@iD4_+E;7M(~YEjVKCqgE` zw9{-5qDCLVxulC8($aLyD)xn-qz1zuouds&%t52uc6=yXn<s3?>oKx^XPddhGPics z;qzVpoZ<hyHAD%E<)W60#Dm%@+27$9xo|uF+lyi3=8^A-3&?B3HXX+UB{gf^4}gb} z!x{No<+!~v4C`^pJQ63`S>7_PNFjkXgmf)E{;q{Z&wn1rRpU*^>G--A&z9Df9i@i; zkTJ831y6;C%SQ*)?WBC-37B_qncbggK0g=7ap$P#lSw@qoSOMH{$LqwM@*OCLKS&w z%~n{e;c#Fg;)YIS79gUh7z0&%VkQY#A}Xo28VI0;x%d9+eW&L5uGwBmQ0Vt|*Bbh7 z*U|rr1#mfx+hobk#eISexOKRAx+-Hq%$`VvC9X3rqn{=`sjLZTYuTC{VIuWr_o(X) zwR$*N)unx<m|<tSHuU_UYAySdqorT1zr9aR`pK!N`$6N2Bf1#R10K1}UfL%9?aLG= zMy-m{#aO}5<v4NnZ*HSN(7GsJpq*I`qubY8Jq)<X2y8}7{WA96UBs@aSr-B7<V>w5 z6%4Ws`Ks?`NRI&_*x~|bZP*vhRUmFiKbf6VwSQx@Fqz-l_mSxcI_BwgW1l?f^{O$_ zspP-(1NgbjvnoJ6zej-hU{AfA?ukx6Q1(}*Q=d*qXhI_mMJA7bz?7AL(QBSH)X z{LAgsUfLL^_3#5`glcm6<*T){Q<z|tG!_lpk4AXh+mrO?{op%m^=@#_8ypV;K($Nf zY25?#a*10%X}#sFf4BAa+~6<}-=7?<gCI^JI%$+-?OELF=*SO|UyoNGaomAn2Dv1{ zsWcIBOvp_tn0N<2kf?VcLg7me<=ZOdq>mw(DxE2@ivCYHP#~`eMF5q%v~AW>^WDQ~ zao^C;K+!lACa?~wlqF%10`j}rfE5)>Htp(VSqo|Oe}^@EAnqzpwfM}CM%Vx&+olo? zTMb4x{k77ToR-6%Jc`%n#=<b#l%B?Ap92LxpYO7}`twth=!pSkIsx%%ZvW<Sz$Pj6 zO8c7jl%)@gq)<Lvs~wTH2b*kG=7wd<?f~YAG?Pl(^8T;$p@E%Wf9jn1MXD>sO;f}j z93=(EEzZU|B2P5ztsQaF@d9=NuDh$c-1{__c3ovIe{1<|hi5^raG=IPtEqUe(KzL> z3IG(@=-U4O=L1fsg@z7?wD|VXya~Ad0apXIViHjERpiC%I7~gzP`uh5>!>NvmU6YS z0t1`OxW++^w;lu4%~SDIc6{7r#^S&1m%t|EfTX>W(y2~jQw5f>2lJ?wTIrM5*I9#K z)T+zYMX>17S`D92{l23yUXV2N{fa}8{VUP#<!h&OE;^--N~S20J(lPn{LVL=zwACF ztc{*<Oa=KJou3a7&7s6n4xJmDygx-M4!-Q|jZ!}QTHkummsot{edpv1qdM|7{D(vR z%LxG#9vYl-fNSAKBWiLA4+eHV(7?lr?8C{?-HjFOe6W15`f}hCr8t<hku^M&X5I(3 z7wP6X1?Wm6#L1h+01(hU4d5~r@HEa8Dn1QXYwf_;in3e}P%CcNw1t&Z*)XV5!965u zV3Zj6(30F;x1<9Hi}D!OmL^MVL*fyJzPbw5fXc#=a)m(GEB3{Fg*`*b?-a&aO|Fv8 z<NCbz&AdZB6g3<=KmsivdoeR6I{T(^UKK8;XQk*G>oaxr#<}4e#}~fEB)v~UzTImy zP<V}^>76ilq%vpH?gw(xUFdYZ9y*uFfl0VIABDVI5KG_PB6BCSq@wx3WuvSTQqo(* zz=gI=X~FEBw9Y2KQ025JXz5@p!MgN`2oSPY@;N}7Fp!r6QP2DBN9yl&ag~P`az7rV zg*%OAbx^|<Gp8w`mr3{1-Gf3&Bom4`)GF5UOmy0@uVbis$v6#@BklV8@TKi+Nf^*% zjtkl`%gixkEv@KrNZcds(?g7Q0cP=<frs-mm?pfDB78G)(AECOBH~^ni}g+~QTRqN zb)6+yIyI??gG5}!E&~WR)F6!C;*luBvP>C)Vo<<Lc1)@{!^c(Q?P+FFBhknvN5&Nm zP5(@$i$V-Z2;V!sQ=WdhMbX!KzkZ^9r=sS2Wa4B0Zj1fX$u&jV;`CU1cmL*XVi!zA znh%f1$G18WVPiy1?I$z{)L+hQl_p$1#U#s2GjkvsaCEzR^3rtq-IF%2VUy<|g2C;g zK|qT)V(jPU4$E^I|Iq&R=#-=P>vri(ZL#%VB{1^~Q&Ke4i2&Ep*)TyAgaaulJnr)5 zgNX2%i%Xrr%U6#GbdoFsFsXIX3qq*c0Gj-bty8_w9nf7aG4$>w^wg?E(fD6O@&DY~ zmah~~0C&nu&FOR$4YGK5$mNH{2%zahUviebGdMDgY3{f`tE!OJ|K4w3Y;u)EmI-ft zu0rp9vxyX#L@l%2IT_8PO}|99IFzZyhE52>ag~hVIEdJ|U8^A*`qj*%mz5Cv*PPuh zFtY##z?ga@+F(G_NvzvXRnpJc{qUnU`kBF3hH*NUTUQ3*if7S=*!m%n1e6|{Wk_M_ zov&Z1J%cmAPr>hz(&7xR&GvTb>5;F4JT$dl#_yP0S<M{Ql$&@vLZJ_py^Ly_0g3<r zL-TJj`Tssad#_MWP<d`f_v=Eq?Q67df9Mg=@1Y!aLx|FBrQd%=G)6G}u5t>q<#3L3 zZP;sZGkd%OH$X3s1`OvL;nf!v@b7qqZVZMu_~ET@6jjb8OTlN`9hUY)alm@-o!)0y z$WY+$<jAi)4^yEA3p-loEl#u@;JCdx9$6N~B|xe0kf`fDYP@h{m#mtmkdn2veD!ja zbqmcpz?XF-pAhMlkqgtz3Hs3NZX$+FE6tX2#EkuJnrv3aEepY}Pd}k6jFqZyDoCsx zZo+({yv)7nCp<SY>D6VAw!*0?+^_`tK&hpnSk_<wnAGtTVQUWAH9>kU>xdEmWUsGJ z|7Cgg{he6zL5SwisB5VNe0Ldt?-=i;8M`ZlvRSrhiB;zuq9bK~M9BCl#@im7GQ{NZ z%;r;4#$nC(i!Wys4?zj}23IUDgxf%}hfFQ+S<lSnL4q0a7IKlUMh#DeUQWcwT2-W@ zuPzr_XVLSLHW@IP#d@*@34gi@n*(0J?)`*NX0|u@^^sKO=w@c~_2<-c(9sm6HGhZv z(O&ER2CcC1c+xxlX4MwbF~Oyt>L!ZhA$tdAjvDFNE`%5tj3YCm7}w02jssnRcY*Mn z%FhCLUvu}kSyR2mqZJ(K-XwBUmR{*~=45`6jdo*^6WP2800d2SFS<Jxj}Lt)w%u8d zO2+aX{Q=<X^MK>`1bk+g|Evu^{;X7ui4x*LYuQ}Wf06mUcGiTkB$~*wKK96cIekTv zV!+9p_AS~`s^EmNgzxI;=9wcQ88yJsonPSb__x$%;IGGcbB}-TNiwDEd=)qPwv!`| zx5~=7Wf?d=JrTLJ*)zeNm&Y$ExNvPbY%?Q{NC})j0x-kYJ5fS=Y<`E~Af$Fan<$}k z&VQ%M|GvS;maqK*$7yCjmuPL&rvCT}ibHlCoS)@q*z1z)VvIIzAF#hxulyrDc<_*y zQI0)A01ohfgN;Fepn?&g1A6iV;360mHM>>%+{BkxUeYX~8s!noPd+#i@b&3XA7ft` zNwiEqT>Vju#D_OryUyNnc%{9EnL9woN`xrS^&-3Q&VgT0BKT67(Y+|`z!7@k1KqRD zgXV}EbBVO&#-OdXO{Rw~t+sWBBXHHS_u_3${y!b#UuuD4LtWIFY(0<oL^zKn-mVmG zwVg_8-M1gzO~yZN^e`HMsb=2*_$-<A6rAMUA^H6K&!6(y2$@u{VoqtKc!X%Xym$zV z>-I`q4euG;_*B{A^I?)?Q-hk^*id?AaBgq_r6if7$b<jNj_C_`fqk7Zx>s$4y^`@O z_9nYBG>KV7+uMMgI5;KJB;j`eifg<38kz7Yi<xzj_sew=6VLo;x4p_Ee8YWvRhm_C z!Ra3gT?^S$%@?%KBN=fIj12omO+1NwKBsA_1mo5pST24{#+2e{nWS~W!yV(p{8+QZ z?`IKr?TU?CZ+fmH6Vx7`&S_`P5SQdcaIszfm}d-ZLV8=%TB7KrFC5J|5dS!Qf&4j3 z&@5}DM*?C7D0clgqqE2cL6y{<!Jz^Wa{?HN-^JdE8k5*8NM}Y+8By19W)X1DaI`-y z#k)NMQAbv_H}0%sonJLIx=ApkDp(w|d%S$GSpx-ACh}q)MqsAuC*0}`kfcRRqx_qb zCi1GawD>1~_SkETE8DqMa9Tj|bS&kU?VIc{Uk`CHbSfEcJ5m|^tU22a{I;G#iG3OM zBujR~V}5_lOWxSl8Q}!pD?llPk6D!{nGm=oyr<T=U7WN9_9C(Uz^qApoT?(c2`9SF z!tK<Elx-QBTAk_Lms@##nAN9T2Y%c#W+?M-vnQ{iVhmWKL#wxB-xj4+E+d+fE}jcP zQYNTMfNiPm6<KO%?lZqx+u~;<+YERaDj#(;3;epmx9T8J!(Oq2q#t#bGSpj3oSn%- zYpsUd^w_+sC2=;X2^^Vd{8_3jp{`33l73HMNVl^qVqr+G^2l<d0Yl0TgP@Y7b9%0( zhWC31#*`D2YV>nS;hPsTD?N&*fGqC8r<xz|bK>}!zl5n@5f2SVgjgTBLU*U3$X=Pt z>LUa^R9m&I@V{g8zb|!*CpjvSZq81pb5Jxu@qD%<mv0c$u=|W7A0xpL31>ZMP8SM- z(4c+yI&`2lndq4Lg_%DE02?`f)PHtE4p7b+cK|ij;51Mv7N;qc|DxlT^*lTv`s#Cy zGN6+I*yZR6X7vYQ^OP6A*(S~dzWd_6=GX7U)oa+R?X)_@<nTO{&rjT>511bN=pt@d zkCNu2MAmYncjOC)lO2MX(V;V=dSbTtos8y}>_<ljt$QX%hnD~i_odq<s6Gun-9Huw z|61$@Oy{Fx`h&7=qu#s=m@Yuqf}YuC-H#97T|yDnmB&nRIMk2IF#IWcu>dX6ZLc1+ zSUpBx=NQ&!9tYl=Ri{wwKq)lHG(Elyc=2SR4N?8V5$!iRxC1l&4mitbPu1*V8Bs>t zr<f>{dPR$0CXK;J38&W1#PW~W>%jU^-<L*cy<4IJZagn3^e@FRn9x^|ZKwiNfZ=nW zb(I1ucQ}Jgr}9<;7?`#@;eNg56MtZ*Rc?_C*qi*p)YM`Zaj{k`3%0FY9&DT}KaOaS zrJ;VVc;Wt{<(E+4Ib_loqdlRMx{A9{<paEZh+R~nzM%YqzPa!Vh{raN+oY7CB&g7x z7N^ql^9uacK=HngXSS)-_T2YWl;p-mW^7SF9ONgZre-0F8`-BA!j+y7J@Kq$jfakE zyofCZ@NniglNOZEiu%KdvDa@Y|H#yCeDciiFsDP12kG5N$QJ8?V7xVpl&g=0ww~sv z$8RDxS{<JdPBLW|sgcCV3X7I4yVKpyD4PWHPYl55CHJcel_upX&3~sBd6pXJDz&wW z#h+lBX*UugOzH2G5X?cimQ6Z#X&93YI*=hbQ5|0BljWd<(GaL%u^aX1&5Nhs3W))> zz<ON^DBty!{oPG*R$Xa_9{0k{X2)wm>J^j$Bygk&W84~dFhaZ4-+MmwdKv{QLTMG5 zn=oJ3o&&!-1Xgt$I*31xX@C$e&lzg`W@!=R57Jq0_YwZ+c4?(I$gq%62cH(TC>wwf z4N!MMY(-EQccEOa#cDG@5y_O5Vxrxz_g6eO7sc_CzqDo2Qb!lKW3$#2Pf_!#0|0<A zh00Xm=2bQ*y<Ar?et7WruLXnDjjj@KR{xFqvnoO352xKk#NM9!&zbH{vTlR5?#9^W zKSYyI1ls<OuJdoWLKv|gp@>+Q!d9wShxO>w<scmFJCyNh&3vh{(}oW8mYWwKno5Xe zKxzP6KDhEiG(U?2<o2M!vyB5fOxu{#D~!kix-Wy;q?8StrS3*B40ZL2QJ_N%;yT&z zwJmuQ@8~*qhu_FD=u|1XmutxvUD?=F(q#OrAm6qcKm~7p{?_^qCdIckpEfZG8HT8# zul6_F+dpP)TCY&PZ`(Pc%cn{81fiWgmg<lH@c{o?+OAv_0nk>a_cAROv{!^n;N!!- z2jfs|g6rRc<8HJ5q~&iL0RFYF$zU(y-g|dWRm^Wc%}5t$LI<p$bSnW#7~;G&O|dXq z++&BGIBNJpX3edQ+(T}LGR4J68n7Z>@K32yx10*pn1*Ts;9U6g>Q)(T#zU@mrOYIL z;Bu}S<DEWADU5dCH}B%$ShIU@Su2{Ww{*c2wZ>%|Z-IS%BNBT2A}L+?_Wnwr4KJsE z^B(V~L(qcDkb1O`Dov+9ey>#Iu3nsr9teU<J_oCAJtj)PWhHAgNSn@qZLr*P8jSJx zO8%a*qn!`iFY0To+bboV?}db_^0pB-`o35zJV`r$qx;O#_xS`@teDu5eOE^lEx@$7 zc+C#wU+_j}v6&Rd=P7{x_A0UX3+HRmlzS?Xegep!DMbMf^r(4MyNN0bu>kO`2u1;$ z)aE2KY(QkZuKYvN9h(h(8GGCQH<d^HVLkRJ3j#^a3^wG1P`K}odm0>_?mRjJNBF|Q zBGdsdXY0!i4kLOo?So3G4JXpWr{4B(`ip@q=o_<wDkEK63splY$xGQ<*S9&DlkW(7 ztA^suZb>DeDr(R`G{hcG9d9ST$g%Swy5#g9nV1E;$+v_P;j#v$Z!FYH8^X(K<XR=V zXg^SM&BmaM)Kb(>qV3i$l)vAr1&*|AquEgBf8nJD;{$^3yY0<!L~?=PRgrZ4DZMRB z3?Gfo>r?;4M)BAZn0X6q_o_E}VDx9t@B7`44s-9uccNmL`08<@RNTF$_^XlopQh6f z(kvz{s^bTpHW$*Eh>3^wL<dJ1B<XHhY@^9HTr5~EedeG1RHC!u#0O~QZ)!Rm&OD~V zmQB1}{Ne+9^iqJPUfreqb{uw6*b7|?cW--8Xba?i_dlmUsM!eWZUe408pg#xa5{o0 z^m&s}K%(T>$Ja*72wm7T*0~V@1PVW=0VDaZ$A0=w1fl5y^uu(U0WPgxSTKRIWPda_ zc*WoPR{o)5uCkXBqs?RXTBB(<Fvj)qy%z%wn{neyHm?AELE}AM%chiTs+ix21~rC* zHv`>S7H`?u@*5mwQik%XZ$1eG$rLE|Eu$P5<HxI;LwjfLR+;Ws>)S4H7`^u^Bl0!y z|C2Bz%t3{rXqUqu<^s6wn}EOa4^YHU*tP7#_PG02sZueQT=^f%_~LZKV?hk6#8yq) z5$nUFKZN*A?^CinSdbBTVkufKD(D1Z9srS_`hcJnbKtI-f35tkxYUjZbh^gKGT$n7 zFfg!vC5pg-VrCxG->H4(MTft6-g<~Z-R+BsY~^>Ss*NeYyg;;C-Xo!AvYcEuU$O>^ z&6!WL{=$l(k8Ij$$vFaRvn>iwBzP(Y#dfzab%VeM;1{B*iSn<H_9=c%)IL{pt?sj0 z<!r$_%u%T;WW1=swic>qM3%bHg=$NG0fxm)<oSfzlQr`M&bFXs4++c=QlzE1a6g-K zG@|&~DvpNZT_sJUuk`3^(Eb{O;c8Jq*}Ri^;8mV`ma>pvpJxYq@IC9m3Xih=_(umf zVs2#cIj~0~#yp=YG$FNiBKU|wQpwR>^+6MBQ-Mr_`Chu=L)n6Wp6K?npc=;-=5t%M z2b(sKT}R9zrZ`fO{HN|*(nVYefnD8>a{!ZM=e2TXgPvV(Zf{ZnF(<N3Si^N(g~6`P zsD|q5Rv&0%O5wscB9f+KR^GUr5U1i4_eQ**v$SY;x_Z%)mLpBBCn4OxqgqW<)te<h zB+tW52DxWAorxr3U*9mk?X)#WyL+zq)uhyY(e+ig`x}l1lo`s?Hiu2aTn+us0m34b zu?*mvXuy;;=6yRY1>%JyJLrRd0NQ*P+|vE2if_Qh8i`U=Lp=@`I=T1rQt`j=sj2-Z z5TYdFGKUsnn2eBBb8ecyw^d#<U)18=zTw%Bsl`NQbd%-OF!M6R-6zsjHVbfKLT{D( z)xbw^xW^KeofCkp5~5rAn;s55&*N7=!~?SE(~Q1R9>yzBQz|QmfK5hnamD91M;}gu zm~P6UtLv~|39!Q%aKJxIWtaBxNC1A-Olaw{6et+#z!pmO`6Oak_Ce~^iad;1n?hkP zCi^hi@hWZGQH+|%Jt1lG5n99d71XxMADK0hh@)$f{8(R<m}qJ?$m;rovrBt+xY`HO z!99r^*#+z}M{5Jyg%*)WE}tY{5xahZo>MMIq6AM4EML}3HBpEt?Vx6}=hh+r032J3 zb=;`_Fgjn~vbl2+dYpMBb-hws4?|Y+Njd!Ed-DIxb^a^KfBKu`N3Zy{USgU0V#z!V zfRMjI4?7TK{(~4LLbq&If=oXM1GnU&DZC37)tYfx5x*KRYS4y`Wj6|v#W<F#pC}jx z0MSBfC;+BH@G9zYAnvLqO5uFN+@;(?!hYO(O_j4@iVUFKnR>4ziv!@g<=lZ{c_;9l z?ktc-vI_wZgyy44QqUaUpmgE!&e1WZcES{5_}+==b72tZ9~fbsa}mV64aCEgU?X~^ z>s=b-`2sr9;qs`d5%4qn44uIX?R&Vff34qyb!$9{@xmj_rRnetQKKoRo(rYH9-U96 z)hf0?L-GiXb6!c-#@P>+F`a`fb=vh#zBA+Vyyi<DR{mad>8~^zrgRn<y$T}XuC+%) zVikSSR6^SO5f>!3cf!$ro$epbSdm87*j6eNB7R)*y^0@b)Q{b+O}CfdOI-v~LRcV4 zL;&SJl!?(xOQs!Y@O{Q5^Imz|=X;88-h%)O>JP+k9NE8fH9w&@+zw4FDG8UXi?O{s z>~mpd=wXQ0W;<7zx?QvgLQJV@^ktBWDb_-Z<CBWf)imq!1g6?)Y^j|w-Y9`>XuQL) z0zQ<e7(bRI*IVLG6|<chD791VS#Lp<dcn1^C<!RE=&@}_MPlfMlWLcQ^W288@C=n( zK|4}qxAW`^Hw&)k-qu`G-+pj4Z%>k4L~kfP?t7$OX+l_KE0J;x`*n{$MP-ZTWj_V_ zfvG$Ny6(yN^lCRk)xYf(ywWxvv6d$unLTu@#Wt6g>eovkFb+ytq7M(0ymdj%8}*kw zM;5$_8<!*{F_H5kf>Oa)Y~Q(VGPpJ?B*kgnHVc^E#}8dMNN1*5JoQd~?(%tjwD9-W zTPjep<>r1F&6cG^72mP()Y(_@jI?SCmoFI9pz%Lxsa-#tO=MD!CAOtc3PIj?7FsQ5 z80t5BM8uT;*nx$iIxbIoR3GLDqmW}YjfF4!95zy!`k49K)+`NoIO}qDTGtwZy>Nm8 zEW1#O*HO`E$~MN#cy6PjU_H~q7a}WaEa#H7T}MIFW#$Lz+?#vF)o+g;#7qKq5S0`` z%1Muw9)dvw&*%>J@^5%r5+5ide%>uKu|Kn`pMT_CX&l8iKDzBAk|nzF_LG~BkAwsh z$~Gdt8s%GY^6PnwX{*;psNZ(z)fG#y0M&nzF9!?%=F2U=t&&1GQg0<<*cUktMWjF< zvL48&`IK=^xMqEMW+Q4*zq@;Czt&JPW3!zEHz4s|$D8?YEl`C=%v{g6d$xhs2*t;4 zKwDBunk4d|GJ2gyu4jRUAv(eXsY%P5w|2waA9U-s)0mkffUnri`~D#^9fwt*0U~RM z0TzOLH6!&dA4Y`VeekN>5t9=Yj#4CiT^Af|h#)CXilD{Eu$UDhp~MkxSlCa$#h&Xv z+O~<K&sBh$Z6@z|B~I_4v{e%@zo&T=F}*Y>lZV3C4yO^JXO^2{70<fx);>KK16Tfk zlznwj-2bxWz#s{l;0_5E+#LdhAVEV2ZiBmPaF<{Kf)gYVAh<is0Kwhe3GQwK`_0>W zZ|iqAckAw-Ko!Ll-Tmo4=k)2cx)(tus~?M999dr*?A<M-HnW6i39+>-#D{vODYCbG zP9vBo)KkLb{FK}v{t|l+QkUavMHgD9>JAFJD_tnfvZ<Q7ea0xCc2g-EcX488Q<v>) z#6@TzDWl5u#lww0Tu2zUhyd?I5BF78yLIEWq$VsMfof#Rrb4o}gFXOA?cVb9Fodz~ zjgM(m1ffh*of@|>HoHy0c_#;UpLD@56m$;W3xquWDU=%f*>w9Z1Eg;F_$p;jdkN`} zDbv-gq_FW4dk(&wz9StRB}T;pggm<GQI{oxGM{f7`HG!xIMG)#Dvg2@VvjUBAXBY| zL+(3AD$X#CIUAd7J4T_5qM#_dXTJzL6HDJ)t840$e++C>C!gN%SPQFIC<~aHK^!bP zFQY-O1F@rR&vkgvva{>4hhS!;IzDCV2N{X4+<ZJmvGRe;<WMQ8rSRVMgPkI$X`Pyd zTAT(KTCEQ$HoCpJ4ow5@SWoE~o7QuDcz3qet(%Dkwa-YM(t}BioP7F?amPCsKRIy; zaJtc%awL-EA`&Q@ZJsZX{WgsrfZ+-l8MFmeXdjQ2MGhL=89`5(L{CR!9&<7ui06lb z|ME}*8TtfZOUM}8ZGc!mOhaUAy<X#k-VEkvdZ4|s%b7K=*_f8S&)wy!u5TVay7Fi# zt!>BQRnSSSiO9TgOW4BJZTfxzV6*R0G!P)x0SH4U_hP#HWxoOt)OBYV_IXb>Y$DmJ zfAYRRuOlPIIDW}@V=R~^Z@S)#^v;iEEuB0wJz6TKDKx*T^ZpMpxf)98vwTOP?yaN$ z_v-O4_zmA5{AM}*?i++7vFE?F09AR2Wr>JNB3Bop4@JZ9`QgV^^HGomDh9v&qjtG0 zPF5cBP?gj=WM*#1)Z4)OL`yLV3&gv`m9^C$!U^l)F8*a#JMLDUJym>)v0&G+L3Q;t z19>lPonw5OHAy{z7HmI1U@&snPitXtZ+)xJj0VcdvUMo|u@CH9O*W08mx~<~mHIu| zt(Qe)LeYsdJox(JBX((IHB75Yla1=j9Dimj6FDC-hKGQOAC{#i@tZWXXOV*_)IXl6 zw@*%4tK%efim?Hg5m0pv`AP}X298Zwp2sy_R{AeCI-plt8nK%ZOFJm-mzoFsYX9t( z@M|`hVoluYYr(miw^M*e5n*5F7k<S)b6yeax4J83E?hsY#-GcA>W4TxX9+Gj;OKP- zQ+q*}dBka|JI}P+%@_;&ypz2Ggk6hheE>5L5gv&wXb(_UMxdbtaOA599zAy_^h9&B zgX^~?Z=+f-@VU+<X838p9_KJ7wd+QdinEm{s1cCM(luCK_Oc@yy~Xc7%G)GGHElhc zkx-p!hu`wCCV=ZZ*j*FSbrT+Q9aK#?)C62H;hx!XswkyPnd(}Njc$gM7`waEo>Nzm z=}&)~a`Iki@R0LmSOzQbu{kr;FK>LDq@J3&D~){6x@^h%;HW&)IoZT;O=+wZ?b1>A zoV|(4Z5l_zdYS|F!!uoud#_9l255+IBrr~SaEjq#kFutayEnJ`#rUAs$d9DS<8R5R z$UX*O9;PXx-_R2*?hp@I2j1%-tf1x(QzqjY!zC-1;rH&4E^jX4)T&AMMmxpEGYj4! z>2>Q*iR;8H=;>j8XBnwa<3KTk_Y>(+0~kC`@e&ld_uo>QoVcdw@dgH89QrdMxXP2V z3CI2(jcI*^i{3aX-4`jj-0tB~*`6~0Gm`&jv{VGBJYgarFWoQjuP=d4vHfhAn&sHB z0=WG-=!$C<6g*JZvsZNT;<+t!xsxOf4P+%(r}BEAI4Lel8HFDi6al!0ux=w_T(V^j z@Kqt)Ic6!j>l&S*X}S~B4cBz(qP@4vPASn9AR&eltXnesY$Ih^n~j?DcCSChxzC8| zDzKQ98xNJH-`ZLia*KHnc!4mfmo^`rbgMoSHBJ00Q2fu2;?Gz0Cn*O!GoAAPBx3yR z`Qvqt(&KE>!)e5_hwZE-{rKbUjX%OuxdOPJQ$8vY(X@<sIGz}r%w!yb9*cNvH32KU zOaTuS#odO1Ip!m86Y{K;bgW!yzhd3ZF}Q~cJ)n+5Wcn90OD70{bw}SC5#)+QjdnYS z<QI&9;$K`~f0qr`Hy#PM4<OtO<dKST(63Q<ekPyw9m*~dWmk++D%H@<h@lZBiOELt zLyY{kXrYX<BvBmkuH|iu0<XpZV#Jsn{&~>>&$b;2cTLX39kX<6=;KZW(%5NMv135* zXpy^?+oM>5IGIWMHDT!1_m?$}!MhdHQK@|p%bjJ$go&CXu6K2XDO)s=i*k$m-!W}i zlap;~?SdMkDa_K?BM?>!caV+(SO%?w5JEKMt>i#NeDO$$9s>}<^t85$!9S}gi4BP7 zZq~OE@p&WA9Qk93W+?*2AQ>!W=Y{Wv;jDs`?r$T-CwAU_Z7RsCDP$mGoeA&NGawWa zytJ%*o&093i?WlifK<c*51*07GXX95@u-)7-?}csuf^Rko#&Z2T<2BiT!S0Y$DQ@| z8Aqwtx2fq#YP;17StrKupQ@dkN;E`Fu-u3hF1g1>TU%MJks4BF^NYRFAVSLp*6@6^ z7srmFY|P?yeT4W;R2W}*?8=HJ=uAG1HboL3FP8^9w>GfDJR9D(Hp+ZhmJ)wNTaK6? z%0s*jz+D<14AdyY5X5qr*8$U~>pIn%4SD3dY1!N$j_`05#~xkHo!?NhvmwGe8^|?% zLvLnBBGtO{HPY7K@%Ep_dwEzN2Qzhx*p94B4A`d5_An0(%>I(M?YHR9^7Df73;6SA zM99!z3Q^L$Z`sh+0>}3~Mqv9MuRp@se9ocpBdy<2zMan3F@JvzWf;Uj{6En4{v==m z9*}^o7mHh&k7>{wD;g;B@A-o@^>;dQx{u#WMD-~4k6fC_)k`qg#Wek0s;uh+)7!?L z_b(j|88$rhsv@jRI=Wo!((=4tAux#~k{5h;aLXI)FX?JBx}|BAT_B@RD#of`!B}R` z?667#wbP=yzV`zD=e*Jr{Wo3+FRwRCgv<qmUt81(9eE#l`mUfZ-Cov-=7Aj*{zZfI zH}dAazu2EjLi6W?)ZitvZDzvTw;tf}nea8IM@n``(5ejND_4Zi2Em$Y0HI76UL^*G zea`q03qk;i4L*i@IEGV+YL4o}S8`exb|M0C`_wpu8CHm&3%@-xmGTd{B8$r_k|?rg z<;|SAsoJ%uC8jye?Gf&*h<=?_HQ0{GOiwXF`!Ey5%5<EkNPG_qFzWT6@w1<CKn}J& z<Mjv-i`xB0H`rd^?tz9Z1xH5}GO$N+d>vOs?Dc9i!EnnY*%3VZ@zjt)N8jO#-qkm6 zYtwbe#LOE6e8xU;{+g-c>UdUTY&)iJVnTFGP+FJL8QhJH$OwNMDjQNKW`8AVtRj#d z6;hZpO`HJ!0hfrRien7DZ9VH=8mpXRZhoZ6;23)9U=sHLYzx!CLL<D>j`(o536awv zDtez^Hr6cibyAEx56}oOz*Tm4SX8kx9BZ`dQ?b21_IJ#B+x<jYZQfYe!EJfKPQguy zQuGBi`4J10Zl|GDuF}PbRS$C5N^ka_r+cQPN?x|2^lSX7$2%-Mp%^PNaB~#hYU?~; zMYGNxz`7^Y&MTqJ<<|4`mh^h;8qp;{_98rbhA>z<=0VlyTRE4#0qA!pA;quI=yD`b zu{A43`OmDfygkgfUyqnR{D}Vc;)x!Q^r8Nj7VjpDOm{=U27&T77*69r^BEo#i%G<r z<y)3jzMJO2ml<$jlSzS<s*-zo@Eg|}@w^i~SZ;kU#?@8>bj>PE{>`{#l1$Tg{_N(w zmcuAMvp2=eV|pbUndstp!I(Zzl+#Ud;QW`d8J!T%+0Rc7rkl840`V!CU*qj}*Hc&y z;D<_&UHKG`Gq^_{kD)ZCtRMedANP;ggt-E^%#tF#mNGE@`Ql$s)wR07Z!hvQZeP~x ztXezi9I$Z0cM}kdTMsS-1AVYdUW1Cs%JK#zd*I^Gd5ezX@mTbMKS=5B$JCO|wujO* zf_r8H_e-k8Uom$Es-I>DCX=R_tRE*Nd1z>-s=N9npMwU5hNJ-~s;Xh7l`Aqs!OZFU z?RdnrU3wG<9OD+!;Rd~1#1=U}Hi{A1{BH6$FbT+@e*tCQ0hkQEi2*I}{VN582n0Y1 z_i%IcI9R2xZQ8?1KmC!kuiyz9bs83U>LUzsuXbLuX>z}&QrtITRvsGYqX&W^w$*#p zMvUU|+wpFv=wT-^r6J5<RrEEcdhx5TBZ6)H@TClwK5_LcTh>;YmMu0{$0K0ZMi}`a za3_{Y6@j(UuVmf)y^1wC5?#OUHTp%zS|9C3&%GLtNaayV#((;T<%9{Ta&E>YRz!mX za_$%mi+K~$vrxqQdz<tzVdmE_<>RNrE;N^K>Y>EHb{f#xVo<521Zk+>)JKEo*`KV= zpi9XC(OMLuO<lPpW`HrJ`(!+^4(r#&$#y{n!h|B-Jkj?lZh<!%nn;O_qA$2>=2dYz zyLKBs+p6BZ>G*6hk<)Mz)|+|@8lmOS0Mpjy`ns4et4`Lp*{hoJmVdEw#{IQO)eFnZ zE2=c&iy8p2{dw^SgXcFZ1-^o1!t~qxSU|-(FD&1~=m<(2vc6B%SCH>&s5lv@?9&ka zI4(c&ankE}^C5rZS#MvxCuEcK7ey|Q3sQF?iJPi7f05^GbpEp^8i5aLmn>j=1R*(J zw5JZmB;mK8iEk3cUusW-dBw*Y)fs%4t;qt5!o!yfUwnPgHG_Au+vbXqEKbyj^1gIV z8$#iEf|$m?byr`-<%+9DYL39Qa7M7wT0oX;I=o5idZG~u2mtdRWRvyEJ63!u8pfX~ z1t!2+z74D(&=L^{_+yU**=Zyqb@6{DrQFzzn;lealnT>F@KZVpK<YA5K$)%2jA?@# z;^tSb-jrC)9@M4oVY8HN)eY0^ptRQcU+bpa_sGW%yBVHVq{!Ynta{o}H?gG-S>qP0 za5*(|n{A;e*|eRh+h5Jk3=uDXVXwn4x6Qq`*|K{)!S>$Bgx}Nq?8MuoVFjW8YXJZ6 z?6g+`vayxE!CW4>00viE0qFgqC{i}>b<$;iArVQn1ygFU)SkJv4#_Mr=&*C_uzLQC zGolRa*Ey%R;g2wecyxf7rgxRtl84TH)n{^#r^Oup5q6Tx1X=;XYXrP2zMgDKy&N#P z+t{!c{`T_m*qF2CfGT}HzIVT?WPWRFyw~}5n>uEnQs*|7@+KDUE!+_MZ~oN(BTD$M zUbFTCAhl8B91TNz?|%dZM!ma)<-4<G3B{GCRAfIir?%NjR|8aHnHsWuof<+S-nJyB z#9G008<?BNd0K2U5X@@c1xl*~hw_k?n}ld<=C|x#v~9PGjc@QaQW<UBGI_9!N+gmI z2ae96fUVUqR~U|`cB)G;(maKT6jkm#&dVYTK;<5_iXadZBwxGzLjVer<UW@_@>A;+ zI`y)zRJ<(9q(-n0PoGFP@f#f+@{Vdrkba-c4t&C##phy9>4eVTWhh%V0%h#0Hny#B zlilv8<WQ|sc$;jkI*n;RO+wqCPfnZV<((<6!dXZ%Y}?4=Q<(RKtY7tW#}OEg{&=k8 z+g#FF`~;3K(6wuH92#a4_H04^%%VH4E1Rwxb0Cg)SD2)cs0s}pJjd^omzRTFEPl@j z_p}DI>Q@sOgj+1{?$KpNemqKQa)H*rhH&a>z1LB8c#~=D?3W!+Ra$Y!)ADh$V~!Fz z)HBM&yjkF*LU+A|(fd96@}HSaZv%|f?KV%a*4(M0Dhhp^P%80J3FdX)8?8TOSNE-( zioppbIge_((|t?O^vmZn%3Yad>gzpi6KZ&o^t(g;k{~*Z%-z97SySq__nmkP_Z3l< zY007zEO#YS@67kt#Nw468&9}#yyzX?ym}F-fb3VX^Ih_{7?s}BNpy-#3wH4j`h#oe z9|^YE#%{j*$qv3;sLQ0c_tPN~N+C8i9rnB65t19P0><&%PrmH0`MtBDjAF}*uMg6m z%B-kKP)G+LIzC<wA04KxGi@F_x;neKa`~QMgnOO9<)1A6NFh%h$E`|FB{v3TB*)Kh zni~?B<(br^gW%*T^D0~tdt)mE0$EUgmKR<!eit~8By{t8@bkxWtD{Hy{|$W>b>mO} z_5IU}{-ZXDw%nKalW^)Q8yg!|`gbIpV5l>^@qLTCAeGO6b&0R=(&FsSITCnk#{LIB zVQ@_`plYkn;v~Ctb45wz22Kxc>(?|m{@k!W`0;`goOp2Uq0As&$%FbkLbOiCfk(eb zsjI+uwKFX)f+$9sOzBM32Y@*<hmR<}u_pCPQ+}EUJR_H`u48UgwC@bU|K11x%Zpb7 zREpAs&?w+zE!ZKqo-e42o^9AYJ`g@!dp%vtt#94~>?=qhu$}>QOKz)|b~+Bh>N(aJ zo|x}j9W5p~VVxxE=3J;?ITVQSRl~f^?=vYVb+7;Y;O}OL-=Z}soD~G28AS$1%2n?& z&hPMqz{xCv(t18J@8N)LK`gEfzLVkDASQT(2PH`D^)t<|$<``VS80Nh?m0x@cO!de z<D8cv2S(62pET$nP>hEZxD}KTd}VV<*e!pOCI7bg#f|?B4_l5-@LeI3MHE|&Iu&d_ zl7hY3vEp@&2B&LIHr5D!^gCjfow#%2NYcm@*VdhaJ_*PAiS+hHWWOm-&E2bs7I#ML z>8hplK#B^sj_hUH*DK)AL2JyTP7>Rf^^%?#AbJS}EOKqSL7guM;NqA#w*()3GNR~* zNgCMa2g4{D7$9-B0k&|npkjN+#h^NrsIbbBK#G}dA}Pv*b7kqM)ArOEs->Tu&(v1Y z4*>RE{enDjYUbU7NclVWW2}_=J6@-g^%#lI!HuD*)=>|1R}jbg4QBQNF15g13AZ7+ zy2Nby?nPI<6VHju^N!LvtJ2q5zPih68zmAm^VPXeKb9<224mL4=I{gj;Q|FwMWcE% zL8yGl9|iLW6%MO9E`onlw#ja{qik8KgG&k0?9G|PAHTn8TBG37crjacDIt=jZ{Peu z#Sz*Ex=ISTLqt*Q7D5k{hbEPH+u1hCed!?QTGpk|<#59ua1hD_d=)t1uBXId%eqb| zpqccTQ6!4%zTGJkrwN;Z+nlQVA?Hus$woKP$cb*wjN!gp8cKtRSw|HXGr};LqX_!% z3xk6Kin31eY(aODwGd|HEA$q@JcPq5zK8C9IO^+%;gr*9(E*J-#J?olF(&|P-g5>U z@d3D|9t*Ob*NG$qrsRDRafa;kh8t7(!z}CP2gKq77om<-MI2BFacOZ6SB{%U$2W24 zGB~;@tJD;XlHqCZM=5K95M31PUXo-M;IW5B7;zBO)1b+U#9~{M#<p0`f^S|~eqtS+ zDe6#B?*RXiR@Her^i9H;?E&@Z(=c_6@ac?EOs7#r$bXb)^GsqOch3^@cR+#gR$1v^ zzTegN+UfPZd%WMgv2L)e!C!VEV&?>*f74iN1N^dZ5AzWO-AC-sQ!#r{_Kje*>46_C zVCEvvh2<I-tzEV2eVQ42(%0GsX~E5$MG1i~M!hF-J`f_)JRpNHWHsGaT>Dp^kHP$q zyJGj6u|QL;$Vu9q$<f$vnTQ~igx1<P8aw*Ij*BG7Bm8qgF4B<J_7CW;=f6y>BG;y^ zWUx3?L#@;^ggI)G&tqC29Lx624S<ta{>z@T&Q(QJy~S+v1Ua=9Vs&J?2Sp2AO92HE zTN%_)wn8ZC@h7JN!_+ci5E+?zn|y?VkO#ljeC=Sx*UO#Bu2A#J2(aHec^xfW8{eKx z%u%mG^BH}+JzwJW3kzvCYq59zAU<(Gd`3BP)L;+2LjxI!XgdczsDkQ49y*Vs#UeSn zsOnd8KR}6({CJ8q$uKM4DXS<&(GA&T<Y)2h6n2^BFmOd|!;{EFG<O1IyWR`ju#kKX zLLOD#$KDA2s7i_bn_2hD*m4;nb#iW%w@)gB;YuE!akfy)*NrZ%*=^lK$e1APw9rEI zi?pJ=P4wpD#kRi96Vu;AKT1{6HTL@Ry;c?Y5?UuKl-EOlhv|C-+i#aSwp<sEKg&|@ zp6E)H^sT}5SV7(<M7Px&_kynYj3QgT>lfltCo$!VuZC?;>dLGw>r!Lby8&E!&z_J* z#%kM3`0wpXWWPTh<BqR5;yP2eqS2VJsKnH=h|}l6P}AwAI<ul!fsE9y3cuz!1a|`| zDvvEw4?{&WQ!jNHfT9=k?RGk|*|?K@n|!hm>EM=*N#OZZzyDZ<0O@91TJ(DKzeHy* z8}vnl>;IlqeXjtmOTuWZ9xxNtKcacv%`dk)ZC!E=3p;sv1)$R-w?$;)*{m(=5z3j_ z*%eHG)WLypHxw~1+LB@%FWDMUQ!uyg5kahbJN4~;zVV%W>tJZ$oy7D7#%GIm8==$M zhhij>GNf1U0}l7Cz;FvW@|td<^w@sk2)%k-Sq=M3p8rc@xKsc<R6aR}nnMw2%?NnO zgJ#f+8ztYvvd3k%*H@U7;98Kq+=!+h2TX?fR-4&RhHHGgx_ro^MJ+$J4!IBCohZq~ zf8TNp(hXvAZqzbqv7OqZ@+>dYE{c(Bmjf0<3~-UDL+xJ^y#g_(y{QS)hQMwn<z^4D zSlQ*ucE~QK(yZ4qOW`yy%kuq8a*l#>eNPk*rNqNYgw*2?QiN73eBx1O%%JR~n5iw# z$u8yK=&lJ87c5c+_wWxqC?#$t(3SS7zJrG4kyCt0-#WBBh#`5NsytKg&qfA`u_w*i zd&)5nAsN)t7dj3f9wV6gl?jkVTph5@o*(8E>~)^o33#x(c}_^4#oXJeIJ{8R=I`BD zOd=bj=s-R@lCCki)xVB0da^`FB4J(2(Z;!TNf*^@@SRgp0W}nDTOaT1g9x9uJ(K`+ z7^C3puoSldRC);u6F=QGeY|t8@J~&MT@Lihk0D7>Y5IK-R_@~#<oHPPspIc+e1~gy zk=pTCMpaZj?GSi~CN|DhlofB@PB`(zw4I=J&Cr0*=k*j6{~Hul4phYnYu)hXdK2!8 zr8UR`b76=YSOC?om1pn3Ko38Bswh%Ru?a0?ybhWsfabnK+J(7EhD=Gki&jE}ZPh$m z9U0xelK8dEu&KZquWX1!qN$9`68wdb$NkBZdVK+#-j{TjH}tPoki7^G`rv)zZ}#~M zLfa18F`{<n+x$0Pwy~i#GC=Id_Xh_3?b}OM5x0*H_wA?C5kVBJN@Dki%t~MOfgK4d zIGdv3b>*nuU?TliOXuv+sq=8UFt95yoFAVwu!~#;)2R^4uSk!Kwo8joAg08>@lnSO zwBvA7-z1`c$wc99oCVb=Z?_7@hMO)e9X)K=dF{eQPksq4Kfc(D{x^fpvFsl?S;EKo z)<3|VDjvU(P?Hb*b})@E)92Qrp=Xc9&)+SyL$55*8Cp6g-Yh`zIxLD=qH6^XU&JcC zOzb~ARLrSZ!dPfW<1Tx!j(Xb`$HYHO$ZN!Id9);g0*^q3V)CUaTvNu-v$Z-qai^w7 zNyWUr-3DU|9|wwFOWfVvm3`JB`}!ZeR_<WnvAV`=b`s!WJnniAX-$4y*1yJv-ffs= zcpUEatD(;NorTcAexYNV4NV<q$WNa_>rdxKjGME3+Rk|e6^>iXk@M2Dr_4>t4tS5< z&0r0U#WaKVQwO|4n7JD+V>NdyRM5{41X*Rq#az({Q_XGWsiYgvY&V1g_uH7_><M{Q zB#r&HdQ>es5w)#;@pt0|F&r@dGQzBs=R8UwzBUMb{(Ypek;w`hr7N#>W!4NGjG>x# z-)d`F+XVSARI*;aFfufQ&$>dij%A`i@+xX%nJ6bp8e?YD9dN0%Gz%|r$NLx(d6>6M zlKIYVPH5FB{<TU~Zs=D7;pvZqro$w+>huW<i#%rvn3_|P;`!V9MAEJ<isLpX{;{=8 zvvc*6iaIAy_KYM<5PfGc`XqW;#zUugz&8NnH55bxQD2pf0X10}1)CW#V2lF6_^%)( z@-L}GeiJ8raJG8&9g;)M=%SKv+V7ySP{{i_eFu*%QX-a5W(aZx<K1D5&NbEHYlAf$ z2_%PcCpe%e^fF8%5o0vsFO!~!OTO#<K&i1n(!D=#ZuKgn?x;QQbMm?aZpi41*z(z8 z*+U_9;t{AghL~m2t&iL5z!W1~w)%0zfpl?)?xcgK;3zW6^VXKJ%Q<8P_tgm0*QXa& zAxyBqsg)f4OdP~5OYF2#i`r=h-x~6K2I)t=DtWfuQPM+Y&|U;*z#BdNm9`b1)nXea z9{O^CY?TVY)VBpT0^<bcgrEWg!>)q`c3nwsd5g2ey9gjY#b_9OPCBX>rJ=f(Fn-B# zf?{wmJS8)g?CX(B@9(B|O%oGE+vJXlUQ@bExheg3H$psad7A?nPBgK#3YX~0&lo5= zzVIm&P2bQzp2myb0*v>z5<GGq_up}BW%YmNFo$<LUjY0-UBw@I*L1Yd=yJyd*xt-; z55(lmTJIkm1|S_?0b5jnlJQm@lUu+(C-&fQZF<~r$9b;B*38$g;3h~J9X$Qn?2Xl@ zhOf(M>NjZp*0sq)dD7ka-&{#S?3U5dKqVpE+cCbatrPJ$XhWq0j1+6VU-JAX!V*6; zFVR2y7x4E9uL0K0y%YaE#x<9c&t_RBe6Da*vsQ~2)eiRw8~@UUeahn3>R=XjK)n`0 zmy3MpmU>{i6xUxChdSfPbIWc%iv-ePP1PXElD*@UArYq4O4d~%XU4E+z41{t$MDdy zf9FR_!Cf<VqfJSGIEx5FLt+F+4&s1@@V6u|J^T>}$oRAkN<j8TXmL`B0rW`q3rwtJ zZmzNU?%xPB1}9>enp%knKW5K$sKUTSzU9%JeJHCx+~Yo4xNXgDk;ZG}7-_PJHF1i` z3Cbd{)4!O3NVU<0gnjB4bgYSFpkNZ;O$=<S_hGHz+bKjffFpf)<p|esd0_NVLx3q3 zh;;}e?1iw+^J3-l9O*@`IXTbQ%gxiov|y^RMdnsW&xf>kp0f#eOOr5yhu@{m$ghFd z9k>2l3s7xzyJ)qoztTFxa2YuYym9^TOI=3DyZgPdN5=D_b2dduS)N9o5cT(?ZShzx z&I&k24IgWO`;~T3SDZd3HNq=2uUQ3Alxd14+0>scb~?$k$B6W*@g>9)JQl0?Fz*uT zr_8ij(Q)Y(hS8%)MU7VaNi0oL1Q*XDVs6oM;#v_~m*+p=Mp^~zcj6Tvy`}MS8bkCx z|CTfQQ^eKZCuzjnUv`TG*_v_fa{wnSah+$y)`oQ%IA>kC7e*%;u&N@8#sXg0$2%{h z4nR+F%>G1K&gRA8Zzuc)Nr^nx7-~`qS!mB=OJ{kHjlJT3(wXgM>+z|oVc!gQ<8IL^ z^0KRrb<3?Rxe4xtaY*>}2=WPyh{(b}ZQOw`t&SPo93P`K-nmA@*KPXAb~BXVM1-S= z8pyA{LA<M3{|Cw6?ear|Cw=Le>!b8>`-EpfulxWLm&1&Xq{w2ErH5>6;fHW~pG$r3 z!g2krjrzI{zp20XXs{`uFI&=L1U3#Cj~hSyK|bsrFYS~RqsySzYv$Z>`Z5OrkH}9K z2yuua5Mgs+!Z0lh-1}5h@XYbhkRoNcm;dPyVgI55rSXwh#VZw%S=Eh~;J0rX-vZI} zN)uOthKK2M&Q87wNrM8HFKea099?-IQC}4`{zqJym+zlp5k8r;^e54N;Je?>viV;2 zF2e^1AB-!lS?3ABdQba{e){o%*?G^HB~+#u;`X!{HCPeMN=##)5lwqnA?`_vL@pYA z>nzsXSd4efpWJq-jHbB;<P%I#DxZi`2o+DQ5GRNb#7<>EbnZdS%CU~anZdK@Ct6IZ zK~2q(AyN`aJEa8zE%eg-X488O(m4)Fl_;A=KYsHCR?)co4Dw?8Tio3u#BWq`&xIu| zh3ehA&#DNLq#FJjx-!Bq{a~ilGBI~ifxe%3+UyhV3qwbd<4dxApMUrvL2CPfZ@x$s ze7GaOC$bz!G8vQ=#V$VAkR2FkIsawtx!jaqJL^$xeJI01gvA;tV!Z+jH?g+$^F)m< znL>RugN5&^r@`WKOfCk`E=BYnR{zhP6?QO6v6Z#up}zFvcMEHe2n#DrP@n<Q=K^-4 zbOfSUhESrFFC-Nbc#BB)B<fh}!8LWHhV;8EhpHw!0p~8~{Z|`(e0niY*d4|_9rG>% zQC4ljA9m|+r!eS0IB?&AX(fwNBc|w^_%jWSx>c*#bD!izVNN87%C^(-@I2ms-NxB& zA`Z7J>${6zOm@r)s73zHPpVFdN7jZe$8AuO(^xsxfl<xc>cihh$djD!F|Pb|L=|PG zR&Y%n{n~xH8uz*pL5skG{>$A}A+jIpr8RohkgN=3$Hw0>G8}1jF@^ZMDV2g)uyzjE zX^d~{+7jWmE^QEHd>!oMB>;7rB|F^eF2F-^|AbPtc}|9nxns6&-P&hn`blE!M$s;L zF*t=>HgCB~$n+Bc-oI}J{ZQxcjT|&KXcghWl(({_D?$vJq8FhmkeqkE{g!!6nE7Yp z=f=(ZxI1UD7wzw|!<D-qfYR_Nsq$P7KnJX(5nwQV_^vu|Q{rOr=t1N=qp$yv|K&@{ zBcKIDjro`;srB`bzA&FXldW8U=p4n})F9&s;ICD=NR&*gX3e=#7#3{n=*EdT;S`ja zfL|om)zV3{Tk~%gY$*I7rp5Iwgy!$r{0~A5mL~qk03)PjK;VNvUk2i^@KwSve3J5U zbIaGQx+l>_j2$x<v5Pynwo}Vq-``Q3D*!<+{|PH4I7*GZWze>2l;ErSg{BsE<A$Hc zB=*D8llh+c1F5?B3&A*~na#a3VhFia3&n7fCT?+=$C(ozpZ_$5+iDd}Xs2o|bbR)} z`Adz`DT?f-$RKDR1mWr0-W{2etB$yl4IAu7)jHBz&9%y7mq18xpnzOpob$agprx3X zd{4{%xil+*L%AWPfxFY~r?fB2tOFm)XNAL`U6Ki#>N#2Wn(Cua3w33UcOZAtTf&T5 zvX>;|MPYfh7R`!P`_uHD&^ib!5n+z5wK8AXZteAxViHCJi$yvMJ@R9dap+vjP*vyt z;#zm&0K6!aHkx&xu*uf{4tahHn6tP~*rtre^;f>_ZULYLkr^Hf<RDBEY1Ju=)Il;m ze|a}4!QktS_2D)wE$w)&wYad-d9`G6j=8h6u<=)7XBO{fR*hvIkBYs*yci&UBpv^} z#Kv<w5&CsOL3QaKzHNQ~em$C}Q5A(?(AMbisxlS>2Mg_X8Y`Dq&YR93I5%GtNNX0{ z$}SaOODAMm;NzwsxNrGhOxo+*ic#;kC;9IPH3hcF84xI`<Xb6wODUrN%DOUWMF%a* zSGg-*qLk><LE<@EYck}S7}UJeiihX=rQcU*4`DQeMr-}@YpCTR;#DUfLhencdc@K` zhJ}yYATcK>@LCdQW$`|@i3~d_-^TbzH-$FtRuNcaiPY!ZoG_-2r%dfkX>c*+^h$%F z3;4vIx>*l(Z%*}*Wk;SopO7B|7uCz$N6;5@Yu(I?p88YX{lZmZ|6NAGuk%+WeLWO- zb6TMuPTYSWKviUdh#M6pk&AY8HlM2_mZ#~n%dbu#o2E`~_2ZUxw=K3slM9RFedF0D z+#L<Zw~`1JK9oMshIP5?jwmiY$R`x&s>r7Gq8eQ8SRKJJ-SN_t-sh*k<p600_TkYH zw6JPp<v+?6^*`CN<UO1MY@9;>h@+O_qmLI!`VTPxjWua9rN=FV2138Ly215x5_m}Z z<o84G41_)z@wPcGrf$}X=S$(Vql64%u`v789u15DBvtg$buJFAezGs^Kox~?xV?iH z8$bxR)_-aR%#I^Qs&0lzllfB)UAlg)V;0`Xo8(<&3N%$3+hPQfjX=xQK{KOJoMW$O zkH^VY;rEB?#E|027!$vw71D~tR0S%g5K;15E6;a?>MEV8yYlNbC{z~|S9=3fB@V+S zR`*}p8{TfuUVVEQ)RL;Aoa&<N(zHsqjRdj;@b5x5qJQYe$m8_u3psyVTdF|j`7;~G zbm<vSsLle%yR9zMA@6;%{PZl&Z3^twZT))W?Y(g*@2s8vjy^i*sv=`G9iemt)vs-b z;d~EGmX2;#Drza8L|LUuGb=XZ+`j@U0oLQbOeb6X6xMV%WMrp$iDN)qZig#PF+oE< zg$wOv6`$EtAXO!k`q5$|gS9H;fKss))%t^OsJPIm#hi7HpI!gP{X=IU)mlgaoq$js zHNol5OSv|<V3bbX_gRt`vWvft582hY)#;xRS+TRumf1GekiI!x)EdsRiwz>QW*w6> z&(kLoBA`UM4zjmChGA&8A6`1Wn~6BWb8l0ae%a=}jXKp1+S=r7UL%bX5uvirU1*s| ze12>X`T{He<tLJhKIG7D!MgG8rMh|@<&f=u3Kwu{m2-sT+kWxT<=|7Im4|x(c6i<F z)F>qS+S39pt1dikPRi8F^vfM#+om)kXxQ$_S`*RJNDNXhOs%NFMHMGAi!PYg2@hJ~ zhN*$*=`;5ikG6N254-fDr@z>m_ax+RNXb|ha{q>!+dl#mhu35ErVJ3u&8~Q`$>lBJ z2KM#FM*pxd7fBQhv~J14SW%ri$fV9TXm;iU1+4hWpT2hY_2nn|#+KOs+mIni=S1dL zM|`KDz_&pdT+j1(PV}Ms$g1Y^mI%}}uUF>(mQ(y+Y2(kA_D4Zz?U{b|1JO<fIm73& zKhyivP4q5Ul$eccqyaPAiiVWET#5=BFyty2jiv@T40e6rW46K+jIx!>)-P{DZk@08 zDnkXy!7XbntAFK<4rqUCo*YUG*c3b`6saz@QsIOZpaw_O48B<CxeO_l<I)d!hEhFF z<m`t~m-@*QEm^6agf=K)n3)TNUY;wHZ3=P)vF~axhQLHkXO}Igp0YoqLUuFR#$#m2 zv1Z*a(j{Zjv9&b@V>Q`Skt07FkK?iZzGO)1IRnw;yPL>@ZvSp-d=>^Qg0b+ome_*p zM|`8OBvoXigTENK$g!6y-k6|NVS#AxY|*Ia5d%xnd9CG)>e2*rZG@Fh5OSg%x|91$ zDlrgUB+R=`Aiq4n`&L+q-8U{kqXCN{<I!cOeh@W%{zx#elv6xXb{gq(sE>@_Mo?(3 zDwDrX>|*$^*%-07(?6jcrpJLy()31w{Y#lq0;(DAc}XSPKp%fmUOEQdrRFevN?v$J zf3xzN-)(L5`U$>M0Dska^!V$g`gc|6OndZu!*yZwUOBfF%M!DLr89)HB%An`AJgF5 zHN{rbpA}e&DrH~nk)qg9@bQs@V~aSZ1kq=5a!6_U?^b_OLR?P})0)gscuV-LlU7V@ z9&|pH6`~e5<yBEzcp_XOE-zLw_*Sg&az&0<;URIrR;G0NK;FUEl2n(~n4aZrcTVU} z`Ggi{4^Qjwe-WZww@pR?Lc#s?W#ZK5S-`28p4%oPsg_^}3_i;*szpwob~$0ZmFHmF z)w3!Tiv$&rSxFk`{WXAXayb~j(iI<!z~B}1PUC#qM>IAmZ0y;s+t|R;&FU5O2v_NT zANueyKc=Vt{r@O){}HBTd4C`Tg$n^*KwDAv9NBiU@gmC3Yu(HF;r?tGa4A52WtTs0 z%d6dwOtnnQdL4j>@)YQ{nihv<X9au?z2>Q7bedcbykkTa53hJCafwm>uF?1hz6}C& zM`!E+HM@eD151M5OhT{6;(MM7r?Mb)SI=o?Ak^T$M=4;z+2RpQ#O(U5{o7~y5gn7H zeit31ep=VWq;FXP#k~P%g4QlfLi%QtSZ2kvYPq*bmlCd8%6a4rKZkBdW5Cvo?bI>V zK1uB8cLt`}j6-Y3bq2w=gk1!nL=f2rB4dzL3)oK_0T>SzoMz@t3FVewiXO|Jp>%`F zvB-1cc9%IS*q>Z${OqM^sGxj@|C#u0Q*RW0)P=X?Oo28&yvWmlG(25F{*g8I!p-Sq zawIW{<Gsnp(S3-f(qrrWsEU!Kzl{mrMPumawUwXb`MW*mz@aL~?}6j~AqHOvqsQ7A z@^$W4*P=O$_8lL0AKI0T5g={e@CCrk9v_2s>@mX~#9rx)$nHEV{~VA^Jx@R%9JE_k zAQo@%+0()?)>ar@Oh~n9#FWB7Ds}uY$z%aF(4pYgRur(;K!yYAiOml|{va<YJgKzq z6W-GH4)!?}%P;9h+oCmhUTLX;G|u=zCT3cYRT=c6k{Ua$<e;q~^TJ+{fUi&u?g`BE zY00u+vDohtDTV3|+Hd^=s5h-R;g)V*&jM{HKmGLOldd1jZ85oAQk0{6QbZh$fb4g2 z@Eyr-lySk14#eL2+z*N3Yh!j2q(zQcw(5xyrco{d#T@$zxGQN(T`M$jQ$UgJdPOfo z>HU{s?>i6U6StTYXjA&~;&9BLgT_mPN_YK$w;ii(@??8DSqiV;Z!ROn4IL*}W7Dn8 z!x?4=*|u>c7&vCo+8RrJ6XSP63N`pxHqRfKv-gTdo}3!9>2b2`{#4rMatokWEj#|Y zH3GAG19UNE;fpY;KQQ&dD?fS(V2+Of1VnC)i-(I%ZZXl(whQ$YRb2I6H>ZKvubs<% zN341N{QRZSu@$|k)SLfA!-}Bl2V##w0{XWl2-?7A)$;9qzUY;@@9BV(K7wVM8x0?u zxu73ZQdVz;@tf&pSTPPt2$tBVVAEdtoM{_pzl(rK4jJ_3zTcJr)cQ*1VJXCYJP8DY z7;=Ig>l?-gNm&%;_aH09<5FuYaR~9zyie_MG0MX-w?02;VYvVJ1=-4~<A1G={Tb14 zvAH=7`?iPATKC1&k4yv&Aw<w+<pZlhy@o}pSk{NZt_K*Z_^2e{&;yCeZPRcYSQvZz z0YxQ<$Xm`D<(1KsU$%OrNj)t2zdd&H23kCRHnjSPyUla0==MKBXK<c@<q0N6B|<6z z$@xmTsg#R^{zOT}9bC^;>#d72ka%*dSuRzLp|uxnYNYQXr|G(7D1^nAllxstS&3-p z-L0;TR9&2n7;Yo{?fq7Js`m({dQOBY>W?&tR<OeU4C$3Jk9&@f-?NCNPC~#=1y+7h z8t>ISMx&LPOQkUTcH5Vho!Rr3JBg9P@`|t{kAB*b#Zks220Fw)IC$Nf@~DI;Eptlw z7Uk`rs^ND8YjsvdSd9&p=sISiaDC?DRcF8zDo*pf8FJRBCz^M9Q=Bczuqs`rolc1< z;qq!iEMa~szz*rL6vv^Fj{XNH%+G2x2wP}^Y58+NM{R<#R8({@O>>qP4}O_b0Uk$l z8$LxNLLgnnoN`v{8tKw;8EwLW&WvU<RZSUS-r#_8d-Z{}n!VKx(i)uq1K{E!-5YVw z$~n{>tKO8ZG|%ca|M0$he%204&y1-G-?=zFDHZ5QK`oPu5W-F&75xIWpCwzHOp6|} z+q!v~2Cbg>xQb45s!Qx8#F4*wnJv&{<2WHd_(6%<$Vrg1yCLNT_OWb6YJeF!1dF{b z;0<nFTg_SbYhVJA=v(&f{R*8Y@2&p+*M5o;0G7NcJ2&6|<MH@^f8l@hXQ>IAxjV-9 z=WR(vJnOv2h8~AzemcF%@VI0ulH#*_3dYEo+I(aoph04l?E@tZJ9j-I;@j4cev>jn zeR?h5+85EM0MbY{(5A*<$64d4>S}wRY>-Ae{JdF^fE^<DC`)6Gujp=v4T<^=-NduF z7K0bl7_kS;EIKUm4AE+(M(vOJ@b2@pJx?1j0o9TRn~wpG*qCVz)@V}Z2#{c1d_75l zJvVJ~;}YFh47twV=^hr1{bD8DS4ZBWG8LLUPw<ni<Zk(uuNBC%G4-OltDDLQZ~S?K zYISa8Wgbz#_&#e%_NRW$q^72+8A%F4#B)L?r@jIQ^YZ7Aiq*BUr|u%oET?EyHrvY{ z4r>+!JcO7wgSDK6WZxTK2!m>g==b9sGx*(Krjo-8K`V_ftb<fT-E_ML`Q>iwetc!a z!ujEAmIwHm{VKDyWcsp#Oy&LK;!CLtdKMuMxV-W+!f`>GV1Wcx;9%6Pr3XQam)*l# z#9?zZ%R)gq@R`W8Gjqs{uv+1!Hf2mq$y6lKa6k5B0y_32sspq7n3BQ|^f5Qugx^^P z@Vv4@HFbT4fOI6jM9CXwKaX=hfg~Dio$HG3?8sn@4h<_Y!CEM5<cE<mtfxjbZYpEL z$Z$M~cuv@>0tBsTN-~p)IM3<RCdM+Yx$aN(IxXKqEc{0$n-h0jUgV6_eq_&hhghi& zT1nWrmP7y@M;{<|%i>-oeu&9F?(3fQ$v86kCdXxbvdCq2-B-~h=pFIN!p+q!(Zw`H zm>QCtNs+wn?NnLEFPOa0Y-xKmfK@Teug8M5Dsg(ts(9dG;8@-&H{0w@!!tWDB|o_T zi;Q(}cE;EVA<BjXa?^*XTrTDJira0T@@`W9<``H0Mw<ffUg>Xzd!;5Hz^0~`UK_mq ze+TzJx+(vpKZsTmEvXQo2S099UXdGqeKt$)dvyieQye#`wGQlwMQTP{+a>#g$q%em zR?b=|WZ;v<1-g^M6+7szUHDa(o`tDnR1R#Of?wz$Dn%6wY@5O<Qtv;)QhrCpUQd@! z6S4E!_&~(9mEVIjRFKkIvWG$FAZx;2u$K!ZyZvj_Z%kMT)_-iQ%q8S|!~yU71je8g zA|twF>$>&&1y|`tIsLRFb@W<O|BtZU?$N@6X^f6kVvTiw=DDI7=EpX$*Y{q@u=YfD zW9vL0ug&U=Y#090n4KxNll8LipJ+in=pKzaj4XTzvo9Yir#oXmf&-5$Xm8Qw>VJlh zWS%za2vmP-W=<fm2)+8Cy?^UT{NlCN8Uh$TNp+|p`PlxN_tNB8JFo(WJm=b(65*uN z-@lT;?`~}y`A{gH1{R0vPV>pHB2gH|)l8^+s1Jf=o#Vj)#Tik%K^($a7+r~jK|K)U zXt#AZs3opN;7R9?fmDq8KT=!82W;0)_5;GZU)R0$wOWgm)(>@H>#i2Pswb1yleck7 zx;eXO`gMYe<sIl=T;B98i3@#XxxOh)F><PltJ70n1oFO@y_mW;gk_I}fRzq!id@!n zi%_D_Uy6aI)H|EPjw16RIE8MhlLS3v%3c}Uld7R{yB=6rUf@xnxem_m(o9`(B4zL& zm1tsIh~N_p(|4Y$TX*K->OqD}Vob$blm(#zY7Habin&3-Z^V^%ufHx6C7+C>yQqx^ zPAa?64P$DWDhNo*V{R`OZ4UjO9Sp5Z!%m)WIbq<u+;qd()=y`0w1?8S-x`*h^&B>R z*>BAXAT>kT3Czb`^*M@`2fy=Sxkdj#RMEusx-|>p`gk0k>2Va}eI4#Q_!av5;kWN! zao93dpbLkpU16;MwdDV!VgEm0EaU(+{YaTT6@aRa8$Yh3Y_;Bd{&6=_%IlvjT<jtP zLRM4Saw_6S3f`WikFc)TJ=*5n9*AgY?#-iVlyw4rgBSidzG0q@V?19YdDgF<nzR}S zU5g)*_IX_eKjE97+sIv}BdX_w2{MmG!p95MK?Ik?EBKYSh;6agYJ+OE<HK`Ns=g2d z-KTg~-y)O_Ser3mvX8Qni=}ywlX{4+Orz9<+<I6oC-T?ATo)@7(6gZK2w(zH+S{To zG{MHo%CAGJm@gPgznj=V$@vHkO5<)dS{e~ApY>gcZO$oK>QK^0OEGUgyFw2eNs@fD zbuS?i{GjY_lHxLw`!dL9ZG^8en;1tAg4bPc6Xl`<b&D%y-N)H3Q;ch|1VMbar%YS- zZjFQlzMSPXi7gvy1nzfwVj}<W9sPU`_47%1m=uP={Mznl9Urx-m3GMy!wvf4XGlh! zc}Rlh&-bPm@)nsY;vq`c-r&b~NZjR5n+>>T`(un3e+W~>>&8_@!1cpQrjXLf)Z6F3 zvS#Gyucv=Bs7T1sV8hWvE{`IB+6l)3wVcw;A-3#puGjY6`=&$H_=JX;;c=4&r{IUl zwr7}nudKu)n~5!phs2E9^D;meFG#{ZScxq#!qM%n-<}~r-sS-vJcaq!Rfg(xq?bsG zo{-~6Y;rP8!w3%{<iYKt1}||$@NTHUD}7_YCNF{qV?zO(kBJyJO^B(9*EG4Kewjp< zQ#xtj#9u(LCk6yspA=}#L0BPGc-;{%q*kz>b}~6Dhn<?1v>95`F}Xj&?4X#OjL*J` z8#p++Ab*Gkk1&SLXbNnK@Y2(7^7D<SXtF3^LHPOJ;LksWP`DrW0Ic0bEVj=!unb23 zaKl#TnGF6nT=a@d)}M;rrf3-U|5MRz005~uO12uX{alI4{+}WB@i4~c%nNG<<-M&q z!P7k}<!`2SR9<SD)JfcptoY>`raffVgjvl|is%+T>RADD(dy<)0RLPA8B90@WWl*j zm9}%uZ2^?Ma~!Y(@umSV#sbQ05V9U7F(eH^<DKF`^z&E^ja8|0oUZ!W0ne6CZf3Iw zZ66}l{XDD@euk50PIP{ZJymyS#LLCtZNU2#3xi-ShJl{@^Cj%~=GR6zJF^967Hel` zRr~SuVev|7CV|3(QikM&=&WVY20o3v=_yN8v0u`8QMnLCGioV)?yw9ox9)0*GbnsA zx7dm6sXa~8B6HUGf@034uG`Vz;LEvek{%g485JS(e0>8<a;ABwG9v-=ZteiR>H1a( zTeXE1$uE{sxco$Saa;r8HbQ}nLiX`{q+8~c`K`V&;DP|M7k^~jF0xX1EDHBcK<E-C zkJv`T%5-M@#XGm5@=g2-LRqg?0;OMvCCux@v|2om{Jn%#A%azyHFiYGtsC}mYly<p zEkTGftM%yl%{0MVp=C%hfMHp&m;Ct?4eHqFA1K;=8E<_%TBnYJ^NIOX4p^-SKNr2h z>~pt3;I(Bh8THel9SV--ozm-@69l;%?tI#k-U}YAA%|y;KIdWei|#E=wz@p?iIaP2 zduNX!3`mYk4u-}sq8cz3rs*z3%6r&H^gm(|AfHD#h#_AAG`4p3!Y=detZ_L%{`uAY zt-pYHz;fGuy%}BN#W#5cQu@qEXCI(5kEgi!Hajb^xw&HPaBtX(L?z5qR3T0R0o=49 zW}$IP_hbydHih=Nk1aL>t1?4EQNdmZehGznlw_agxkFnrZ=>`*A4R>_bSbaD2scT; z{%<Y7H~fDa>p6d7eX!Ip>;EU#J%EQ`dapz6&v@$oU*qZhy&a%6e0_E9q>t;>#R{^m z0Od~(qL?ql4P9^mn!+6XAo;3gi}N`@|Ackjl3XFNg&!<WKASuW^#PjPXSSGvJ@h)x z48%ss4B$u%SZ%~{Zx(_#3Xx9529g?zh7<0VpN~f$*&JDW|L;N$z5~rEy#oxwrn`RI zWkeVzutX&#gIFn7rTwKtW(z%wqhE|mNDb}4z6H^@epj|plor2@q)mzwWF~`XO}v5w zA_z6bH^pb=fXp)vku&Z*>!S(XdFfDse55sI<BHN)T!dJA`R07usZz6=b#GLk==zE6 zOV;5ZX+wa}u!Z`hq4pSTpVNtDpVgI+hD#8U%Qw7lNSQs1UdN|P7ZZf;%^#S0n1)(= zUcgzJ?d#w(Qeg>5q<$IEhB{d?ouHFyKLgD;KmkXKyfG**yzI~6p<xAm$9t`yG8x23 z1@%B#>9<<Y&NXu-^(t0(&-RoXZ{^ZLw#9y5mu+p!B453e1GwWtQKg+^HLIWd6H$<F z7W(LNYR|eK`uc<rEpK$7*DR0!KC1~US(lKm^v~tA-YH2-y<@c;gD8(}jbMbkmd~6I z7V@vmXW8n>kI=IX8uZHB%vyv9Ek!Iri<YVS>`k`>0Y8TDPAqV(#rD>m-Y;vh&u|TT z=MaaJ%8ehPjiA@7KV5V3a@Lyf9oy%Y7a|-X%z)T`iJ;X>eW(*+8_~Z8V820QvJIp| zHrGK-U+4VHm=lZn;o&Q%jR*W&H#^6@4`<c!!(Vm?vDd$FudruQh(c`ps{{zDHg~um zONq(nW<gsbd_^h5nJG6Z#0cjieECmK7nr3s6<Oh1Pw@45)C>;^ynK7-Hb-N8jyvK` zui_6%g;D?A&ew6H3a~o0XPd+U`D=Ic_xKmn0^lACU5!7)GpVlsjo|~T{&mi>=V_I` z*JaV?yUm_kD-waz2SgAeMr0(k<fV3*k>8J>{&a1D1}P;l5DyKhec9y94mw|TAM*I% zXPq{CBsm2hj64+bDl%@{DUwT)g8&3qSw2+6vp-3qfpc0j`kb4suN{7fnZTrWS||3& zY2`g;?mbHtD%*3|K=o+9A#737t(@#I`9=LpO)tTUS;<yN+TFAXNUB^W(3(J&-jE+z zEkO=RZef5KZk6ZSV(K?p^(G<gmlAU%UCFe+4u;8(m{gNF4lGrx&o!?YeR<dq`lWqK zj)>qT0Y*$;>Z9Bjzt+@-v26b@(%v$ttw8Gn4GzT%B{&o)#e=)Icq#4@D8=2~ixjuw zP$<Q<xCbfj7OW85-JO?y&*shTH*;s+%=wdZa*`j}XJ_rT*4|qOZMOhTE;NZ3yIT&a zQ!dPMYHqa+`aVz-ziCmZ;tY?VX(rk7!&ENBP0McXcg5Q3_z>Uu1ep6Z3<QO@e_X&r zyi)>QLFW0R;`Z-@AOukq#+~(cI72TL<f}b7u>Hf$CBOT<f#S>i+Se68^D>Q2Gb5X~ zZk-89t<@<ac57@!G0aOH?R>DZQ2p|+!UD=1zqgFDYClMCGL@#zeF@JX33V+K=L2?x zwD1>~fFu*1E>W=P_oWHtdFvVv8o&D5nz9I5akW|_ShL=TczBVL>~RP}9f}6`7AV-@ z^CR9Y3(GF;7vvfM+OJq!BXN~C4rlm?gBE$(DoA*Lw`O2gmxhBDw3_G;P!%&bCvg!v zrX=W(&lEg#h>1g%(ss8|$4Dj)x*T9>FDQir_9q-1xwYX^5z++;6cdYh=UBq8RjBE* zs_EA(dEJOlT<oce5Nfh;mVwR^#fP!L`)r5>y-6ahnxR@m;RDWyi}6u*de3`KY|zKy z%Mby9L=e%<6GwwL>QsH8?k~ZDn#IR7@bmQgUneb`p=A1B7|Q*>I%_4&x3B-d7+LZE zRHbBa$#@Gv0v_fW`hkVtAJ3kjgr2voVZK*b=+Pt4QqO>I2t<y$QprYyf%k|2%^t#6 zs7HD>W+Tv#4LlZ@C$x+J1=L35P?c!;3nrr_yBaR!Ev@u#ExBBAt45Y-9dKiplgZrJ zt7q2eL-Bsng?_KBAmIxHqbdAWJlS)~l{a#V2X`0*-!O19MIHc9Bd-v5qMa83PHCU# z%mBS+2*0;HxxgKbe1Lg6qnGfXP{$u>P^-@=>6nzOzUmidcVN738fw5Rw3^J%RqE`e z)o3N@lE6;4h$oH24r50={S~{VgE6l(gZ^8Cm3AvPpv#m4O<qz%zr}u<p$+kE42LcZ zBSswD#`G-r*0Jwr+FjJtGZZdfscte+a)-|&P3!4G`O+sLx^BDv2=KACJ*0m(#IePB z=ph*8K;Ux^H=j^q(2*zN69h|?%$nVoo0X5Eh>4`GKfl?VJzjA#8&FAT8ElAhk-H41 zxriPo7K-XV-&P%aq&MGoch9qrTBDe96kd2kqG8qL>gu(H=h5P0CO#wjVz1O~JY=GG z=a~18J;x@zoK4O3L9`YAWE4!K*~TrJv{aC+Qi%e?TIS}jy)!5I{&YDb)#g{$fw8P` zG=fCd(UN|nwF_1x#NraNbCyxP3A#sV#LRJj3*_@?@5A~!efl9r-|7xKjY8BzC0H}* z+B{)PYX>%bQ2rZ9^kITK>xDvV<omAmwg;C+e$>0jS%;7h5RV4Xed7Ai7M_5g%6U$c zXOm|TE_j-XD$Ryt4DV9K%x=4{umI!edU|8qOq8>bHrHR`I_PCD+O5qeL-GBtGV#ZX z&!lIo25cVi9X+sBJ)EZu@cnnOQ!%)y!9T7F-j)0RG1~mkixv2jzIJ^vdul^0_+KbS z|8D`R{68_?k)aVt<-3gwUk>pAd9eTf#OHrA>(8mj_C;Un$uOYm>O0-Bl;ocTgwePa z`#Q4#-;uZlcTczWboT|Jtg;z(L`@E(BnjHws31DD<S$*NKFzv3P8$fL3uFyzgvGwB zX2?wDrn-Ape!PP!HVv79VqSo{Ci+D_zPE)VZOdDfM56Ng29Vcz`jot0IU$&&^I<RR zW;yK{T#%0##K5DSr#N4*HK8gP#wT$L_$XQY477TTF6s%%$oo69dbuJrBb@qvqRWIO z%>t~YdfJ!IHP?1y)t}vcw+9tW4X!Tr?`W`janMx1baR*(vG632dLvo{Do2Kq4Ea%S zIi}`vn8c9_4-Y@H;}URyVu-`KjK7kIBfdsz)|Tu_j>4C%B|RXP)Aoqd_5JwWx71*^ zY&i4S{*hCwd{E(Vp*#=T<ddj+^lkr4&)S!>bPsvr``w|(lI=4T@y2dG=GU<aA5~Dr z=N7XD4p)<1TUoNKqxC(qUu3T?2P!TsIdU%H_SWV-Ql<1`!2Q*+#yhY=%hpp*{}yXe zK1wfbG_YAt3FdzhErl#OMU-wOZ^dU&Ijv5)+gz{^=}p@lI3ntHNhVWX1Jm4Z5~v^) zw*J=qy&`b#;HbuWV;1(bg!r?4o}yyN!fW=$RIM|QH1OBLr;45WTXr6Z$;0aGqS-5w zJo)^2-_YAY7sP3cH*AlHgGHxQh;aI6Gc|`1kcVVe_9#<z^b)10x#Uptu`avnCrfW% z6n4HU`zV}LK=Uhp=X6U%gP(_!mwSUF$!PSxD(N+YIB_T->I0;YH@rf@32R%fl{}5a z(CT?mAQL%pAijy8bGu=9cVdr@gOLgM%+X6le>lkKlN$DV7@(l%wp9A;b^(l>nw6@y zann|H1+p@OBN$4}5Fql3KJ}-xn`#-9<f;foe);VCKG1_ZJZj08{XT^i#u>;4Aphq< ziGw%{cyRdhwj$vlSO4?<@G}*39atS&G@sC3QU~^Z>4@|{ojiU%-4;FZrpjbh4S%m9 zMs%-5M^f5T!l6FU+)l17Ui=HKOlulV1%SXW|HFcMKEOHS=vCg#*KeY-)q0!j*eanw z8{Fa4gZa_N&jRlzML(lq^I%kogn3Q}mqp^7Dtbs=6>$O-9NF=N_&}<OKMNYTwILqC z2?*N4-&v|W1Nd-Qps2q|u1q*cE2O>YcXOptw-T_mod|((8FZV}oPc+MlJgPDBs6{9 z#L`@YRz_X$s<1$_OB^~X%UQ-Fm<Ne+vQfV49>H0-<;iHvK=S1))0ZL)x7^C;%}9l6 zRhnYEb!`<izpE=7FYg%mu_!pBS!r-eXcO}*w*tQ)a)4)#BclP!|A_wkQn%YYWF*x< zWJ%v6prsXN=C=a17?Cq@c#aY30hTx7TkOd{3-P@BjKnteyk>x2sgxvkdiQ?4J2A4x zJFvJ?&dWJPiig2bh3EtcP2=tCG?QDiCUEMw9%m=rHWzAM^Q+ZL8XBtEqCu5zP{0=K zp?3Ge+S#~#XpT2NtfHwB{$+Mrvo5Xg8d%EqL+=!<?7*5dVu8w(erSE=0)w$l@sL^A z91&4_ke*%x8GL8h&B{1pv!#U44uedw08n&Oz4mgu#MK!AA3K39;e0LRNsx{sPyE49 zWE@4Tz>$C?D1LX=EwEE)@Xc#>Xt?_)^;Fu$FQPOUg-*SJa(44koelx95xHqn=f!>k zYwy;_qhzMM8;0lGn}m6{@69;1^~uqIvbXo|UA$7W-tG!RxOba$%7*t;pG5HI#t?iQ zGGSZ-)%R?}RyL#N^kj<#O=;ct25AcX9gV>x?PHr<NKy~MNY;T9t$S&FZI5YGe%t5A zPx;qx-`NDCVZ;Ic<LIE33P3!ebrotNc}b1%UmSsbX#kX!zS|?`V>)p}MZ_VO+gzo` zyT0d>MDWwycc8L!Jb^mJiuikNfim2v_w6c5BZeEu(xz{yQ4j<>5R&@?zoNCVe~sVL z3f&PWpb4eF{8sZjak%42{)dD<R_M<6h~JoK+Ukbkzh5H!DjhvF9HaX|)HzXCVNZ<X z^$ozXl`!S5!q)cwGqtFwGPW9#MatLt_!TW0LIk=wAN$lpic~s@3h_FB4x&kWDjbJj zl1(njFE}cLa+?)jzQxHxW$}9DbZce)yH8u+3UAj6cl+Jo0+XL#e#KPQQioZtnZeN> zRM5JN<d;ftYHGgFnU}aN$K*JNN<MjHt^oywL8)2)53P%nPv6w|roo46oa0dGKVw59 zbw|}_L|%HpX{*&wzmxe7-yN(iWE>#26CgBR%@ysJE|$zgiu6;Ty66-VSA;oeTa_Ep zagsfdI-f%Btew4~GhkO@jj;Fg?mRPYE~9yb2X@xI`QYF)X@7$<k^A_%g-e&Vbl+Bh z=`R5*T93Z&wOFg@@#fI`oTpDBccM%0wHCE(<yssp5+>5?Dw|!UUEC6R?VI22fy$O` z30!SQ%CGEgGsyOilUsu5T^+5x-7t$p;@JpaSU8z4)fhG_Q{aAJJpDmd(2EznyEIsh zdg<UZ^CUuO%J;QrONwW($PMg*9<0a3^ivwe=phnt>t}rRgDjMs2ujWN)2s^5llT!| z2uqntB%b2CzZ&Glbqyxr!C-aw1Kg{b`$V$|ntYBSGPhX3EwE>=jOv{_6-hK85?H=e zs0rGSREkT(Q04NT$t<LA<My;7y7`=%KK{hr;bhh>z(dgHJ}3G5eq1Ck0CvERHW2%~ zhB?-L-)8?5-!N;33X=P0+9p9H44_KW8;Jf#$p7a<0KgDFLS_Jn9Vr2>l@RI1rKt__ zA&>U{*WKSAcc}ay$EFdaK?6t3gB2Ug-GMdfZ5Bapr4-zjRgFK^=DvM0Ck`<diwH$h zFGkfD?2yX!MJ$rIQYL6b?_$C1%7}}YMo2!$NyQgr^Agl+?5}2EkiWbpI>V*$NP7Df zy7F=%_ru#k&dFy9R41H_tbO9-1afq1Z)u$v#`koiT}8x)rrr3w=zMZ&Px3F}>?AP{ z!_J%!zf(be;#*@x>-@tqxnQ*sK$OaYqEHbriAIzE#NOnjBr%k+>LA^FmtJz4wbzX2 z&$G3Fd)lXHgqEH5I*F`h%f+898{}@MVDBSXZ@cp8!U1^PZO9^WL9?OhloyLNPmsgz z>ah7<3kOELQ(nwWUEphr=%DsELt)Xj0Pzx14px|h@RvRcVgG*0N_{=~OoLlR_jLF& zAZxBD{b#f`C6n+TNvxlag^LAFF_CU>v1e|PYi>!g?jNJs>4Ssx+A4fV^BaS_<~=>h z`OLznRi$at!u()AC%3|f@*d0T5?i;${G+936~Kj^H>~#Ko)$DaaG|8SK6Rl`8tdHJ zmtgkep1pJG5lm@7Pmfu!QN?1CbF^fm8M=_X;6}GxSt|3qu#87Qq5fD`U|*|c_S^&9 z)^D$p+JA*W42$D^=@k;PYpiTR@IYkN$mt!}-{E~m`#NDoYx05U%&yn{fLgpE2Tb@# zEjMPL=3V7;e~Sn!^q#*-7U(oP@pPpX^PK$CX3Q3cK#b#1n~D>0Ysimzy!95w-bo0V zR55!XLhxWK4j4Nmk&T!hK3%Qi9>R1sOy!tFEZkD{`})2Nd_dxVY7cy%MtfpB;mh{j zhxs0f96!DNaNBaI*w6cqMC`$ht_<+wKB9G(K!j)B|K<oqWT!&>`%!a}D+*xWQv&eA zFy!IFzQD5tk^MoBUz9&**NS(g3RnWr?@)i$DeIC)o$$W1{`-}5!U{F%8{^4f4d$<3 zCeW@b2IaD$)^FCU`g7)bNhGO`%Rk^cTe8Q;*=&C@&0=8q9S_I(6I%#4k&kURMht1* z<+v=DvY(?K0&K%PAX3_Y_*D@a`zJv72*mTD@%eLv6YO$VUHo5vKk?{5w8M3ag{l!a z*eUNQQ_j76?xoO}k+!YQOPUXmSE>QK+A&@8RVAr{ucn%Qk5H&*7k0Qj3e9NB{oeUm zZC2$K&6cOZSn6Ikt0h}#8|VfM07pKSmfB=A5UA|;^3DwsxGo{Z)>d-Wms`+oyrOGs zA0caApK~%YVH^n%)SG&e@^#<7`Y?ghQsa;R+Y9n*0pdZqrEvt7g%IEeFy8~W@(2Rr z(Fsj|-l_Abj(OB7C=irTd3aY;dhZ$J7U<nkn$~b>>JYGI*yrh@J;OJ*%u?n!mAP}( zV_DiRa0+dmeH(*j?Rlk3@H*IvGPi*8>dd19{27m{dY!*EA39cf9FBVx?zKq!+<%!C zwCBjT#+=)FbYrd6jP-2>;TVMN2S_?|6{*|<%|#X%>H=nBSq`IITEc@#%cp}j&ZXq_ zRlKil>kY}B>Zx>hVu;Y&ZbGnqR`W!I=B<TRg!@1504NYkkr$I7J3cnUey{gHy7*l2 z_F?No_7tfDjt+k6nb*Ol381T*Q$^<&>%elQ4fkwbcbt*@CVpIV%PQ_3{miu~dr~gm zPHjy@G~z3JK@On8z#}si;?*o7+)z)$mqNf1cq$SBrfpK+owa+@2fZ&KzJlF$jX~Bu z3m)o}J^qn}JJu!Oz+>I<dy~RHg8d&*B(N{wFYs8QcaDU|K8!KYwE1BL@)WJ~IAPv? zk>ZaUso^8NuOzW2Wns}E0SZN8AqhI%3`II{nTIce;Xmk`$SM4opvW0+)0IE^*+dqP z4k46;p~?RmwG$8%4@KLF_ycLg`>xqDh;H_h^QFR>VX=}jUMGgcnqJrrGfBW90uX3k zh!(l87cSP?>{wGB5^Or5)&tahX%-PAO#bGvtq3==SljXl99_u~{Cbkwjy!+f+WEO6 zf+4)TO`i~Mp(%qbjFgv?{63C_YBo&CrIweQ4i6IUbMjiNtxv*?YU*@oYqV;(^;)dl z2m>k$X^yL+C{R{N+1|c(x0TsjG_x<Yj{S8=&nsQKJd#D@Qo2&k!Es)PywWS5{|R_M zYX<lj_XONKt|gYggBfwZ3sUj8wtA4flafF&nt7ci^tGW;H-~vh4|ckF-`-ri&wx8S zU1rI<ORNR%DI)t>vCP_0c{)V4S9~47UAPmWlc=Tlc0uK_XHJ(pg<`f6R$YI00-ez> zbqeECbhaHKZK!iPRovBrNFKP9%g)Be*`Mwk`p}fSSScky7|mB{lH9sUm>o>R6s&78 za7FBxtTH?I)k41MEe2=c!z6Uw&e%|!ogg0`O2I{rM%{~#U7aE0kwA6Bn>NSSjQ$+B z?HA*P<|sz3aR~g`a+|C_5pjmwM*!qQ?obAOED)F?Z9Y)(F!Ef&VV+Onp`cg7%WV<v zP&}6q^<HRA$b?v(C{QRQ!Z=U}my7w^WUn%erhqq1c;{ADACCtYA=>>)C^_9emhFL( zR$bE@O%9#t2WsvaArkR~u;&9Vd(WfWZU1;i|3{e+(|<&$2g~1d%wosIC--0FV!9K4 zyd1y-{~yz%cx2fXKYVe?6<q%<KC!D?*Z|kYpoU!0v@Z`C`v;?8lyjnOnuzJ2Gs6uh z{u;#49%^S0`AQM+3p6$apzl^Q;HLrT)gd?HujTz-6^dOZtbZhHHi9%)n~<VBTEZG4 z$HM6I27>`gO{(gHM4#vydKe$kOt%L@Hqv6VBeym*c2SP!3<B6}gapb}hJPYh78m`E zEyla^R;S34U`T3L+xj_FTRar2t6xF8Si2v!3?q=oNub~^54C`0F5RdEtwnyimMPt? zSC_kqFs<}rT(_?tt0@L>5R~HRhId`N&31L{tL4ve$#!LrJ#DS&&-#=VBiLJtTDLq{ z8ay{s8?&SuTcC;HagW!4MAaCvxuWxG@DF6CmEBkUhb5^j6z1&gV2rbO1yUF1?>LGw z-jga3`Z}cgqxQb6I7v}xdM4>OmRD)6$MJqbvXrGnkxh3yu0HICtGe}Oa<OZ#F1?;Q zulqtZCa!L|YoF=CTzRMzjE3xc&Lt)5Y%{HYZw2W+4|P~@mB<vx3(8v^f2=jTcI~ja z^^`G|xflU4c0uyV#FrSWld||c0xQK&N32?CwJSvruhx5+q`%XY-T=hUyu&O8n%OHQ zE#+=WRS28=<WZuje*FVUA9atD$C?P>I|M%n_OXA<W)F;iaT6*K&L(3<`jNiMN2Z5x z66BY+K9{+ULg2wKA|XP)@;Eb(?TpIo!7W6=y1k{|RZvLZY#zbo>`4#4ogW@n8lmGF zDrW3Jy*i#828}EYM-`s2#<0RswdkvhicgDkWPTjf%SzezA;9G)%7O>iSaQsNz=M-H ze0TuPEjihx{&!r)ipm>tgd3H%nm<5{xDNN&j_-b#JxWijZ=a5pp2dbVG%tSlNDYEj z9ACo-Ri&fvI#j?S`A)3qNZQ;+8QZ`~IOvxI#3V2r$v83Y2FzC2r%SB?Xk9CIe&=(T z*5GC=<A2WMl*|26jZ;<5u-TmB6u=XoTLO6`OOPYxNGT{J37-1F85obv-#0CFJSSa` zQ}r33iNIgOq^0uZ9Y=u+n;tsm=eIE?!3N|}RUqzflxBg#A#2={05^o(rwFVv8D;UF zi+n|IMgmLIsryS`BOn1vp^M%7Zry`brj}u)!>v&}_qw|+(-ueF<v_D**O8d3W1M(5 zO`F3Ftp$i8yr_aulpYk>^-X@PF1L3MS=f(2pRsBVrR`6qzt^VuqWI9}Sv0a-uUfn> z`@no`s)Q7ZOHO-z%oGmK!^@xpn3}V2h+6oU?2>zUXDdS-6QGn{=PtobuKe!jIo08! zR*Y_Ri_O)AkXGJdOU=E5#KQgT#Eg_0UkM4C;$oq6Si!X(*=E>MxF%zDGXPTT+)w|7 zqNN;-N7<%#aaaDWt-)cl)6|n|xUMm@s<I6Ry$|GR_R=cqDVHg`+B^VXxG#!JfJuM4 z2~E_Vnp(YUB7NoMYeQUdOw?)~8z0vozfhWYAnpONI+xt<!4!)ROmj4s^ob-&xCDy1 z1<K2vv~b>J%Sh;hg;@PW-Z?!JIY}?uxkx`6redi%dKFfZ6Q<m}58Clo&xEmWGhmGf zXGiDWA7u>r#o=hC@Qv&;WTBdK$(;!CtmebFeIOv*{2o3|@A<Q0E?sc-7z467Km`|V z6P&-OMg(oVMXu7N!|DYeC<9|$O_9!#?ESYO(r`a)R}$puyo2*Um<xE(7W21gi*e8L zrvGo43xt;*bQtiQO=r){Cxu9NB8aEW0;IZG@;_|?J!b%)&;40YjD|}Rax{V*HRfE} zPrO}4m;ef(ZT}F}7v(?6us`v4OjO0@mLQnx00P-THW=E`@BeQvK#@Gat;wYafoQBT zsVweIBe{m9iZRVo)gdkCt5K=sJXGsQJF4y_sUtAm3nCfdw@=SMKsF}3e}srMw7CGl zQDo-v^jGhSK5iQK4LazXOOPMpeh|aB>$fKFcnX;che`=gV|Da<qW4wfMi;vwza(;1 zTyH1=zWFeeA!1tG&cz}Tq{?)acS`^j9$RvSx#D@>e}2O%StO?6?FqcslDV_)cDc+q zgwgzgFY&{k+h2gpf>plC+FJ{OD(jmhXXhw$f90^^*K>Q41nlECpm!`Dg3HMH2q!BS zAmhFgWXI_Q&Ma5QpBVN)h7JL_&#S^U*;H01h7(+(jMF(6W4smQUYZ$`227xG7BPX6 zYzwC>>ql!v(%)h&$`zBiZ@#T;wdtilW^h>*d1Y?>nN{)6n5f<hg{D8e;+5HDvTB)= ztZd)AQ=>angw%-+wp1+X*SgH?ybHoHfHN0BvRgmB<HU?%P>#NLiB<Vgb-j{r5(mCv zc!0)QS&Cnmq5ZM7s+~f3F-YuJRh?PSpOAiQlofPA?o6G<w-{yf)-y0sKkU4+Wcny^ zDA?6&73bRMnP|)H_4-K=*B{JHH16LwJ+ph{+dKU4tiY`}-2=-9%k62@`^QzOF%k2M z&Q9#!bt&%v+0jAs9V|FOLv$I3<|(UfGcPUuKv7NRL0<*J)`Zw^DQbM?Kb-i1(*%fG zl1Sp7uDSVA)VOM*xLWKFuw(Hfw7p4Fmsd{=AZP6j4>v8ahvCJaY5ykXOqAgG*yI@< z?_YeyzW{ZfB>aXvr?*YGaOU|KJJ98u-vK7%ob3B;Ip}%QpCJ(tnVd+g#YTiYLlidH zQG(EoV7Lg`S;gp(!g<u>yphfe{E1WF6cUfjuZBQuP`*}565!h4;8zQ1n#JhAc^^MF z-4aq%66c{YRag3=hZ(;8h#-_bFbnamVmxV2iQ3iG&_){^&>FdU2KXWn`%Wv5tkcD= znT~%KIh95pqgKCs!^&Pw9f73J?b1w4@+H5zUy}!IPA98Krpan)r=YjGb|DGkz~h>P z<H(&J!i!OPkiWK1M5}H`5N?ODI?~W`x~TsX>a)F9**i}IXt1kS16=V|NU6+a>^inw z)#$*Ejx>FBflw@c+(|d<`Y#KUUz(T@8sAu?0DM9onbUM=Gm!avNv=RPx5Xri!{{Ud zeP;eVU+Ly6x9&C2v_HsMKXg5)$y9sx>dwroXG|J9(G+^0H<7YVFDF&J!Y4hR<?(@J zl-llsMQE30MtUj!I12hlIg9Zj@@OuS>M*tG6=SwLfyyaduIOhLN)|wRl!eUPMh&4* zlKpR2mJ{zBZyO5gvpya-STAOMX7+6eMNMhXid2x(wl;9{&H43S|I^ow9|=|d(A`Yo zC}rZ1?wLFcX^@K{`BBV|mo&%ybZ%A`J-oRH*045xQl3YU^p5g_1?p#G4~WO>z{d_Z zQHJ5`*N>I10geJ`874j}AzRYfUxrlJ#n{)oS6(8XJZ)yt$r?Ye@vxsi_Anx^<gG~# z_H44JUY~pNe*~GUoF0B7$=EFBa0nP1*`18~G=JMBM4v7zX;kJW%2i0fH8$d8clJ#J zEFvyXN$~*UU6pt?IQD;rJ*}GipA;@@)SZL=k*49XijMH2!w2V|a>+kVuHe6h;|~0$ z_&=y{+;N>0Fca`URNNf!dFp#uU}M}Ug0$RkBkvC681KLW6vIls_vtH=2VfEEd7^R8 z?i^rPKSm~9`s{28WDSr9^s;!<+Y`*c7r8`-;aAGi$;J;~TiT%JGlKx7>u~VR$9w<s z5^rz1_qE^~R3c+_f!;|LU9OEh8qx^jva4g&$%kYzLZw$^66wY!TfuqxyCWmiLz2#o zz=KQgM?4x+E+hxQ^DO1)Y80ooaa_jlbthiX#wsh01EDxB+kMMxzYkfGW43EqwbMSc zY>c(~=30dQ^m<P*$VS!?yprv`5o`$X)*-jc2JfLIRxOq~wj(<?d$xlJ2M?n%v}G@w zul4yDxy?lLR?l~FT&<87!Q2q^AF+W!mxtgYhzEhhV+g><4u={^N$cGJ<{q+9QH;mC zl@K(a`Q%IBWwYh;0gJ5Zs#-D6uBlc7{ouzA>}SpTrBe&;;G3b7w}(!?)|jQ(;J$0& zIeKJolLcI0RVh-a>*el3<Zvy<PqUsMZMSZaPxBOHE<@*sumwZjRv2j{)Rr$L=<sHY zKyaE8MDe4g<d8^&N2!vi_HBFAxFST2UB2Cs*FMgwap%BrC$y4|p|uXgsZUS8Cs%Jc zyiUYfy;s>Dw?|oS(ZzR6&6g*RY_x&3JVr-c5P>w|`<=5>0tc<JKY6mr-YzXMe&Z%f z{s?9yn)yeFcUxvl7(=s&WEk}R5xe(hKC*kwC;Yg(ho+HXl)m%qXL#HQ*%fGc-Q<@) zSfn!+EW5SZGrdt*pq;uo{P2b-bFk7y{ILfF*vXZvJq3jdbHK|x{|y<~IWFwh8FX>C z$7V0N_Ud0j-0}Y}AEO0zeD}HR!F_&`5xeS9DwuzPQ&rR)=URe<YOnHULc<!!s_g6N zh6o=!+=kNnhcmDWgZAfQ2o2fqgeRaD6qyLONV|9pSxx?-$YL6Eonc4nR@jy6hjS~) z4bKIfnSoffL0gX*&_t#;3;dNMB>DL5=_-nr|4*L)p#p|X;3&L{>sk}1ijFzC+iF;c z4dJ}g!3>p)>&q1j4afTqKM*P1fFYe_=wU7=o!e~jfmy;R(5WD`yPr~j69F1k#$@~B z9pQ!s@-E1E{zkXhxh>S$;6<H8C0WhPQ%~=Hr`{~uJ+Mj$YY>XR$m~uSuzzK5f)E{X zI91<pB<b{4o^)AHjqB{2W5vNZQH`Z1Dvt}3y+VHYANUZU$ntqe<9jGL<H_9u^V=il zp;8<8Rlw=i)KJLp1f=u4ob9vjoN97CiVqY&8uk4fFtqY0(lbh3clHV{-MYzS_8n&P zc$cgb{jBx6--w1D!aL$Pp57ZMEG(O2rkN$OST-~$Od&6Cyw$2()P>H8@Jd-Xq!s}5 zul?}*&2vpDDu>SW4D_{%QTSe<wE7Tf=f3FRY0^0a`<A&T$+xC^Qf8^_Qlj`+hsRnM zuVnvNQ3?z!>eOk;#SL9=LA~8Br-&+MM+eK?B)@Y5|2(g23hcS0SUW8eCAD81B$G<} z*cc013~8cBEzAYL<f;Xhd)TkyZJ+9!(9rmsgcUw4fMe`K%=y+&<C}KShAy0LU3{FT zGLN=XR(*Ir<{7mHO+tjZP|BY28Btb#rF~BuQZO+qkR74ni^OzJPv^SmEKs}6!u3Hl z64T}vHxj#P=H){bdsKp5CsTPpDUP*{{8;&4_~Ju2dTwwwX8l*R{|j>nyZnXQE)7wb zaJcPpg7L5mewa6h+}y)4H10^UB|jmAxAKGTT$Q#zp3TEH-$ztw0;l^;rg2mUU!<MR z5Jf7|-zxmF5&WS@SZ|B91z6<~7k;;Da!0O>(<Aq)m|@hLT6F9I@-ou^ruf-R9IWU) z{n*$}ml2(0RMZ4Nrp2|~w%9L>`iJH{Q153$xjl(rHQ4K*5qrL{Jpy|d0iuHF5uiBX z`ADx-w}Mpy4MZ=0UZprkv2^6`w^aPLi_oaej2w@&O+$GB|Nr0{xhz5Ik*hCP1#96R zVttAn2-TpxGFOpl&;iTmzRHgdsZ(5aA9pH!#H21~w!vvw{-l^@y<4ZJv83plmwE4% ze_i@+!Q-I*%ZQ<tWTWaJ>pBmSdSt6fCUXl<7u01;aJB9+l22+J4)l>eOBO!SV6cC= zeMRYP;ZL^fA1wb^N0aljZ@JdrvG^)K+d92Sa}Q6dULm?gr=q6x^xf?@)02_=3Bgw0 zl7bRm6SvFj{l~9^0ooX%HRA(p0}z8cjhUmLn2Rr`GMx1AgiM@|7hxj?I1c-R2BrcE zCb7+v%m-k&5u;p}O>E4T7`bw6+g9m559x)6Whav9l7{!;RpmQw)=DvC3hIMFB^CA4 zUkHa$-_yj^SQpC;t$Zxn82~h`U?GYMJdE|Y!)47O3lE4l^j@SY86=3snMhb~PVIZ; z?EG11W$7ypZQ?<`643o>>+KOO%}!rm3W#>|_*av746O5PP1D0`C{uJ^NY8*x**Ok; z^$~dfYap&?Hc0rnU^goQnz6Ap`c<cu$$mp10T2wG9Hxh_Pu}vdHmPLvTYd*$*wMrW zZn$X*_nGs)GWWka6gyw0@|jiA;}`x1bbyP2D=*;MUnStT**{3Tf6&VCP}cs-<Y^xf z&cd0zlW~0Qf+1YrvsuyGW3k&puz#_v7u>9(hgS{^8^J9LGsD0kh|kM8lWdt8?awI9 z${LKka~Q|;&fUVUNDV(AL~U{*Fy)K7&bd#X60lnp{Y)>Q4uH~i>*h^NKe;~UA}DN2 z2AMM^Jj;6-n?L{H#5E~`FqRcB@?~Bycc1Ie$S5M(m`7Ey6Uv8h#z%E(VkNUG7_R*U zQbbkpygijSpM%J5w`A(=YF%*YU#%gkCaG~`o$hn5T(U6OQhtP$V7uRX@R6@jSB*N{ zt2j$!Wcggq0<9&^2Y<aBxwF0=cq)%9ezJmBci%2aTlR|VE*5h?y+zM()J0yZN8zDu zz&g-g{U-9bk`XIIQT?X{fE(xAg&BXSBAqW1i4|2{;}4f}uPf&uiLwudinnlH9Eq_T z#YIk4WxP<eT<$(8Dd?wFLWRb4xI+F$w&`Igl$A#idg;<A2*Ya*g@-ixkx6BUlbFT0 zqcz+wTC_muXFdNprPfq^Hs+z9)woTgLT`xg@QPwuZxg|iyzZcWq1|zvcYAN4hxdLq zWC~I8rlFGL7nI6+QdBpV%dnysl69x}#h0f22#PI%2PDE3)YVv%Qo=5xz#~$;d6FzO zySw~aykMQN^7w<6Nx$C6hu{-A>Z%Z01Smajn39K|is;8viJgyn64wf6X7^KcOtlS2 zkUd4Nsue$zYUF6Gtr9dWqHPGLH5NM=RiCbs34S7qzUadX@CLq>OD8g^$t0P$d3$5X zdn@lpZi0wFOcJ1Wu66x^`x{-yd9hB+2tWI_nveNlOw9)`#4nVL^-Em0t1BYM-p_j9 zy~i?^&!Ql<$^TTbWsQX3xOwrm>f3+E*TFmeN&o8J>3TgO32=HO6M0hO?$_A!sEp`+ zhX2`2O4MBGr*{(jQfA=!IE8A9CFa`RuSvfV*t!tg%MYXSJ`6<K1UcBQ4s=-x;zdI# z-Ks<c(6o7sY@s#N2a!{e$X%r!(X1_vbR8PolM3%djj^WZb6I-(<98@5!(Bq*Sevc+ zYvxy{BCN7AD?#yUDSRESx#4g7D3ScK)VPsY#pO`{E+RzdDk@5>JnFEBVn%=X06bES z(Juxl8grw;ISH7rj76~Lc0U)n<1BiOER+5$B-<H$$*zs|>(UiiQJlK4Y2<y0mHqMY zve*@SmU^_Sh3cyE!~TBXCSis@FZoLJBJ(5Zt8$JCEl-rddLuF`yX*938nETnUgl!U zOprHjZ|Gy`9tcr0wn6w6&%L`<=nm>JaMypEp79V2ZwHZ97M@m{2$`j?deO0`Wfh}L zrh)@bykM>yaEtHO;#tb)-R(B??&VuXF#N))e<{<<V<+uwV=FBtn{ut^KW6*!Pv)m3 zaJ5;Aj5VIWP0c&jYFKW~K*lfE!b_!)k+#OtGlGV4SCf%fCx?qRB@pz?-Ro$w-7xVv zHgateulksToU6@j_UD)%s(i8NcTO$mNLKmYaev<H#wtXGq?TTRUNl~$L@-L55vGWF z1|HM6{N{TtxQ7Y$y0LOf@h<)hfLrGpR;uFey0Z@fXdd{K8@CKmUb}&5<f*6GX{&$0 zQI~qC#lHB>kiV`vWTQDqSfUnAWaQ!_hbltYHgIdWU(dsg-Xs_|WNlL4P+l7B0l7^Z zFytx3B%tk`i~<eIS&6{Q%^Ue-iOoQNnzEDQ;GZ{7kn7>t_HC-RbAONA**+%Ef3Op9 zK+$mt&$I26psW9qt)mV^ONJ|cXjf1NV>q21OAOx~f2kyPb`QB-{Qi9NQUJkmE^*}A zx{{98A+3f_o+blH`wKfWY~f2MUI?cEu#w?xT(H9{97CU^OYr?U;2x(6GX_V3JUutH zL$w}<b5ypQEaamMl*lqJ@T+#a>GN{v2z<P7G5$BLZ8#l(vf|Sm=e4w4P6oH`Ca_d& zvbhFu;4Qs)6<{k6{$rT{?NNJ@^=hPAyI`Etm0EY(l2{Xwz4r%(iOG#dHb$9(>vm`Z zqxHCa=FGw5&|C?G!Q=;2h18i=rK;R&<a+;0{est@g9<|gUX8)6j-&L^`3k}S9{MZ8 z{dtmK-uPN|vi<aJhk0)5{<a(Gf{i$>O9!rx^)A+^?peNeI@HG~T6wsk3lLohyYC$2 z#82hx`EM-vpUV+UiY3i2o=4pkOdOMrrajiEehEZ@LjmPNRY5d0=B0`Uua@vLhgzSE z>aXMWGx3v!hr1Rrmxa#z6OxLA<#qLjyz8@2GqKnEl-ADb<x19Q5G7`Yv|>eG>FrB% z=Y3uq)09_#$Xg7vXSy73Fx`;TnJ#<JtE3*wrEGd~zbWDsbz*X@{?SKZ`bBkpX1Vfl zmq7~yfk>oo84WpacA%vMfmz4^D~QhQGq$1nJ}@4(w9xqyuq|PQQ;rqIMZO{mH)@8G zqb88^%Z)IQUzvq%sm{P2eg1sUUXAvrZQ0hG2Y<X8Mn-f1Wjz76Hs3}H@r_vWkF6fF z9i=*a3gY6TB;$f(W3FD(RlxT&a<DQ%B1n;wuhPs+m;<F1ralcu@A9%gdBvO&`@xC- zW&rF7)AK*L<!igN73KV2^6-i-9QlGVfkKJ@!o~lH_Ksi$I2RY}ZQsZV=i+4IJ0ijU zyVsBlG^(36a2Al+b?0~FHxpJ^i7nYBt!#&GC{mf5#+x;HbNDza?!^s@74D^0JbauK z2gl$d7k7$L8uUElPb;stGZLj`@ej;NvD5+5ne6ex9i*>MC|20T@4&XIk#zx+>hnEJ zkDrnVsm(PQgYs>vsdp_!*t9%J$R$qXBcz_A`R*p<r=CmVBfWk;e>?BQPVsp)@P)_Q zq4*n-)XX#ugB8`x*UPAWCO1icsoa@o79s8Z(ScHf0l!BbV~=`N7rsvh7CJTxmGvd1 zGKQ=GzE9jt3ueo8b`%HAdzGWqSnk@&YU8e$(-V4vjoErfv#+`j$?u37C!Y*bk@r9! zj6m1+HU!VQ2*fC@)Av2^3YS5n$`p?EQ)N=hb<~ffhb#5!YSLMt5~PWdnQ2sLI<(xD zuUl%$^D))#O@%}Lon9m~YMc~e`OLdMjmj&;Jqtt5C%7#wk$@Hy3@-jbx2jL=*x%II zs`K7H&VN-*ww!&_P`~49-}1rMHF63{FRB$QnF5F!bMq;mmfR(@Qx!h)xLXQ*q=^P) z8jRdwCWQx3mCJ5$z0yJtt;^AxSCy59HQot!^E0#)2SR_c_v`w{$%mQfRf32iH=8dm zI^D~L6Qxw#Y)0);&%1Y-?-QP`t5aCd7<$dS5=&EJk?5{^+{f1XGmn9ZfoaG2+i0bc z8#E(^youj*veN<fW6oS6d^Kr0#YdRO?(_qGzZOoLniz(W$qWX5(CLR@wHXPRf4$8R zyQ??%-)cL4pn^B3coS*U{Y&ofD2E3rMAL~}=D*XU#Sw9d;qU@?4tv!Jj-)9u|4%EY z|IPaIksA1ENK6ZXn3Ik3K4Qljw+N!jvZ9Wn8p?=l4b<_MTIhN6^tS%h831iZop5wi z%G3w>JH}Gn+s3jmqyzUj!Y*D8dw!;Kz)%wJfP+yDL1_vZRg(0t7afy*@;zjT>{gN< z>eXE{s>yUDuOexL1Hc-|Ll^bc9|<nJb9pR>klK$}Z?y3OTn#b4<x71^W{*KrqUu71 zW;3C_14!dYp?ByO4_27ry6w>?qaoF3OV%#%Pv1z%8xwa4;+fY8(q`Of3Eh}*7r05c z-IelOYT1sR)qh>A%YCdv&#$ny^_^{RmCpHy*2pTYw^Rq*#%+|$TA~y}&pc>r%Nupt zTx$RoZ2D=`)Z<=kogaczZh(0zxKBl$B=EgKPf}2@zF}&x>k;_U&oLA!DhwF=6Pg2< zRpBw(w)v4`Pn%h{GP{$WRlX}|(dPYpD_B@s7QI9~DeZnQ{+vDYFwR=zzGUei?x%iN zGkdikWD`|gSI2WdRaap}(Ik;$JqcyCQGqv08QC{)y)Ux7^mDap=ySWD^|$aLFUJjA z{D7TlxOSj+KKq6KK!^K}JU}`+gVb1KqX%ye!p48M&inz)bhEHp@>Bwitm%c8K^`SJ z?_L=01J;>Q!1(FYKni8$UEnu{4&>gGjH}0m6s60b+E-JI?W9-q?vOE`{pikyFthrU z*E}G<0z`rBJU(f62<QgN#2Pc)qv9nvSh$-t!?Is~RM1l_3z0n}W5aHj{&<`^qki^S z;H=^w+?1xD?wzKy!pY-YRuRX?hjXAK7xD`O=l)o75ca$!V(+(QTOa>V(F1_-2Mvy3 zkCEPo{<Bp3$H_pnz`r12mCXVBFGzU%SN6C#hg_3AZ@IT$)Kyx9g5v{wcFLWube|Qb zZsmE6Tm#BOta)_#TLj3B&>JR4q7$6PYnpuOssjWyD60JH3@KJTkQ?M<gz<dkQC3{H z`6tnz1Vl-R+MJTGu=0Eu5mSpG>;*Pw#^e*7vRnX@GBdNNxOSl0#ZZsznPH2QfE{^P zochr0PsYzf*>d-e$>gySem^dynuCNf5Qw)|0PVnOW#ZOSCZsB4ncnp>&=E(>t4xkk z1X^7f%Q#6yN}Z<&0`aJ;D|OPbzt^(82v^ndl%UiYd<pst&=x39MwF}9JsPqfVu2s9 zh*&#w*!sguMp#Mlyc+K6tn*cNul1iG=y2EZZ|T!3&wKQnhhBEnTQUt9U^$pS3tj@d zt*_u#klL7$rx&>N8#3@BG^fem_Z}F_%VtaH3E$34sGc^BxGZ<1>b-zZ)|}sRA$0St z&Pz;^6+YBBpW;uGTeo%Zas7&64s&*Tgr6;fT@o0ERX0@4=XSUOHDWE|<(nj}M=f+? zq)J{^0S53<ar)B=ra%Kuu0-tSAS2sIJRYyVEOx{QIp+Skm=othw^EJ;VYXHoUoLR` z_U9b`GO|ZHPPL?rbPxP~!oSYRd6R}&E}caRIXZZe>$5zB{xH`=AZ_@l?}QjDi64M# z(@KlgC#1v{HqSj^b{EY)-18K2;a$UjYrU0Wk8VhkrV}>+t)~7sxvS{xm6UbG_Hm6{ zYHxWaf55zV7@OP}y+a`3cI_}NeREEK)JDyUUd_3kvoJ0kNU!}hCCXjk3ImycJ>+{U zy4RL{+qQw&!}WLX?J<tc<12Sey?<72hM4foS{Xvx_YZ9FPYBV0Bnt-&NFHj9bbs4M zq5;S&vHqtuR1d>4lP<Z%0pG;&!!e>rw*f;TzlsBFMMfP#<C;mnXv8KnThXB+)3g{> zSj7k6Bq=~LR=07hx$W{GKV}!FK@~j-&L{n3QU?Jk;v2@0Hyg5<dLu|S1cX|Bolm-_ zb!t{fXMo6$jOQsl^GrJ;jux8(3<}P0jsX!XjrcMC1OG8@gduLZ)${1s<VmkY6<<_Y zJLa=?*On?#<lKvnl2+Y!+80Zo1?rppdytb~*Q*jd?<M?}t`D<)`Ht9>q5>t;)pJ2{ z?BhjGzM6R5fK;3Ub;*bAv&mSewzC2fkC{1xY1qD0t5xq|=%Gg5CW))BTZ2CbG9PAC z!|~=|T^(k}4=Tgg(tAr<_gZPCkC7p(X>hxUh@%y%8dp$2IPitS6u~`kEDr=&*9rC5 z;WoOYu{I~G)yIFaXVgqu___Iw`^@y!M)NMVc7vC4gV9MCxcJHLd-GG0jX{7|B~?9q z6xEiDom-K;{=8c$q<m^dWBJaEw;~I*m80a8uwhvO_H@_`I?EpCeU5T~w=zAyEbZR> z<~^=*#JkP~!<I-yoi)h85R*!@&GPuay#RqgO;v(`U!K$Z*C>Mf4EiN^LNAYjXkM@D zHEI1Ti+(rl7HjIuN^}u!(pfayZq(UBu#nI@h_lmjSr77ek}uS5+R)}b6Gl#1gBu<U zMMc>O&^zoI4E=&VH{mUbzd>?4w&_td>kk)2joQn4bp1O*$;eBko|d;}+X+wZKC>S% zYf@9mn_9Ha@(5t{q7L=!JuliFZganc&&3{aaoT(Jafw|djzR8ImS?Gqb^bRVt>v$t z?2f`54CfO5t2pl1|0`MVk7aWGy+fS&uR}BC`)&U*+@T41xJ-H9UU!wq)WTrVWvCI< zW6MOn5TVXQ%8uNVyK&!>i&G_^wDuU9uYig@_g(}R`(8ZWb;2;!L+o_Zn7@M*+q~>& zxYW@kG6cQoM<r<wCsTmwt1q-0dPyoeZvgwIjbh`<e(f+$42R9%W}XZj9AgCiNaW>{ zh=!U;<?m71F4+-&kse3@G_mJ8h>sK~jV1yj2~B23djxhcUnp*4rV+oiB!88@i+^RG zG-_a7$Np+;<3*$kVpVfa`|Yk=_TC|e-rM2@<fQ!}RRC)Fy>rs_sct9q%D!(WX3zSA zQ$C4zw08F0e&Qbv$(EKDft$e@H<b9mr7Ei{`~0W1Wtlr|Nr1FY8{FFlxOb1J{prDN zgk@C#7O_48Pw(dwsgJpsAM`UOGZc~TS?MaOgybl#CF8_s+zxw@v00NgbV)h0F3!Nr z$i;%JU3JUs+(c~aer~n;Z5)=9mb)%5JpGI{f99RYZ4=N!N>FzpsoT%;s<qCtKHtl) z@z0RuFi5-6GWjHac<YeDz^(U)ZNykd(VV(dz(?lYAtT_mXLf>T-RAc-hjNsy9R&|9 zwhp5I7S)7WFb`=h=WLwLQ4VWH9w`EJ09FYu-)EkzjGu0oGbTU<av~Y>IXQQ4-A6kY z_esJx)V}<QxU3MCcUu(q8IotjJ4`<w;60CMf0*}hQ7<6EG77V3f2{R1^|<3~2V5$$ zCY;!C+-e5;KnA9fx6OEnYTS9ahNd&KQZKR@tIEHn8Kj<f>F2;_-J6BNDvR9U>`nd4 zqqkyDk)YOfkz?QU#pUI@)T;lbJMV}Vo`<jT>EFfww;_C;07nzYZ+u4;|DtGY#9gMx z9iZr~wf{+F91%a3(_4VGjCRW&VCYS&o<@0Dq6T#ehy_e&vus4(4q!>q!M`-=Z&P`> zS+A6ato=x*<ZwVCk-u<4(LFcVmaU>M{<hbc>t!kPtEk_XBQH+*UpwWtYfF5@d0#A2 z?TN#@uGM>)yBUF1KOFykBBH&CyBmRR^3{(V>Fzxe#Z~qRtPY*x2DyHtIS>x+d1SF$ zu>E{X6A(LxW$_P0Cqn0b;zi1*XWeMEH)9S0&h>@ol5kycScL+*oiy{~hsGOM&Z={% zmM^MeWnj%nVjjb@#b~k#o+=&i0)!$@s3gO<ex_D(jyI>&R_$@=kKb%+@|}T&J=j_6 zi<3GU&%IH<n#!B|o^zIkPg75IyZ&KZTuFZ*9uFE98rZ}s?SKOxxl-WZs*NJ65Cl#w z(D(HYWb7F<XD{RyxFwtL@$F(}807tNX@A^Dvq$ZWTUgMKGs``g&w*hrw&#t6*NKi$ zZ!R3TRMa&sZ0V1DYe{EAAg0*pw6qzytQ;v#v3iDT9{DmYSn?F$jGLpFQskxV<nc6K z@C7Sqc#@Us+T%S=lsJy-fSWCV*eOh?c{zKaQTQPFrpVQz_Y!Bfnkp(LZObaug6tLC zlzUfY7nlgzhv4X31Z9EYH%#s1(#+0SXmhD1J|qjEj7AWQmEh+b@BMw`;?{EX8rJb9 zGRaoq_M=2V8RRDaYu>{_??#5wCd_Z}k1uCSBA6ww|9$S~J8XKh2UglEP_mEJQC7yl zSM-j#&KLHJ3Tnf{E}uSPIt$j^_e;IY-aP9mbEz7xHTOF)5W8&1_Uvo%zkM7~emQ;q z4~z>h_X21C!rWN|&cc6R|Idmra5nhw9l@O2fA0v~C%BoMHM|QJyA6KcclWoYEa#rD zjQmAp$%9*EhEPB910fc^GSS>MAaW4<-6(h(je~B5eOZATV4hajib%4v7P)Ae^+E2v z&4*+0VME6NTT$Z_W@5R3bLvTjnSeZ%1YkZd>b+L_`z@w6al-dv%PClGFWJA=2#Zr$ zw0#6f`^InHa=d3lSC4DR@i!jP7+zIQD84Jv3#9a9-_y#<H7oz|C}B_BgW-n!*f<O* zleZ=O%;cF&dSZpaLF!z*x{GWi)N*HTnn)1kYLp_wR1<!#|H9QkviN0D798>NH0l|8 zGqB{Y&waXdjj|{{TJTetW!1nw*1GpPJ5TO3P^^X=;@5-PTTLko4j<vF^`V16QC*a2 z4o2*L*M*}r6b9Gp%$4g5Uj?kb{Q<ZKDn)0X$~NOLsSm!}!^rU3)mMOMbWTToq_Cb< zr}PV}_B)?&5XnF&CEf%d?n*bjKT55&7C9TOS+&aL{$OhilWVvV(G;?*wt}h)EneE+ z=B_o{a~^xmHs41&^4vGb<^3#(KVAJw>4A_>geM8ATS?L5%QdX9b~?9|7=u4dYeN1& zX3aW^B|6JW^XFz!;#X-u&1+DG%$vzMxj3&;*RJJ{z;m4;tlelh?=g;8e?Fmu^u+q# zoPyc~ab7$$hD4`Qz<2Z_r!Y{%j@#4zMD?`|^!yTlg)Lae8u5AydTe6f4q1rk8-8|I z-PnW^$0oNWB;WhVw2@buZtuWpbIo_2R+^YKjoiSrrZ3kmoF?}<L5+EddSSQrt?Ox! zdxF0R0+xbxsAP2V@1P8vjsF{h_`HQQ{~4eEJQH|K56{>z#pbC0$-n<smq(%4L$UvJ z<@1f$W0)(8cAbPNf|eIc!l6}!!2rO9EWbcKC|BcKm|#bvIIj@_im{S<VJn`R`{57E z;xn$96)Cn)SomtQlqX?_R0Bv+@*b`E#KPq8g_wJIn+-1mRNiVG1vFrV-8d+r81;9Y z*el{Vzi5i+p1wF4jENspi5V}^SXI^^R0UK3s1w;ADva!@V~*sTzrlSz91JE(RO_5E zXR3d&e+HjB(V}<Mi&;gGI~pN*GuNu!qY37i7vk&Y1D9z4LPJ{JB_#{GyS3YQGz%3& zK9D)xxTb2DqZ+pj<}YW1?W;{W2dGPFi_XYI?h`b*YH9saP-s?VKj;vtp$tqJg<4$k zG>UP30G7iuNb5K=3w#vfse;~D`Je8rwZ4B+x%88e#k7)vPJ@LD;X3-th9av`N|E~P z_zZ)+*6z-<l`b0@8T5utazE=mdDPT(4(7`B^w;K~n{w9EO5KF#9Gf)t7M}Hn%8`uP zrdG3P)Y;f(+wUY#x&}I;jDomeB)9WDw&|xH+3BHU>Yelqp=nCNV3#GI(81ICc@e&S z+(RqlW@gxg>r|7erG!>gjoX#6Wujh#*`o#-ktrWCqkH*OBss)ln*BcHrmOKc2}FWp zn3of<{_?UPfVF;&VbK#Z2RUo27iLfKsO;$};S=y@5)|P5^l%ltY2@XF_kS?<RZ(rN zTe!Fshf-XM7Yh`J0>z6<aSKx1o#HJ8inq8^+}$;}ySqzq4Hg17-FMvka8Az{dyG7- zWQ9CT{`JlI$yBgUnoiy9b#kmq$wTCl;oV5>Ja81jVvuqlXC04(?X+Kq5pL<pCJ{dE z=A671M12vx{CzE#pG=gTxiXe>!5_4M7iwQU{cmr)M4!3<t<d}1_IsH%L!Qh3p<8QR z`!iEp>k**(cL*2`-6s)7ay+qrG1LA-KR1Gq{>&gA`>1@5bAWe}&2seB8dW{lL5&zi z9v>fqN{@VuW&^e-m*DHyVuXL;h0s`9v3xQJ)&1;f(@*R+w;<WKVWhHm#zuQB3Fm%O zp?FW$6M|dQ+D&jYAx2?@=T$WTSN|!Eic&28B|JY7nc}z2Y!!G<D=#r+NjcB>&5UoO zKjiQP{L<a%7ioG2dRf+&ZC-R#%|-|Mkz+rcS93fsJ@K$K4w;!7AxVntd|)DEvFvI8 zrbXJT3GJOx{HXK`Oh0T^^r{5znBme`TWFqkt3hLT?u#8oUipmgvUvThThL-ryIxS) zQH0W$^8QstC|JgAp>>&eo-;RMsV*G91*LpvsC*2@H&4#=B1Q4sRuqFwo@u&^_8@NP zezQ+OlHW=9tpvgIgth2G@5Le|<`+efocRfymd#Y$Zy=CH1Kcv(=Dg8<&|H7?2Hz}A zi&@KJUSJ;RV(;o^x1z@P&ODk8V>*iE?9EbjE2%bx-Zq?Gy=*=^iud&FI%g^i>K6v- z$Y{kZ*<;{*PLpe7K6n>yc|9H~BiV8<wz5@;?faUVnFnF$3HMzm>g*v@C`5!<&38VI z%Ihvb$^w>LM4=1o-O4A3@Bx13@Z|u%7Wg&5h@sE&#z)``PzX)J7%c}Mbn{EGu>Z&M z9mx9*Wx|a7lZDFZ1q(hO<GPm`(gqh=2WpMhYuN0v-Ac(mrDko%Ry4KiAo8Mx1hz`o zSdFRu*IUl+nKWRMiMiVM_K5%hJt7D9#_U4ctG(GG)nO{P7geoSUt~?M@~M1}aN4ef z$DhZ~l!H@&UsD?rwO}~)FE5z99p?5Be82bdFK_<+4zE9Vc&Y4>|GC346V2!T2mpQ9 z_tWFv7_sh{gO_G7cp1j*#ufntyQ!jcX}8!}c1Y2i70uaD7zuj~937>`*CR&g+q?|H z4RDG=p@D9_&rx5Z>&QdY2LrlEriI8qh;sJHktng5mPv*a`kJPVS|TmtyM#LHbmX7B z&Yz+6RCblaLMUTt-Spu~GBFb|jQF~)=SdP^sw~aoTmsM7X6cW68lI9@&-h^a>n=Me zsrJK%QV}-iW|TIj%u!)IZSSyq&G|q?S?aW;yrFEtT;>Xj9^DjRNMT)NEFvp=fx}7} z?fq>f&y!8zv8J(}eqS@3kMCJSeV1Z^$MRGCG6-$C8jq}Eur;s1<JK;JePQ^vWegf# zpmhQqg?pFyu7frg;ngrq4(%DojmYuBTGL&iLp#m=oKU5}@qxX-du3*#=RK&dwYJ5L zVyBC;E(IK`SI1k#2eD)VwF{`W)sZyls?D#Le@?Bj8TG<Sl3zQtL4Q8n)d)Xlv}<lR zkOzw@`%-DIbJs<3ugjKq2SdXLCsg#jTo`q8guxM{t+mHA4-u}&4@F;V+E;XWsK<y) zP~O6v9;zDiuN_&$;8*n(t|j}{ehQ#{!qv?3pj?-c;hhGg84lv6g(CV8r$C3EdQo|g zfvz1#41%S(WY$Imw~DSmD1d$#VGc2)V62kQt5qpEMvt!7%qcxc*uYi3*uag;1Oc8~ z23)VeP@Q%Y1}+G18kx`aw$EAD$e03l%Y4c`ORHX@xd_*~VbVQ02=BG7sNmKzk#}t5 zW&x`S!7149n8<H)(SvK(VShQ`&z$zZUlpQ%MrNWeV;}zV=6`=2c4eIqHYx_OXp_YK zkw>(rBDFt)MIm=YqR>ud|4&UZr8WGAq#V_xnq6$A2J2YT7K69pf=N2O+W_njO);%R zA#Q=*sJ^n@ELc-wZYC!iLLJO-;fs0#9lx22e0}$^(8Fj$$<M%i<VIv9i>^Q2waGVF z<y@|Zb8^%W$HG-8j9gt1D$C)qD?d7RZ$mdO@tuD8Z6fzJcu?#3<k{}`ei_3J=*1$y zH|8YoX)rDwR4q2KmXtwbkxSIB(@DURE{^HK04o}i?2&~34#Vb`fO9`|7=_maH{@d- zAq<(#7>IzXSm&>2G;jwgR$Lh?9MtL+W(uc-b`^TuTDGjOfm+{D9w|ydq~%%Q`m?&p zQ8x2c5IbXzJWO*ocavwICI1*crwJh%^rMFqhSmmf9Rt%W%o}xk^58HN4j&Fl987>y zu4U!F#_}ryOuYDd*rl*N!gT=#A+`kRH9Sx(h(`-UOZ_{vjBs7Oz&=}S9pxoIDrjBl zZJnwO;IY>swKtHq`zs5|p(MK}mvaH!as9NX3yrz(YeyH+`uqbFQ$Yj71iF&0AolXl zR};B5=VwUG2e>cKN1A3^_?z(+j{Q_R8vIpnXdBIF#}-Zx>v_DP5=8kheg3K(ozm9Z zM1Z>ChuS*>6joFvz)PSH9pi`G4A?g3d%vG|MBC>!ICp|-5}y3A!%*ra;MNsvBgH^V zyY60&BlfU|_6R<whay0a4ta}ar+3uzv1dnA)b8{>9HsfRqae?~wYRb6?TD-S+c+YI z4!ON8XomQ05V39Dqpdk?{F{-?3Dbyo%i%I1w?)RtiSYj82!)33ufvj@QyVh>e&*sJ zz)BdW%V2}_@5;3QPO8`tfgQO%RMc;g{@@EA0NO}mxc^fqj_+x&|7~8ya}xu6FiNZ8 z2ea%V=#fpwZ-OXlv(LV>NcCf+F(`>Q6)7EeI6)gJOA@hgHt?SVCRNi7FPt~w5)b?} zplSq-aUq*qf)JwgZHd873>&SlDCWtpOH9)A6p0eiV^Fq#*me(8GFQhFw+hQ5mp;%V z8L<t&+Ws&Ll>JCPlq;qaYijEg!Tr;{5oWq2ETN7g2bHW*du<Wd%CTra^z^;xo)YL@ zU?PsAsZvlo^bq6E+?b*$^nfi&;Yh_)tFMUHo#27wq?pCa^U<>Oxur8eq#oZMRalU& zG4|ItvCnL*@quN+kA@_seC9lyc7M%bH_sbn*P(Y1pR@rUDKs!`oZXH{_4B5iQk(qK zuQ5;;0DzyhFJt(7#NUZ%0$y@h6LdYze$_0FDY7WTi=BK(ZAU&FQEU?kYtrd^Z&eMs z)^p>kOPy{VpI7rw{Wycr9RK^c@eRu@ZlcDKsAqf1(S>(YFJFt@F@{xjTMJN6!lg8| z3uo$hPPT7ZbzTpNic3&mN-eG-ymN`frX%L<vDDLo*_OT@iMa=lJ)*87PV6(W6>i!E z`q}aNlmpoMWtdV3Y_k}gMO@a%mJ7ZnyNFetA<-`f!N|o1^9ro5QLx1IUFRYe@m(xP zb0p63`|2ke%66(P+jIhL=V$h>Ii<g4CP$AO`Te_Aga!Z`aHt0~JhIxKoRTEqg7L}s z4yaSbF_pr0H?Nl+I6UlAy&JB)?^i#&>rfv#z*~GaVOQ>X-$(c1yd@<mwn)b?$;j%w zhM;pLEpl`?IhpNK-e+dz3A0^|ZIo{db7Ge(fYx*D{Kr|DK#RXACBLBlnS`NU);p^H z_4NJAMMvL1%FFQx+CSyL(Mfa82!sqVKAm$>J+3(9vHV1q$7*~#IW*I5d9DWEg7w|W zCVDNS0x5AQjSinZ%n~;Q+U`E`;sC(li1LwtYJ<PK{e&XY_5sM+F}=<0TlqaV9x-hn z=H~u_);85N@O2VSHsCe0MH5n@Z4WZ{hDcWzdLT;Lcp@<#g|+ktrlCBJ5IWFr97JuH z&?medx8DT)t9*P&psB3l8w3ts1Yv$mWAkiuLwkPGVDCUyX05M;ODmuz(t1A>BP^!r z1=?!T$~qrDBqQ|)Y{%KQU59CY@X4Hc3C8PCf4=BLk%p1Wl#=?AdaVVJyVx@AabxAu zoO@_fAe`;|UeKC&OOq1B7Rl4o`le#^Aza3$8)h-`w0quKEkdYdPAhh8z6M#&l6u^5 zAwpgiGAAfKt9MRom`vs&>Fze2IE$~|=%Z={CSj}A5U#pTnIrjgE;XMXh&e<q_83H0 zF6O+-t*5(=$9A8($uGYrg{GE(kvAgeMlI&7MhxCM-s1D>y1qCzVS^Kzcv`cDTtj|E zFk&8QX03#59Rs1ZPGXfrK2zCKI3-FIr!tW3a0!>khtwXv4^*IRmHLi@pj#G-vWF6Y z?TasX+x%S0#GkXs-kH?ioX-_COMSj`%{ZfNf^2o@Q>I)Pb2n+Ey+5L08#`B$)Os`z zOa{bI2jRcdk3#LWUDrP)j3wK<zBybwpB==UItwZU;RalN<VyaK0+W`NGzkC{1bbzg zJwe0C0)wN-xqCAsrPgfgWC^5($d}9gy+HpPnT-2E7;-p^Qf6=Y>loJu2j=R0qU_qA z`Abdy4QkLiio)(_&*UZv{|7mEAkn=(?-#vZ6oo#*;@a>v;jxIF0kt}D7>rkTpTz5I z>Uiu(ITV0Z{(0d%Avt~kg=`M&O}OqS!ULk4a<Hlt;!RJ(lj;F}$zwRK<u^l?EN2ol zcw#gDj-PJ6crZGdoV2POIbMenyNr-EjJSu7B!isc{0rx=(%Kr@w=w7?(2^)iTgBSy z=+LcgRd@<*{TiQmIblQjX^C>9mzRY^bQjF0AtAIBF`4@B&m?a)V6q#;1UWO6hde1f znTb%X!Rr<4j)7C=i*&hSnp)N_N}k@@IT8w=y1HQ*U!R$E#gHl0xGs0p#?hy;U~iom zXj-2^EmUVXZdi@}5b#t8#aNxU>hMhaLDHBE@7etn<aKaaSqv@IWEk_(aS5o?*i{}~ zE*7pr02vX{$(Roc=*-N;|Ey#6)i1IJv-nhK^xM0y^R7s_iy!yt5A=j<KNxQymz5Rp z8XV<?SCp0EJ&J_&;%J0#@Y(I>2rr+kpZ4DfRr&MCR+kso`h!WV)#j9*)+*`rvnc@< zu@E6il5sA>VsJA<S-<_{&P|@MfrXu$Nac=vg`f;WD80YKqIQyqVLU?w!eO1zUQ@E{ z9B={D@N<u7{l!4D4HsO?6W`UQr8}*tl>2(12_~v1f0GAoD?jhPQ?P5>Tbt@M?Ce@9 z*6rSFm@o%*y3OaU0^<cs%_8e}_7}41KGv@)k`|}ZGLwCbtCMA4LlJOJ_oi~?uN3L- zM-{5#07{+@Xr;G0l$irPsL;%Zf;0c&Xwm0<i?w`Z`0>A&;CTQ6thEYQr)H1-w^Ckr znD^dOOYQg{H4hHrKe7f4s^@io=<_?W%=aevsKi}%Ox5<uN%I07O2?OFMlJnohS^&c z%be9vYk}_)xhCISN)R|+0u`T+ykMsdlcYup&<;ixs|KCG$ToLe5U~vf*2be8*~oT$ zp(V-N$5RQ48tlrGKt$v1z%O1&jo;pqOFD-CTq5G-kQRGAW^^MLo6cg;wJ%-`Bpi#7 z1JS?{W$*3^JH>0DV+T+5OZAa{g?C1lFFYSi&GUKzo-Z|uEQVu6hNVe-TrhQ>!PHPj zH`EJE;Ui8rC?T6Y%y~Gh&@;4AHt4nyOuU^Rtom?u6kfet{iF%AZwh%NYBb4I*InJ* z!K@1VP-_MMk56pp7S|E$Zgu#UijU!`*>4@$5YLyMf-KPN2(a^++lw8yta|0K6oF8; zvZdUpY!*`~K{*Wml1m*;-EWttR!OiO;Ce%^b?00Zp=IEUe%_E4O#^hnI39P-@~KRv z;kwFEY(GUVr6Wfk^M;<=?ON%Hs?md5zwW2ir;a7~`D*{v*y1+U!wM02ZBE1TV>qkG zart4-J#}a=NysvX$XsoyE`T@N#fJV>ndlaErk^I_Tn%Yk<F(%8H~ABS?OWmz4%|>J z%(X5Ccy=W5&sIX&5w=Ia1ARdJR786VN!{wOsC-Hz%r7Y9I}I_h1*7TPTehF_VM_B@ zmk|$^cY$yb06d?$kYRz+4PUMU#j!OGezH$jcb`NIrSD~fOF^9q&d(XIZ_h$=pM`}I z*Zs70nBPo2Dvd}PO(hSqg18{`AJ^0$zo8gb-9K6Q?<{8Chnzh&5qbHp)&+G2{=G6O zJ^x6`@AP_*|1}M44;z}D^@X<m0|Sg{90f%n7SD%>poaq-fR?;l0R0*JOCy#E>p7sP zMa6Mh7JPqB#&QioKpu*k*~`~P94}wX#lSguIl^o@3Liis{QGbva1r@y@3|g^mNww_ zi-;``PhnhYlWTw(cx&x7SLI-MCFtgG;`MPSd>@LDt%jc=yUtfU##n`3Jo0VJikXH> zepq}G#aF}98vqTWh9?p&7LE4HFdFkTIMyXLH6m28vq9P!Z|uraO?~|yA`;Jd*gn>w zO&|4HO<w}-)JHF&dUo2dVBIfnYYv31YdS|2Zfjf956ysxMJ335%b8xbK@;=0&e0aN z{8r~Mo@EXCZ~spV(0!_1cHplU33ON_3-$kbK-7RJ@e8tbP;C(xtBbPH3=J2`H?L@J z_iR_mS;`kGDK1*or_Zpo@Th-Psq&fJHq5}6eP);S=tN}YYAa>s#$C(b#uRE%DU#C$ zulLZhSi#CoR4QS87Eqm<-f%R!8FF|ytzQr7;$cy=^w~YM3!$Lc*t?tymn37iwr&&^ z(!CJp^S##SmqNwt{D_R9iQ|uLkRaG5s2TXaLnDhw@xdDl25qCc9*k)CFuvxbC8-)= z&w%R;P~6WvLoaLqIbGMKzr!<=_&YGx0Nfh`<g8M+y#*B+GQ{cF1-H_@$8TKr4`zoY za-U&Q2ev&=+{j29ojY`0INV5+MxUKN^-X^A=}wDEn7%grvC1~G@{%i7dE_vo3B%0O zzAIEG10A!~jfm??j@=@53j?|7%lx|E0-<I~e}03g=c(2j%++Q(1bpT+P5xW8ZWz<R zjKjvwdipH?c3x`>vl@G1kn{dQ79A3bM(z4O8{1TmM41nDv7BmTa${@a1lcHJ-)kG= z>8xgTzSrC|OCY|Y)p9vsLYor6XTbz-Qnr?Zt27;ZbD52>`6!H%Wt?>rWIoxgY3L5% z2b*#0*r6O~l5;V&JNl`j(W%m!_Z~{D!()fB9^a->ztH28c%D>2HhKel6stGRC(?BU zeeYz3%fSyaLBHZ>j{21oe;;BTD-QRH=VeKyFU=>RdQ^rNU6r1P=y4i?k>T+vc}_p1 zdW)0TR!pp$D=s?=t3h>y^6(35@QgVRQ-B?{qvgSy)Z$8m8E_QaTf2hOqj44Ccjfl- z9VaXjxe$}*Lso=>Dqes1I?Rsc`8}22idAc8V>bYMqGNeRXfY_1tdQsMLGWyf=-n*t z9E0yxt;V=^m2TR^_VCwL$+p?$<aZ{sSrU#KSAGU<M~i}TdMzp324y!Fh!4=Vx|#4% zo*8fTc`&kPL+jcM+GJf4i^Uo2Acgnke03${Utg6_-KEHug|O|*tEmehJ$F_{X}+(q zj@8R_I1zWAEl|Om<t@6YC?DtPoSXIPagvvTclb!$ta;5Q)aWbCP^IHPiCy5a{%R+Y z%DF0f_50e;G4ftvWvD-fs{br}UjgghJ2VvnaLv!;%{tLG82iBCm&ts3TE?!z#Q{r- zlA7Rnfz1x`<>K##a4IDJ=HkAxbmmOk+Z$m8^6ag^g0^AXUXzn)FV6Idza^UcScL`M zOIvSl*1g?6^feMS$U;ng#|d$0y~kO*1qt`ZfefNqj{YhMqr^whdJ@f}jPZ3${yRwc zD^&fz7tg=r6VpMTpPKxyJ^VI6kD?-%<9~>S4<-_+lXwgOOhd5W?i7Q|%0xf~;wQJJ zfS;-4)=C554>rvv3GY(#+7b0zdf-MMN){Qy2j3M&Y{6OimhB}Nuzzhcwt9x8X$1Ej z<ET*)^K^c)j_SP&YAwDYd+}q)r~8%J1U^J7;p?aVYU%}0^|4SvZ)`)!05ZAi0<5*N z;U*p0(?AS<TO7Yc@VrWx^vh*b5*#}LW1y0&s{Nsnt@W4gA8)N89wmm5r36<hiSn<J z%UXKlZpZ6xb3m-EWsq0kwXH*%D~e#8Q_HYkQOs);*b%6llmOP(OIsgx=z7mBApG%# zqa+{de5(>@^6a2_l?c+nYjq@P4{4^uw1VQ`G?ap*i!il?-wKsyk@QqF%^fd8FUv!% zKk}pb`QF<$;s8)zBKsoLZX`8htN1v{@VpWive9Rm4C`(<=B(UfYH=%h2-ozrYGa@0 z$@;a6D=;GuBBFZ!uokZTvDJPd4s;ifG7{k>jH}GL-bEcEsBZim^hJ|W6LJen@7=Fh zIX0k7cJTy-l)!XbOz*ExWF@&k12^4+?a3R8^MPz>idTb}>}OkD8?e8Pw9(r$GNu@e z1o{};ag?4qT_up5JgD~j+k1^9`EZT)yqPB~#n!~f9?_@!=NsSWqfNVeCsfM67tFZ| zff33^$it1(#os^h-xXEK01Kz~`DZ@0;Y5ADTLHRmA_AR{i(Zs`z$hhkESf-`$b4a8 z)P*lWxdwNt=|=6w5w?kTnV=D3fMTRC&58dg=VmBp(<afVPt&N`uCuB30#$;nlk#_f zydr{r>03$IuDBSm*3J&c5`n{rGD3uH$7F_N04QuW%Ze7=@r&C|TRSTuiMLa|fM1Rg z_YVb-A&OD52=l5EEF^g0ZVuk-)o}bClC=1?Px}n@0F;b^RxeMO`}5luS+*qg7O%b^ zhE{FH^1-k^Mt4(mT%uH!=66Kdg;eFAfohuNVBZ=z__*|FX7CNAC#hr82lc~3mg(oi z1@Mf!H2RXSei`J!w85)cYizbItW0%StOcc^wuM35w*gMSTs+;7NbIL(wnH+6XyR3V z$WYKh4&s<@Mye#tb4?&)v!yY59bV0xrn^871-yb+R3%g@@Gn0WbPKn1L)Ka>ogBT( zF7kGnFP&j%%Fob^c8?D`HksRV{_gRHn~1@Ymnuy+v;3gEfzlxi%$Ut+Ds*hn@_WkG z20E+(3k~!D))6e7Pld=r4s<-ezt!BM1c046agif)6rX&s;a^zqS`Pt@b!R*JXQN%I z-ipNjTq7b`iXDQ~HTiH7#z41_YlwatJ#Phl0^R+H-EV#0?3(;!ZheFJ^IO(jHsV`2 zT4LKx{vap@*u&rX_80LwFQd$!iMGORxO|*9!>Y0rT;D!3(uOTNRZXEJRV~W!?BPq1 zN>0z$eCI(;KC`)udygyMe)tiY2My)vjExLy4~~pD)sso^v@=)w$2s+#2|RYxj6Y5& z3qL;s+C)i)w1{CjG=C%cJ(2$SZISG08veUJ|Hl>a00fRq#6Mr>S&HU!(+hZ<U3F-? zi+sM*%Y1HJ=09G9TdJt@*T8ut(=Zh<3opIznA8y{b+h4Y^pc35yQC7P`F;qe{Y}wD zFl~AQmzcnjR`J@Eb7wN1pZ!hM%r(KcX*qt__<#HDaGr(s&cMX?uP-{5*p8Qv<22!d z>%w7@zu;S&>8g}Xl{qE?sn>7MmT1og5hRZ#f9v%#RU}CLlzmvIK8SC&G8FX3Kfi+` zlkt5u<obILqXWN+DW)K5!r16lk`lK%1?B74c032_+`M2vg4psp!=Fqi?8S%=h4q5z zZY@xj<=T)`j9r7=MFV8m;o;miQCvH$KdP!F#U^8m5rvzYy~TsP0mj#z1(tR!f|vku zy?m}y6@&o<M&F=EaYkqzHWt&#sqN7R-xL=@bfXcN>yF24APtwcb?EYw7DGk9bR84j zS9euKd~XhgwETyQ*!cK@#&(o<8s-k`YW&N4t=tP|<KRoY8+=Iw-4jK~YCOmDE1u@u zn;}C&ibmcRKh1o6Wo*QpipGD`X${LDAvdtPPV|eT(!3PG(l?7tk8*B68vfc9j-zpV zA4sZiy=GVz2VP`K+4T5?e{sC~(Z7NNqWL2DwxnWHZpYBFElEr(a-H)%Uv05S#8}S6 zI|05NLKNxlV`{3ieWDNN;q!_vm+DTph5UhA;ltZo?-Ymz5HaD2Z_chw;w3-hn>n=~ zrYr4D(@0gXhranS=wWMwkg1<UIK)N3zRN?BTC+03Q2j{FQ*b$rzx%}@<E7|tT*6+% z=k(|4aZw1@Kl(vK+TQ;WLF&1HZu{t;Ms+jl2>rJw?EkOe^Ca9m$n)%S<#Z;`-g3p- z{dR?)nZ|ca2K<WL3#{1_m}V~FWej48UP;24b$twW{I!k33ljdd#GY1SwMCF~yy1s2 zy_pUqO+@|%{EGZ>gHbiC=^E2jRn~+t_%Q}p<hyl7(KJiU%BSSxO_07?79VUfWE=mQ z%kh;Y-djbQ2@}G_cOA|~lVS;DuQsVU1#<O?t#;vWG4B1!baX%6j%5cLTTZLXjXI;F zHj+C$f7o5r@v#BzeLr+e?h`CrWMSkl%MkqbpofggcJU(z7Wu99JK>aqhRvK?SjJx# zpKPH<SpA!{SS(^rCGWSo5bU4T7K}>_21$S+`&jeg*Fuk|M&QrIZnjTt&g>_rzwJC+ zm-l}cBj1lo33@c!eA5C(m9A>K7ScaSMXsZox%p;2Wm}BGx_S0!!ZnStp&9vjKh+zU zPn`w&B>2LjitxyLc_FTyFKze$IG4gP(x7c4VV$dAvU>CI<H1@O{4k1JK8vG~n)j-8 zajEozXhYXSKa|Q2Qk+|`YCa8_r50QnWjQ^K5AmRaA`kO_D(?NF`<!95m<|qgTCIG` znoU`#i?lbz(Aw!{$Vip5h7-gMs&t+V%V45r6%lYM;`zRhVom>T^`~}+ld<pS`&vV^ zwg%>2qQu`!i@x+{<=365h{5M&9UJm+$Pp)i(T@x(@{mF2IA!dS-70}q9L9+N8S{tS zCWz#@_46eir~IR)IDp{ncFst!XaDI_Q>L8fV^a6M6+grsZ=na&+f%AEa<KBrROn!) z)O^qRkA|h+@WMAp`C4Bj3!H->`D0CZP1)}<i0El--TO4e@34Ty{!#w#>}fP9yg8iT z%qi2Y#NR*gpXGhNfDgkK{Wo(i+pxEy1-|%0rl@?k<Dbv+93DX+XpnLtO6mKJ>#nrX zK$RG{RPpf`<9XR)rg91+Pt!a^%)vRC7kLW?)_ZH0Qw&dRS13dSdt~B>b3GtIsig0Q z`Qo;fd`wenZW2^(iaEyB)ufaUmV9{jh&s%MQ>Y)WAu60z;R?lO^n*Y1>*BuP@`q>W zo6kYmoPQ6Rv;=vZZEeBXROW=$UL$kT{k~O4>J@0NN<^+!LO0`kQ9<a$!A#zC+|SS? z(B)<HoXyjcCPqSW669MGuonFK-u5)+R_;4<5R7b<ZZn6Q6DhOuj#r3>Cr-7RC)ew@ zUWlx*V6Cs!)JRfSac%x?CK|NY-;{vZ8g-_br>xme(|~$A(1GO|X4)jUZ)!tus-(f> zO>=uTgIQpndjnuELu75rR}GX=qS;tO5Pj?}N}Si49ZrFk&=d%@XtK(1E2mP<4Q6=B z8$`B9TKI<F@ti(26oc%)`)jS>mbnHO&1jYSp466ruy6ICs!tIxgfU-xUERK|<WM>h zzRY7_*GZf;b<`a2ZmaC51SVbCa_|HhT-|56nkq68w_sbN-nGOe7h_u@pt|;L2g$u- zIi1)L#HF~#S1z6V6+lYyRW(JHIMeULOgLA{29%~+x4qI+wdSd?7R=iQz<-XiWe1*o zrIKA3AD!m#!zk*vpfp5-S#d(fY7z(ORKDIOnERXEYzL-p!-TOMsT+zZJK@mh%r+12 z`rYQ!D`}4kNPDKs`ybitKR;#D$h=8pje$cOVwb0pBKQ>-^5I7QGDeL?zFHe4zPNRd z-d}u2-Bx~AGK#K0*Ph|^^e?)w*YscUJGJT35o8k;@#x0vGTUyOZ**7F*OPL*OPjpQ z+MM9NQag@S*i?-l3-pt_+|0MVGQ2xc%{Uoc%u4G(I*n4Mh6DcGZo912+jR`^?j_%M z)z2_UEM+-JR(Bx*<cePs$es>d=BKfl`N@|&F*LE7JL?an7ww$;U68BZHN=oSaZ4?z z{-l?!cxacQdP+U>+6uk(|Hbz$YUF=R$xhAw*w%InhP`S326_G)2Q^mwF~e6-@;M~@ znPl*yzk}qB``;ytK7b2EwbgYeiQr*rp@jM3i7?u?PKl>@q{tc*m^w>RR#&y~RK_L7 z6s$0Jrj2Jr_nsI0U4nKrrMgYCxT>PawMkN|nx<R#5ifmMyn&k(Her%h69doU_xzBW zR_|6XJ;C8ne{Z0<tZngHZ%Q_n`nUL!Ld)U{1V^1t;`*S8Ga24P8-Ew-_G26cRIL3M zZoZQPQSK!))hNToLe&UeNxyc5A@eFVjU9cLPS`Tst0dT;CS%Nv5%|D<v#(G*a4bg* z=Mgwd-xk}HQ(6(sLlS3K58EdV=9PI*n|?vxwyyI}@21#$D|)Z1OY6H>_J2D{OyHHP zDta>EsQ1TWI9`{<4Zu6Qso+_<0dPw}lDrNq-Wk?jRG}n@(Y^|FI*>9Pg|APl%&KEQ zoW??DXX^-@^i+j~Uk4Q(nT~49tIx||w)3!1io3pBA{7LUHGQDyGPU>ncsQ`v*}!1G zIzn$_w`Q()9r<brGfJzUxeiKJ;W4;W^~v7YJt~vRYir-)NXLSO>&EWv#aO)sfd?nO z(rJ4B(-Kp@5n<XSIw#Sr_eH01=Wp)$`LV_qpsO~ybMIiBW|_Qe7Pg&m=k|2T(KXZ` zIaA!fVGCp^Thr#>gv9FyK~oFiR%FX>>_wU8*OUB5UpyWPP@N4QWTl-Bd4k>v6e{5i zo7Tok=_usBi*;tL2@Six!@)mw5KNdY%573`7+BO#@KA@wH!1WvN04Eda~}g+CGQ-N z+XeYe4U5a2Z)N;9iPrA#ltr%xgmf$L|GpRF!-nCXNMA$W>Q=zt!TEny>K8~9j0T3B z{=5qQGuAL7`|`Q{&O#ZwH$Com=mNYqL1?IR0?wueSqJNexp$Pky%>pXszWJlwsrUf zX3XJHpvQ(;Xc}dcv5i9yHnBODWKmqSOb;*1_uxXhTK#f`+j<gIEQqksn$N8y%#2n) zC0HXH5k%lsDl|`(r0=|p0Yv>G=!P#pv(J^H-n7##PCz8b=)e{0W@LkC@~Pbx{y1hT zIm8uDr_?Fxg=zD|39Zp^%1_?wvGsGY5Mt=ObPJwDBq6aVS=8HIC{>bG_xKoIw+pTB zndeYF8-Sdt`PdD18xL<bzOU6s)n8ePa~@4?^OP2L*79!mG)+CCIWyRO2dYVU2p3}+ zj%cZTT?n#V5aRlYC&B<1f?6Ep-))KJ&Ua;h3@qJ=Dp>sGJ{IUsrkBkg;zeB9)A!pP zA~n12n7JR7VEy9D6!w`z@AA|3%S5`BG&1FDdg^pTzn;|VG(Dl8sKBDR=FNUqUHJ8h zy|+=4T`r>UMlr8Tpf*Q#2H+TIKaMOxQ10*A8wP5O?^JYKlLr7D)5AkwuVV8OH%4~0 zHB#O%=C&UmStq)9My@m(3_3D-K%y^BES4VBaEwzyw|Xcx{4e395z?H{3GS$0VoKu~ zArXl|rM7-3m&<y@oxNndvv!Tazc~vG2R*Rg>x$}hJ)J1@%PcO=?%YHv%sj<Uui0jd zhV{B7?^l0?hOdi1q6dY#nme23>pF$%B@bRJ<N>)82m}lU7quCJE2lyN4Q!gc%68LA z1!r%e1Iz0-<+s8Y@~kjXAqv@l!i|4W^X(tk<n3_mp6|b;8dk1gOvCzBbQ0e`qA?F; zY9O2cek>KVEZYBW9CUq;Ipv@WvCT@Nxz^#)Ejb6sou-hjlrJu_Y7!wC&QB1g<JB%0 zom=mn+JkoCa;8_ek+2=L*U1g!F;TS(B)~!T357%9zV0DQp)?)Lcp-?@?A&A7a?|Z| z+d*)cn{yBI2$e5PW$R0jzZ}u0ESK3lqe$?N3^^a9prl>5<ii~P5xluTvf`WDhZq~2 z7uYyPy~xVM)u(lc1OZxR#ky8MKgoET-;2W;?sdu?ABv2kvRg3Wm5OiV@9F_o(K-@D zk5!`;p|dBN(V=ADfl^`Mz3Z|X!_F}xohm<aBKF1uIM9c#t7H>?2DX-m@Qws%`0K{@ z^9EJ;#v*8miK8dq4E(E?)V&fmMId{d=DpD1l3#NZNzxBeIEJXx;wR+wYDd}Muj}u# zc*ANSxt6Ki)`KSr!VByGl41hs-`gX+tBF^`UYafx0HO-Q{sxmdf4+_046mbCy5w8* ztp<9v%Wok!y5Gm_>Yg;Lm>i_mbsOWy*iGXsA@ro|4@<fW#b+Z8c7Ry$wp}*>lUx6L z{oTR)0x)fS4tFStFfSg~5p3HAY$FzuzglMmP{TiP#RlwG$Hm{)D9QM=(CL@m2M}@e zt=j?2jn5)UCj-+|?N+fBNMtYH^L*Hsakk(Wvobtp>K=y`ZG~Tm&$iI+z3ST|MdgsU zfp9)jQPbPYh)L~^UW~dM9-sB(pR#WNUI`xs^ahT#pWjN>b&NM+D=O1v4n&G4G?wK> zAWG>`YHVBp6W=K|L)!YECjrmr(ZWv?-O=@wnE&fQ75S4@D)M=vRq<aQsNR{d1J(PP z<O=)Gfx3}LaCf!;bXhd+^EfYhljRfoHFx4u8SmNBuaAm+Uw#tq%&Jf|zEE<2SiUs5 z_K^NDm_m%!yZJt2Ov#{tD6xKG30^aDF3Kyr?{-Fp*KD3<8fi(3lbAv5RAW%F1k9`P zwZ^ZZYmXG3IET>MU`aKLyK;?`+bCTd5TniLHKjVfvo@QJnI77k>n(xSvG>pn7x8XE zbO^8H8Y7i`0kqi3L;==f*_olKLRMF{-S|C$w81>CC|LKR<2N_zf_sAw?t*5I<*@6j zy73WN>rSR!^btLJZQ_ofti=AS)%udM#rn0kYF15?x@9YZ6{oI{`5EAKF(;)VrIvqL zq{qk!&?R91YXi*!NY?Z@<rV{Vnv}sH#pB?HUV8E@gJF&CtjaHKlqRa16-DoY_^e8u z_vKBo%<vPI*C$`kcjeoD`h5~NVL<!|(y#(x?aE%*kpWM%&j}o4p<eo^oNZ_2DMyD5 z>|vvQ<X+q7;B!~Wr%S$lpL!eJQsYTh&E-{!Ct5ZqqI-Ml5FE5Ag$$T=q-7(qQrx#2 z1?S-fyb*&_T4&M{gz=3fy*ONZIwEw^Xo5c%j)5}`!M82bGnjpGwr|>uFt!17zez~s zfC9@b<x1_mF(fa6X)ra$t8hO0`E|N=&-eC}QJL!p74BwVC!v?6{FD}szExtDZH>Kp zY8k~)p%ymALd188Na<qNy;_Kg4GGT9#gZ2;5vV~${2Y4g>FNoHpMO`$P~8t^`rVE{ z`7}hQU;O8z`u_sYFObAP5A55;tFgcG5dSSrJmvg@U8_)smS4lZ;)~Xgj(5Pv*aE++ z?dP)s5g07(_9?4nsGR+w?nH#4gJ)ERW{VHZ0hiz6)-F3vNq|>Xx37bZt_xGh5UR5@ zJ9$tWEo~bIaLa3cp;b!rVOQ20KNZvDLyGw3CW&jO#bkun+B1fI%yI<H3WNN?mgGj< z8i>*icV_a0SLy~5F=7TZ3&$!fk0k^IGXtzD*7$uDak!zXn7qB!%=uk>r{?yB*}plz zPV?z&pf;)y5Z6pY(~FyA4GP1HD*ca^gHiN1HL2_A%>*-bnO%bQwn~((z{||d<9mgO zDHeD*1~ctsu{YUG9_#CdyX@|bvrl$q3rfqFu=6u2Sk0u)r~C6sR`xO143JEGcAf3U zVOGzoZNCo^1SG-e_}%b2&1Sder(adQO&0Gbmx~eTlzEWBA>(Oufp<%S!8k?%c5gz> z@B^C-jj%M?mv&Uo%Q?xGm6WT?H~S20y|MLoqgQ*_CpT?7jnf>H4>6c_+w&53SVH{` zq&45E)K=ERI`f1@dmsjSIKjM`{rQ-Y#6XOX3fDaSvmTb|Hw1PhrI8%1i8uD0i*5OJ z{!|J(auZ$<F;D65Fh?8aKwDB|rtqUcka1BAN1U-_l%^N^UUljrkn4A}I%c1wTd*6> z9m92>M>#|P{Ej<dM!f&CgA+vYvMV))NCncs)gD-xZd;CUZY|JcI8gM-qPeb@BAGR} zkv{Na6K4Yb%v#VZ%3#<(>76GlWBe;5B_d~iD=Rn1hLx#t8IBLP=NZ6%!%p<+PQt-r z5a@mD`PZbc#`QnytMzrbHPL^^(sl?-z<lMxS4^L2|KNu6GTL*Zap*4SF?RiVRoRal zFjEtRnwI;c#u}9vfunrR-cBA-3E#7+(r38Or-a7{WBRgFS78BL(%l`x(B~!2?b<r| zy+&1;!YF-BA<&SFIkOqA)K6Q>&4gTvNii+*VW4J>u6YC=d$}?OWLe1e?zb1Rkscy; zCE=^!qj0ruO$BYD`LYtYrRCn2jXBAhaOGcF(24{;3|KX(4Rd$mlm5UyjOkK|pGN%c zI;2wV_5ZX0VAW3XZ>m0xB}>*;YDL&$aM){SFFL{xx^m~V{p)V>kDK#w?SHxP9hRP1 z+nBnPl^J`iH_>l~CuezlCQ1<C_1iW`hT0G&O~TS(wp|Xgu+HWWp(%*uUK>K@pQrT7 zXdpyk^cg-ShZP3pUC^HL!u#C0?fu5b3i)))9^(X5i*ch9t&XQzk6Pcx+d~O9f_ff$ z$~Ma|e>=7g^4Xg%B7I=>%F<or-k~4qU0Ix7>$;|U%Ziu$fLRVdB=)<*!kQ7)+k1B# zzh%v|p6?sv{#cHo2O02*sWBX%^j%XBBjLg?g6+U55h&;WyYOgjVn@B>JJdde`XrRb z4aQcjciy48?cY~`Mf?$jDj^<>SQ=jwbu_O%npdZnbF5#?Hvk02et6%;I9YIZdu;1E zK}Rpad=>y78E0Xkrqym`>N&Cdn~zObnUV}s<Mio+CtNz|vTtL1-2~EQt0%IT&;1H8 znm!JBG7qYWItE+>M!eiC&>Al(Z{1CgZrv{M+cOaDj{%k4rY8O!e*Q^YyoHc;Kp6jJ z4{!0Ohqs`lclh?Fhi{)n61m+4_#7`PKP^!`_PHiY_?D$ucO2e!!DGKTy`f$BRL55m zQ)XCjKGB7T(V>Qf$NrHB3;ByFknfw6G<oj&n(h~ga{<&wynxZCx*+NcamuJRlWU3F z-bG}iTD)NS>zpiS$KRbzToYWSyle=zWJQiT*##e5KSZbFDHzzmkU!gV_+#i2h#fA+ zqOMe(vd!7D6YU7erIC4v^?N5ng*)Vf-CSDnyn6>yJsepvVw^z@R$ER!QdNRX6n&q= z9Q@kW(ZiUbHLX{M2-yB|nGG~E`)+Ock(9H+pW;^=onv4b%u~G-d;!aMb__i70+m0_ zHCH6CmDwo<@SUk;Zuai_vjvV;zd>sVR_xyu9EbT=R3Vp5(uWORr-L#G2Tf0QhZS}m zm%sPAH)~oMPi?ciFvxl<0vm)KGTm;m)}<d~O%vQ$LfP7S!F7#yyj#h0AX%;qvvEXW zOWQv0Jug&MZJY3m*h+PN2oZ^>lM@>-)5hvzc?<L<34vw)#U%|UY2|$fJKQbZ5em3r zY6;{WulXQFn)yZHdoK=M1hB14&0Uq5UsV=HA&}8Eg;^gw498-X{2U1$<{}1ln;;wz zA#k+9K*{Z=v|X-R?-G(1uq8GkDepwJ#|YFPdOeKj35)Oi6q^e#gnsT;tz^jY#HNd% zzDE=xOqPv`0nsqVo<m?98+}q(`j(Yx;KMC>bIdV#{c4!X6SDq!D=UP`jmh?Z#cA-v zD$s}IzaP<mzp_F32YXU}{?Ur{4>eYYwo|fO0kgk|-i`E&UgeETa7kPMOC#{>ie8yT zV0%DIHFFN5&5#vg1*Y*E3)Ob%^z@fF`X+85S657wR6d8d@PY1YY1K{K`GbmhE!WaO z7CN~S>}pH#D}m8%wm<{h5Y1Josi?3{Cp;q?J#=7d(4ES$mK!im==3-!I~g{x3T=25 z;Dl%2T0?fdSK2Ov!GYRHipi<Qrtvsjer!b?RXxJ2SSM~t3m1rPyWslWt6!?nvs9*z zS+MX^1j!Y7PI*@_O@>$L?n3U*ka3KTSM}h>Y?G7Kg{IWxdEV;i)u0z%gSvp`@lj!I z<zKlrEk{Q;6>iNB;c%Ebv%oY(r~&;_V3JFn{{`KqR0_<`y}-N^uIgLa`PBQxeWg-< zq?eWlOFIyNR^yj;l%`mmX!^{H(~*E-lOePsUl%Z!cap_JuT*FD5H5TPzO8N}YP<O+ zLcCt*Hb?gTRq^b4xcythfmfAHPv6*^CA@7@qhDOKzan*d?*kcFZ`KRHcDrDvh70nj z+p)LYHU+^A1X6l0AG0{*2w!=0FX|h9^qxFLf71M_c|oY*uR7oXn(E>Ifs#;mW~N<y z8oo}q^8q8>`Nz<v+%Pgo)jhG{m_<Nt-&coxNY+7s;^oKqFC`>@N;44J(!+O+RZ;<r z)sva77{>b272e#=pYQQ0iWJn4C-hU#G?^kNuHJsz7Jp{F>2a3kd;1;L)0SAMNLx?( zHi+wCJt@QI*);myO|0lu`Ev%nzaD_`e>FJde`@me-z)Ghj+XzZ$yxNrUKjs+fasGq z2s&7BmHnR6h!|LW$Eypd|A?YEe~8!(jEn?c&j<Mj&X^Or3FR271)1mNOn5*uR*p4L z`FRh-eGN*sY&zZOto2ax*iUR?wBhE42jJ(jyR^$oQaHQR*znS_C@YjES2U)8WCOU% zM$gu|byG;B944&yOYqp}C+rHQWA3xB`o^@FXUz`as+}}3I>hj}x3vi5s#x)7%>ohA z;&s6d?g1r)GeCW7W!!+tXzT8cl<`{8!ZPrrtU6|Jd4!FJnVwsKuxE|aPebp}pGUG= zc9O~S<Cx`*os*Mys`kg*F}v(bo6=Fu+mGev)N%1{D3cAQ!qzvzyuqdG%y6l<HrS3) zmpSZ4Db?XMvY@>Slb1M><IA}~R$F+>#*3C!lACv%>^=#4*>m587aowUwvJk&bJcHu zbVD6PS?$O-SeB4*78I%lYITz4dC4mbY%UcO{m-^-iC5AVmb4*Jy4?x>(30ve9b2Q7 zbsO$|=3!u3N-Xb%KANb8tRz(*(R!@bkXQK(_AbxAtG3#39WS;`1x_q_nSP;O+-Vcf z0C9VO<Q&^XiDC~t1jNr>kluB2ezY3^?6*V1NeV^$$XMduV#R;1B6X(rLlWlyX<U9` z2~zd)9!9;Y$SQQef69hOGWq~h_<JNWu9{$jJyb@$V}&G=vl!omtGw{M2)>kd_g2eL zr`2xlcTO07jC$f_Fx6@Mh3t32Kn=Gp7%vnQ)(P7@a}A=wfGP)2K4APDDyAKLg7xHn z`1Jnkmp3wGDvybOlm7i_rNv==3_!B`-#xtlXbF7(EJS<oGF<s51HW|+CM}T9d@d7x zT3x^2kqI|R&Q8irZmX9s+t(B70N2|X@D6ma`}1ORL@e9R@LXWPC)ps_xejaa9(Q^f z+-e)>OXAF>uuD&uFS&vbBN55j-RxtEK9yh%zvSJ(u52EXV4EWI3N%{b@6b`p#;#lh z{SGnK%P-VOHqUu#qUivCdNV{Pb~5T1mwbx*l`}zl`Q;q5RtrFW_*8=pIqg+rIr5CH z^6ifii@nZ#Aw-*vh@lSL)U09}Bf>Cd(*$<T5Q0LJO8Srs8`AUL=3^<7^En+N*(M@S z&_Waiyeq$%Mvj<t^yKzdpOlSN493Z<pxE$T<dn&0GqW%U%d{GQ<Hzi2`KPU_G34md zKtBa_$b6|mnqqg)>NouSx?d&C4vm}<eNRPA*}of<d{vASg2e2kK)@7&!%nASO{G-g zn6jTe8E<~2zCT>t`jASDW2b0F@~({W`d~kXZ=7eXPt$`>(}_)E7)jc~W~)gL!^M{C zh^>ydL7-FfG7*6NeZT&S_x6zWT?ZAqmu^YF>{d{vS1DvEPzLAwhAnA%O5>(bVCY4* zWh$VZY|9D#jA+BLK2!|xl>ULnLp%?N)=}x71rh%(%*wrMn3qHR^)|fsqBHtqyd}=u zw+C+??(@`ZBk->k{t*Z9)03m-yKSUdCBcv_Z#s{t9Z7p5OA$G9rsri~6x9zs;={P% zF&_bt#vmB~wKFrH!$ElqhK}N{Ejvq6#|PfTMe+8qKDB3V1bZ`k(caCB>GQX&kjweC z`vD=pON%vV4eR}KYvBK?)zh!A9=#=?2lwC2j9{fI{Es)=Q*MR!PtVjkhwgJa47}^M zfC;yhq0$*S5wxXkbYjpoX*lU<*&6d5O^#8=o~Hs0Z%hv>>`L^GUZ2Iqpt#_iB2;wR z2Jr)fqguQZv0GhCY4Z`BH2^kYXbm^XjRD-;SgGj^fL9YGg!iC$$mU`XT8v`*wTje@ zp4@Z+gjVTY_0WtPaP;Q;;-o?PM`cyn#scx88!fBFNnV6zUxNWQO|&-6lSUVQ-7$^N zk_zz^)g|6_Na0;c9B1yY?}Bu)PMsFdY&sQOzX=sx=FRRaTnVr%BD$jz3+v&mOUNU( z4^&1{EzNz?6SNuCm8pF^Tct=`03~c>Q}8}E9ADEDJ{iz6K&^c@Ty84RV;ga%dFS_~ z>v)W(>r`y#mz@wRVn(I93y`obyFBId&Wye{tvpFVjfKyPxr4rUyLkrX<bdD%%s{rG zcdc`*M-}@^&c+7w9u0lo^@;>{F%%}2z8FTQAc}gF(}$Se2wC!puFXU}v7TEJmkUPY z^u3Gvufl7mue{HL%YueCP7hJBe9m2r_39qcYH$QM_qMi4SQ`O_c2Nv|2In8Yh*BF_ zAZ5dBv=tLCI{2sLR7}Y0{5Mgy0c?c}WKpVbR>ec8;m!seEgsD8AB_DlZXB2n$+q^w zH@A?4aRY8OJ){T8Mb4>{B@o-|eT+GhX_-Y6?u*b^*M+KEU-L~Eez17McxRTf5luR< zr4WTdLJNGOkwsMqTHrY)Fx$Rhd=(R=?j3k5a=)|ecO4p{ecA9?<bPIV#-EC`=>71o zD^l@~r6tAh-3s|X6<Ln9GyDjA2dxmf4-$Re9{0s33z-ViZ4o<uA@i|`sGPn0@UnH* z+)gF3OdKi`iS7q1gXa^pFGI}nuK*UoqXjiM!#94D$bVyv+E^cz)yES)hi;&NC11$6 zGK0mgs5*C=k56CwPTS?jo_pPoibW8wy;Oi=t)#L>TsqXaEGt1}d8!)qBT*zK0tY)M z(PgnfhgDN8oh&0)O#|tHzR#4;B)Zv`(aXAT2dB7Q)i-6=X>&tWYotg<3gS7-ibFn& zvSF;5v;_hk^>RnH9#xxgN7IYehxSg^sS$-yEqO7Hxlg*k3W79R+|V(+RUr+7ntCab z*GIQRXX=XTAN}o!I~!}eK%T$dUYiZ7fVD#KgQCZ%p>yd1ONIHz<p3lFmM&{yru(B{ zhG5%|PKX%&>AauBna0ZDX-9%b9<BrKrqpzzZ3>+H9E31SKD6eo(~9Sqlib&|?`!&H z?td)pcQ-Q!`IjAyVO<b^Y(*<)bj_OeE}hi<AY=dqBTpPS=`qx*8RD*F8zrV%L4O(z zh+G^pTm&o5DZk`wS8f@MJYmAd6nm&U_~CJJ_<-U=7(s)w$L>c?4bgp1&x9Mr^2nbo z>7!kAy^LeQ^97?RW=_ht3eC?=h1`=5t>eSTZ|eglKgqN2J|ln|=7E%Xj5uje{VdKt zOvR95M15p<PeC%X@Sh_bwKamP@(g$I2aNYjqVnyUBmHkbi}@>PnTnmPZ`G%*Om;0Y z!x1^ZjUOyZgK=h0$!J(d@l1&1*zc5+wkZxyZ`ZGO0MCh{j|=Obx9fFy8UJgHX@~+t zrT|3Jg8$V`{pa-#n}6bnwmxoV{DHF@Zc0WO<Njb;&_zfl#9!n#9&lKeYlF2gVpwQ* zm`2YewV3qv2a^Q7q3ExRW;omQ^z`PGa`cX@zQQM*Lx+M2-YfxFr+G94jY99R)LLvl zDRI3)Nx+)24Q+1Gm|dhW8iJuuX6J;s1)~^CUpal6J}zy%4X{~|w>4}*2b=^`kS=Cu z?ZEIDT8z^s0td|~C<v~UMBEC<-%+AZM$D}8;_7!t+N^bbp{CUSp%}4lCpYf}&+@v? zp4pTJ*CH&AAhYNpwd0Acl)BOZFy%@>x9AwK>h^9Q4p{!=<!n>f?mhU8>466IjvaYp zu9+-xzZDokTAlzUW1qca!zT>1!Q%hWH3wS)=rjoYoyG>?W3BAnsPjwX>_x<M(T8v3 zSw+}-bDE}`WA`j==I3j#&_iX*I->iY#gA*Mo&wcI$g9t3tVPv-J5tB{BML8d8K0HG z8Bw=V&-DEq;9!wF%%WGIVcmUug+^H(!duhe#`wYHvt#}1Z&}9Ix}ChAuq*3)9d2ww zULUO|8s;nJ9t6vX7OF!j#BQ;s0JVlMFDZhQ9%bS6P0%bJQ?e|6+RU!<q397qb+Uuc z4S7cPXp>KeJuRGFWcos82g!E!zNCrYVj-Mor;Mq-@chBnQvD6CwMCGEeSg@=+2a2& z_7*@<wr&6L(jcYMts<hdAR!1Sh$!6+OLw=_f|Qa13X%#)$5KnfE+8P?xpa5;vhZCz z_xpVF|K9ud|J^e?44liw><s4|=W+gyU&Lrs-Kx3I5{Bl=`qr_brO?g>VkPrcTGlJ3 zat5+@xh&*M!Iz0Rm$>VJzo6FAGY7q)Oun<T-ZyYN6|CnEp$33z-vt;#LR>C|lK;?` z{_T=vz<1*+WX^~qC~-r^I;9O*wmuj6ekpjpq3Czbordx##VUlk!_3*(HkxyTk9Bp< zr}_g`8q@DVnR4mq3$=FFg37Agr2E&pQBr!NyFXS+=-_U0@X-*rX%7A9kciq^8CN&C zJJ#36bcscGjXyJ?)HDSGYI8m?FCp`*Dr3s0C$-oOuk(ispX%UM%cZY0vn$l*LbNw~ z%rD)gQx$mJyQCaR*asfI0*xv}un_!GL#e4JlEB1@2oO!l^7$D`nXp*(fV(LzuH-4E z<QTnxH(&k~&?9SHYsg|3h-tA0R}$AfBO3?I0+8LZB7!<=`ZD#a40B!w@y5*_FoIM@ zDpVw^T`454ck)Vonu-Oo*$mfU0?^x;_}UY0Q+=PpJqJ5i-2Fix&1ZUt5ezDuq{u<$ z%2!VBYe4jU$4l{S25N@_Cs0vcU3QM#P?4XO?UFN04xTo0?1({Yi^Gzl_7Sk+f@}(z z2WRc`7O{q{JsG%@lF#>jz-Pv-2G*{k?|LnOlUam};xp;nCu<FS#!cmtUZL|d)rscT z+=dbS?ivsRYcUaTD~xHl{9s&E>ykrD;K;B7%J1KU^Col|Q4l7;b}^||-H7_MC5g*b zLB<qhRXVG;*N(H784h>e`}}A#C)_$la&tOvKP`oU!(q1*dt0AI5*>`?qi!z=Vnj@( z%6XMdb(jmWnoWG~TT-K(RT`*DBJ^|b+T1vea_Dqr2}i0Z{1lHXS5=3&p$PTQIi?=( z<b=boKfjBbt!ZdlWb!<ihogV#&RpfH8vcQr^mZ=!ApjF4WB*?NN7(Zp7WZ^+fF;<$ z!|MM~xT`$~UV{8Kh9F0qOsH*jSkO^8om7m$GYOWrAB$mFw$}E+59&DasB25uOqys( zq$|lxHQB>xyoLu_-L#F_UQBasT<Cy?`Q!$P@{h9vxi&zdG{?$>i0Z*xwZGH(y`6BD z1-G7cgy?f7(+q>j^SeuI!e2$s8K|lVdDdw^Rw5dBb_TCCppenFmMEMK#3FjH=%AsF zoV&=*gh@rnj&~Vl|K5orC=h~vhy%F67WfDukK!GhbMWJiCJ%kY;dX&sN(An^c=h)r z=cDv<3Yhn7JcNI~`J~`R)l<(eU&VcH&Oax7b}6n~F++GMAN`Ek!^JrBs&W-hgrZv5 z8J+f8l{$frp`<{Q8pl-Sa=5)&1xY!1aP#Yh`VX<Rcat%~EVkJm(^8j}<NXq_WJgpe z4KXjKYtZGr;0!t14vPTmP8<6u!-pe7T3QzFZ$>z@e<)&21MHR=iSeTyRME%kT*?qm zh>v{-VqajRWK_(!IxUyK2xbDAT}T#ejBmo+qB*ns;S%?Q(^T<JjQN62j$#$j$EWFn zYV~%6h_gE-e%-`=P@VcS*I$rAa%SfY)*wS%zj-;lwz5o>7TA)**^l(WU6sh$78Q39 zXBKP^=P#?RyY?zyCJfy?&3xqT<ICx}#r?SMp`$2SrPtT#mT&=YbVR80hdz7$CyKqe zI@q2w;IEG(Q@?i#B|LGR1(0|ATXujgg}=|@YxA`fYsk}>MTw{!9T0=VZpEPH`0oX? zCcCEReru`GFAh}24|lGkSRiNsYWe3PX>c=x1V8;E_xj(_QvvrM1K<gG!)1-|P5U_| zj=gfe@LlXU8FIGu-ET+snrq#f#Xtz*r7&0#ucodprAYe_$xq|vZPcXEv>!>L=W2b( zM`tN%XP{Nqgz*N8mM3g!6z|2N;fWW{+>SynB0STbdZ+^Vv<9$#+7>jD9}7ASUphN- zw_dM$>_$#f@+M?DW02bxY3hMpqbca$`18b1nT9${e`Hhg{-|wMXApHe`7<>vdwU|1 zlF9rHYKyX}aK6s#jk|9{wkJy2mN#NP!K7jk8k`rv^o~t!z5dob_m}HnT)lOPY<LLH zm^4feM{&IOz80}$omnA6C!ru7SA$rI$7uSo_+$eO8Fbv)e{s1tv^Cr8#h~?OGt~&{ zSP34kv{h9u!^=aO0UbrP=Dvf^;2W(4v9F&v@c8Ltxi<|lhTBo5X8Y8ht)q<+yvAQg zSNQ2ovZggooEQ>~bUKZXtgyMSR>s3PS2FzI46{Zy8uW&e$%9ZkD5Kqu8rcOqmBa7F zg*USEBw$9-N`)ijiSp5F?gdKiD%f)>d*TPZ$%N^6&l$esX)(_PLR1~8PWCw326cWC zBJeAdVYq(5!##HNhFg4E^%F1Q5K7A@Ph-_57h#a6P|eO)i)e|9)-S2S^gr{j7F>eF zS(HX2dwDm>d3?XF=U<SVw<RxcqR#E=fp{<)&K(4Xm>R~}Bl@|eEg}*gxjE|>H1S<K z60tRu$D$%}&Rpyte=XhvW&U*FIy9*X<o^9SwscALJqC&6{ll!QuYua*<TKjnTEoM$ zcT>CYRfrc*N{_|j0iWvF|G?>gAFq41-o%Hu#_-<%cXLaiH}D1~L{}${tNAxo){%+q z<*T{b%f%eAqr7M?S+!O5Cz=d~XEpQw*~t%;?3nS!Ur)_}3S!2po7^zwqb5A8iQMt- z>oS8{7S;DDb!@>>wQQwtb#ufl>U6ZJLc`i$f!t%1w)NJmoAg=+gb-2|cq3dxY+v@I zBpK%3g5D?!Y>bKKn$t(+>uO#Em)M?u@@m$wu6Fkib$j_~;ak%cO!4kc@2|;czka~k zo(fuelj=#G&#D_xHU!YYwPP$aNtK4FXiL(0oBG@zq<YDw=2Q9)o!gebaA2UnDjhMw zs}{&y{PEa1Q&&V_YgQ-c*Nm~<S!?I@%-5sv<pteh`E_gs?w_+R8&I|;*nV9xD1tRt zwPKvRezxtZ)vpMT_{d=rZZx8E{Thi@+Kl#|T74~{`P#QQ^5VII&8C<6@B@36Q(1<O zQzO;0*;S856&F8fACp57b`yQ8RbqXr1@O&HbA`=WPH@L<r<fi(Zj%m^{<Ig3Os)nM z#F@5z_egBsSMA@PeEO=(cAvU=`%DL)4>ImuXbhd^%^qiI9Nxjz4KchP6_@Q{xKCp~ zSBK1VwbTL#i0Tk_8i@<}3Np++%lo1CnZiKecV>dFJ72X0m^z3cx*&1FbysItt*;co z=M<EFJjZ@Pg%>9El$Jbq-<wl(MjSnf)nPXd4;=AvvLGm`;?u10_%L2WiQ+W8=E@R^ zA9+0j<~&T66^=`mt>KHIsH{~vrmKo{AaIW)8CK$!J{X%tc|g{rXO4Hin{|L8$`gOz zjW;U+4ivy0XqK(4`wzVTzaQ>UUf>BRuOruAF)@bNVyI>AE2PEs7UcRjJSF3!T_#HV z(=7I_l6WM5Imd$v!yLBoti{O820k(XX9C+=wwoib<vX`xno$h=9Y%>95lGO;JoLWq zW6VNfrki8KoO{!fN|?)<)&|FL+jb+(T%^I7Kv|2g&_n2!fV0*w-XCH-vCLTHvkzNb zDf~61#?{rc0w;+>PLsDSvu4$4QbbW|Ry9?j?l}n=Gu)jU<{PW;t~ZLmUP~eE#@WbU z?_`jah6T|Q9nxBJRTd>DzIrR_Q4P~Y!tFL_ePSlOmDx50*T)1ZVfK!;n3;?Y?8xPW z_|bYWpi*P$Jb&;>9o?$eT5wc>m!N??-upR-zow?~{QWxBULoA<I)of{woY6w)<a<j z<814tZf4!7`N<Hb01a$O9TuG-VX%>gQJ7>VmoND0M5M(DD;6OHu_)_F2syj*B3HJd zbv}qk<I7Sr+{U)}9+Nue4KK@`edzW{bhbVFgTGSzmkXd@v8W3p5~>oQQEXDGk1L8f zX&v`cP2TrRl)q@DvFmPbH=Q%L{9;LC$YI0IEZSIhR*pp-dLbe=yekFjeSAoWM;$q% za>6#^t9(q=@#88gegk*6!_kR%LlUizxSCF!5&klS_569Eg3?M=Rnh`76e=0t=aK(T z@u0~Xz>U2NoZjp77+xwIVPTvFCzsL60u1*j;iZM<Wl1vp1J;P}EFa$td*7((_%e<W zRI98%J34je_o?W~9_jTjvS|2q$JOoRl|MwwKHRgu!7HtmR%rje1OIttkL~6OwwEh+ z|9YS5&hLaSFlv0)_iX69=Zg5HcX+_H_18BemBA<3Ebr;|D@Me=4-@IKkB7&?bJ=Vc zVOaDPzj(j3Oyp`<CktoBjE9*+X^0Ppes%+J=kOM>S=h9LTHSbjt}w&WGYo3F%8W*V zpT_}i3bAgZ1+G9>xeLrLB^iYflLW+`{pAaYBn-1CJbknvIsF@P`Z+C-fUeL49g99W zA&Hc4AczPG)!`6vsNFb$K6-NN5D@RZrWMPd^ip0f%ctx&ICkW&iX$)0tXto-r@UQU z)ZA7uMO4CaS)W)=v6qpsZ}-6SD|Yj%qu?Rn5{?+fmt4VO{;{L?7Q8*H{#ZY3q1ODm zO&ubS6S+P6*|O-1#QR@-5yYy~GUMLt-CRzUq{jW@dR-44>4@F4%)?b%&s&6#ohuiX zMSqv`H>Ob-jA@}^bfwBEcC}#ZK8<6+G)mtA*98re6TP;x2Ra8CMO7!mwYH+vbgdI& zm1^}Yn}Q3v9%cr@JCi$ID+>{_yJ}oUWvNeZ5l~uG*Az9web<k&a`@ZLa_(O08Jb<T z%^{;5Q~2wLC(bM*!Ip?Fr8!MgB`Xl^m?H_xhk;pb60=IdI=63W66jV<+me(Q-)3HX z0a7fyd1v%zUV%bN<l+^fzn!2uCsd0^KfAvtJO$>IN0hPMOQZ4~?H7LWs@miLFAn#G zSj>=&f&|58g%UBfw7&BTDSr2NA=6A~Jowo->S{BT(N{Vm+U^gSWq{_5XSyZ^Z^A!U z&%Y0f0yJ+t(=`Km$NqZ4^C@QEi_>6I$c3Wc@$8i!$vow<d!QHf#*V!j>R4@Mf<Hk+ zbR2KUzG%!EV@5`9p*2^%P6{kMXkEKGVVT%&L2Cle0=$X5NRroyykQ`EOv484V57?d zRetiF;?CNhbaXz`sr9MgI>K^PjiM8kQIk0mGX0=!BmcJKQLt1MnT#23DoHQfU=pY> zq2KM)z2Ax{x+6cs!wtKK6w^_CjjiBK!&c*Z{v*O=2yDi|@snAN45`xdXJ7V+3DcWP zG-Wj)Lgd)Jciln+ai*&+3T8Jkbfw*}21*m*6ov_$T^_O#I&rXzaOEn<>c(rfckGvR zy_1z?i1g`KUk%l{4)^ZPjcx~~{Seyd*Pt5>kvM^EB5gIV-2#Sb{VJc7aO<LfXU+v) zTRrzZ9@Ueze_y|y;4u^!<W#TliC!NLCL}D~_DtQGff}Tc9wg30I~|%QBdD$g(`>di zbVy%9Dz1fHUewk|MzozTPM_%{KV1v>YEulAFHLsFqfQuYi{FdzCAiH02Dgd4hn0!% z5x+(k#`LrHuH(eB4;MflreAYDkUW=!kbO=Rzw4J_K{WreFXo|$nMXD4GAnZ;aZbB; z2R0^;49Y#h#ivW@_|(z~ZS7pozNjEZ*XaYP-iklJC*IYoQNC*C{0QfAChwsq!D`uy zuSk=13AAY3vxE*g`MEe5g>*dbmN;%4aRIjL1rNg0PfRTa$D+}qmz5r(`)A^pFCD6t zmC&tBg3N!KlN(^%TyQWx%KfQg{=d4>|9%6-xp{(6F~Iw;y~u-k=(8U!e$W&xin4(0 z1GLOJ;^v~T(#M2bAJx`ilCmqK=(B4+7_|nql%*#B3m5+Zf84?}osUv>`j>>vRpnST z+yR$57M8rgVXIbHa4Q-2#hQ^X`EF~C%!frPfY-}E%e};qgsTVWD{Pc!s5HvkPDJ84 zhgsgt%fY_H$tARXwtE?8QXt}6u%o-nhMh_LjylrXVa#s4gyv=bkMpK|+0zgK?4Ig0 zx~p|Pk-aW!ZT2q{O<WtefPIhrLVr@%{c4?gTz;fat<_!<6qP~3b1>C_>l1@@xiH8b zPv8)g2e<q-MX2;@zej0uEcV&VZtW8E9H9hpE6z(|n|*V_eLG{eH(8>PJp*VO51&<t zRltm%+l8%q3~42_$h!Mk5fYwilTKuelDYfZWBJkG*+%E>Ye!x94D@*QyYC7b@Mn{) zMlnpU=(^b3)s?Jo9w%vZkD2H+Q3lfN>m-wHV~nTyvYydaYE{Le;=2!E56?#Ydu+f) zo6-_Kb8WrJ30QDG>JMb$It~5q(!47A8sX>%{Tmn_NeA=QujjaK#fHAi%sS%b51QXP zjd%NyS+as3T#$~Jsl06#7kKVQek>}d5HdoK<Cl)H%d%)+ia0G`?P^*$0(k3!kGM_4 zwZ%II;(&l`sd#aCY`M~;2knW-*9nH_`ke=_V{6p<eW?y4xE8gmDW+7P#H|oNX^~%a z5Kt3Ad!QHkL{HB8UL4`eUR}sG<Nosn<^Ovf`R_*i=kxflclW|>raWQHW)lCYv4Daa zVUdQqygm+PI!{&fb=58&B$=A3oGp;eohLM+klcV<M;o-5s)tixmIxTOxuxHMc3~A@ z+2S|==2e+odvyg;#!llLUpmy`)Cbc_JuiQ$$#SG0I8Fv;C3N2YP^^|ZIe9!;)2M2R z(6G@Aq{FBlf)eXe`MXKUX&hE=9F>=N`IehyKPY_<w^U0{$tFM)3~tb|t~b41Y%wTz z&Z4!`R>$*JGSJ23VRJJlm7w_*V=DXB&x?F;oq?!OsKfv-u|_p-AD?-&^BR|5<KSE; z@F)pk&L1kbN|J1>pKQLHtsL>Yrz8OgY^SI&D2K#gz#u(%Z^Z3K=?!;-=!oX5uakVj z%WJ;Re6&NxlWo4xqk^Tyi_!{IXt>-VYez2Ypygdz8*?KkYm0gv#l3#OM`r4e7^5}A z8K^F%2iD_X>mqM4K)=7BjD&w$#kF-8@`kTQGVce6HB4E~n8}+M-HGQEYZvVAG`4}c z-{pgyU4+wfrSPxlAV+!MjWaua5@4h*)K>Kb#H)0ZTz-m2+=M~55ImMKfGxS#hl}ve zhBE;Z0U6YSZj=Lj^vo@gdi!-TB^xN3Z6f#~y^moLX}#LIhj<+OD^f;z_wxP6iINxF zrXyFEZN+l^AxGYiSu?E#KEHpezxBoB(haoMi0AAqZ?Dg3pRNA9?mqkQZUbjW;%_aD z+x|Ia^~{S|a`qwmp(45pOLQ(BMG;O<7FTrrPeJnN>5b0Q`onpqt9@2Rh`8*P!3nNQ z#2>&P`I|~7KdJX0JH|g%(EoG2G57{^C!FWy|IbE82ujbDgRd5DG-=;Ok97}y(p-53 zO?o^=reIhR5F2h{V>+M7e3i{U+Lfz}Z+o?_j=4~}rFosP*23&3sSOxjglZK;(n&wA z921S*M7n#okMBk0|Dt0fLMaJs<S7t6t?oyE$=#;Q$6)3q9EsppS6$cS`w5fNGIKLC zWGKp4@24omTkCuTN+wQTD3j}NWBqcg$i*D*F;Q4C3;kU18u^j!Ed;Fz$zB;HFHHF9 zV<2@}x)!fSNng*!Rpb+GE49mdd6Fdd>z75UwFI_9i{&*<_Lx<dGxB&sB%XJU1<Rz9 z^WjSIUrh_ILJr_=rC?1+1KEZHzJg{!NkTkm3)iwRwf33ysWvl_bxvz2!`ghg4)9TA z@)U>DUauC*&-GW@YI(SbJFy|7xwnxespD(4d~*eYOpJvJM5&R;3D*s{O`=EL#U}Ye zKTqlVcNyfP@MC&ZRS^iTzFE~Zif%`aC(Vl7sX4#5txJS&c@OdZw)wdk8V^(A!4_rA z$tw`HVaon=X>Ef>H&ro|rr~Wk=yGyPcJz+WnLreuAKkNCwGQfC&6RJfKDW#fW?G&q zWNqyJ7(7~6QOyW=C|#yI^&&Q|z?lx_6Uy6{y(pTv<w^w*iQ+oaBJdWGj%THp%5L?V zsm&OS^6lXdfSJznJ2xNMLDhBchp*;mYvk;^-f{7rA<h;-d>t0fI-L`VYV)Za>_W{p z4!UvfKd08wzxu8NJ?f)bAl#5;A(?;18E0{CP(|YYnuq^fLI3wi5rBBuZy+8GB{PM; zDx_vSg2``3QT#Z#?~+OJ+TI{(W&9`UR|iRqscN1lo!8b3`fI5g545DozB;6rB;pnZ zySEG|lU09sN?*M3Ft<IKL~Uw>IXA`zPw3}Ju>mRBK*)=TB*f&9+D;L7;Hhq1XG<di zqQg4xNuWX@CJ$zr7wZl+D_Y5jdQ$(>gEp8%p@J<=4}Sq}pyBl-$CQQ921f+IjFI}} zRoNdnWUQSPntMB601D*AxReSsltI77ZudV(J01woqtE_XC+S&w+n;$|(IozPKU)lW zMyasB)-;h$UwWjMY*WRQ4)NJtj5Dt7**EBsWgZp{$UynX)p0X?FTiEJnD9Dj*Q&W_ zM#I!MMDO^HcP3X#64Qn%m$g>fw*C71V?lTSQrE7l$is1+eG)s(QUdyDYah?##Y{Jk z<O$b!NX-H=s@xOq=B2{1Y8U==q>^Iy%Ff2cZ=#kZdB=ked_mqdA!8ZSMlRVXO6D~X zxQqG5s0JxAFMAKsd9I_AvVGdrD1zT&!iO4rX6WK0$zy$POkbXU(7fLIu}A<vwdHkf z)3P)x2iRvZa7q{X3x5Wf;yT<9eBC0kU<(~jo$}<V*=Oh=%sr}$>yBN=hC$LXqD^rJ zJRX<Zi%rK6aOh7hzj7<%d;SCpy>)rHq;q&d&F`o9FnCxbJ}$3Y@in}k3<inrGu6oh zao}?;Rj54h#Bwa?B=p|tByC(372m6DXS`;Kzie2GH2Z_}!6*5~%T_=f#HIMp8}#po zHI)1Y&>?@fa--hCxO=8S_H8vBaxm=R3lPzL0hW+jQE&8X*vvSF28Nb=<Dr4$5~vPT z_&h(qZb-F8UbG#U;H-~eM={L30dW~lglselm;mANtk3P(urfb#a}nC+a+DbfzWwcm zz$nHs)JyU3pQn(8M-Su&85UwXDvv}J=fSfvnA<0>h~ph91%tp5%AB-%qqW@63`d-p zQB@yu^)x0%e31m?E46om45kW2S|->Mn91)GSAEOmDD|o=$-L9Q&9WC+aE`e>zCxUk zZ<App<v%b}h*kdtgkmfV2p$y;Q_EXZ7C*W84vd?h5~#-%EkVCx_8J)&M;E_O+FGaZ z&^6BM$cg0ACoC#;u^uYzUM9vi)ZmDhXopD^&5nQ_rn1mB$)&{9{BWGQLXl)>#I*7Y z^12?Ukjjfq_VXo;=$tm4nVA#{Xh5a-W|5o!BJ$APC)5&L@%o5zJ&7`;P6`Vdo^bfK zD@2*oeR?XGYFmo5k-PdA@gzBL@xP?~aogjzzw)}K&AGtBGxL|Ht@xC~w8;6p7>?&q zOQX5TE&0I9tG3T8kD)^*<gt5(6xKM4UrwEifaK>>YiCs5vW<g`!CH6Qp5J}+LOr`G zdSlru<Zc8f`C{3NRL!b_OD$onCkiZJne+Oe79Y|U0abY6N|{g`GMK*a^))_1g7RWB z4{ry9$p<IA(P!6$6uzym_~J@d@g&5Z?*4~A#O;1Y*hB+2-mw|J`KbT%fc?LHKWBDB zn=C7Fy8GARTNU}TQRnJ}Rs7<6F=X+(-%{1e$fTK^5k^6Qxo`n(lhU{nz9&HTxytPP zdD}T~4!3J`2fLUj9|M{ydTe9EH~LI$$YV&Z>qG-*V|61}7-4^&PU5JZr6oXbrAc^h z{jIjc$iZxcA^%yf7gwyS(gh#K06s$ar*VmW;l^qDdj6(ve96b5`<LQhy`SR5bN8k; z_%TmtjPQPo{A!A70TRrlm<uzCvi!qU8o=V6wfg#^yy;_abTA!ZgB7)Fy$XY>NE&q) z5v#n`09j76hy%F5(^SO)o+6JS3^50MhmD-17USOc@OT}gIY{OF#T{JbyEdCNQLc}@ z3N38=Xdhh|4|DZgwQ8>?rrYA?eiz)H<<TbHqU!QOqI5;^57RVSVhcqi-)VI%VwUjh zp`~7SDGJ!G&Dv^ReLk2HE6Uj+S`(P4`eoktgBW7uQx`wLC5kei5kepVkdde~4>{=X zo537)x+v5?G3d()_xJ$%pr3zo*0apBWMfpTzSSCy)fi}r2aLK&k$jS*DdRDwfjpLQ z$sX_UciFhQSg7VP@(u1=nBup4&+K0jw2d*~Vb7uUii3M3Sr{pFhO55K6UM4bdANsl zDf7<C=ZwW7XIc8hg|0eZxz!@2wr9_aBT&m3&7|0VG`niy67gpSy(~4%=M27r8hkbH zIYeEf%)GKQbAx?f#4mp3Sn0%t2!Js6UJSp3dVH7h>WB1Qp9NH**T@{+pADQPmi{N& z>+gl^;a<{>IRQV)vij*C5S_mvHl9{DRElQ?5q~MoJbP{fs3GL)$l=CH<NR<{?7OSV zp{_hurRXE8?Qnrs4w!CF{XGF|3#F+-HYf$*&en<isFXh;V)CT3LED<m_ILkqFDxH^ z-)z#sN5Zm=!Og$i?=gAA!;;MpXu<?)oS+uhwdVUBmUFEE^Wzy<D{K|uqUG=(*eZ-| z1!Xz63L=}!r8GSZ%_R9}+|#zB`!(!@UXM<4cQ2upBbjr5uk>5z^RA2Ln)x|>14ZD* zZcb5D(mX^m9=(3&eiRYb#09c3%?nl$i9FHca^|OyWH98$1pE$?j20bZ#^3zdwQi}Z zyF)rgHN#!2yWuc2G@<sv=-PT7tSKVDH}!%!cs+|N-Yfbzl>cb2q<UU*l4qdGdZ7h9 z9wvaZI*zh?j^I((Cv|7wxBun6SIL>q9xO>^Ei^gPKR@U|2BQqzjD!u(3M;$xiS=Ae z_nhExAl|3XOX@P^i`33IJ{gO<XAz!SWSqFjv)L{$0PfQnm5K;%eJ{6jEK*javkkVz z9faciD8lutCgS(olr4ui%_P`LhcqopU8n~`U&oQ-G_*vZc`XrNY2m*E1{<a41GR-( zjH;N&;SK0|?u&`Ia^<Ha;H(FU3d+M{*oNd7JADd`x{Vk5BVf^cg34EdU9y%97K=Z1 zG}On(Y#%wZrRF_+e3IO?&XAY^;b{1jlJdL5j&sA?f@?3BY~<WcCTe4DR4(peLF2VF zqwi6U--Z5lOP|O7DZc05JGsAB>ivLz&JPW^=KLpC=Kod*|4Z!Qy4kiWFX$isXM1`w z+&=4e`F<TKe)T(4?EGj@#<Ka6?|i4;cAOk9UPbmm;1tJ9lO1ytb}GSI94e`0G0cZS zEx}Q!L$^)jP0hiskCpFOw7YOCfBPOa+^AR>@zuNwS0A_o*EC)PnV070g@3BF+T!HH z(2~VVZqYmTqSXF@aD*4rMNkBKaI86@G@(vgyTE8L4uHQs=W&rj*oMylR%IS;MA}s# zDmy%l%wIXc^T);aR!OXo{_smBp8+dpC?VoolyKHMCXTE+=*>&Y2ni4W^c908EJ-Yl zV~>Id)+qblM<55CMgR>qxP8Vl4xbl0{@ALrIk6RO(#-}t^zy1s?BP+wzdzIfPIz}` z*Uj2)*nLD{X40Y}zBP0o<{f^LeX)rV3Ar#1hHRU2z`pzPdI=!cCQ_Eepe$B-a6f=C zmSNF?_R=9e6!~>K-Vu+w;2xt9rPVt<AVEkvnra5yu;4U&y}Cj)8DxtQpYwSpN~V6# z+vz1!+ZZ7!NqEat=v|^Q55WlI!B;GyF`yS(xug-GI+MZ@Fo|?I-V){TEJI>e9G@k^ z`g-NuAme1$Pk`o8_`udlKuW!GF+}><XV<i*_I{imrNskTPn1^zjsQ=B>!XpxscO!1 zJ(=ON)OXKg&J%syGIUj?8t{Wd*|jH6iw9e4MH=9T;o{f5tbP~i(zEk@-~KQ`24Xz# z+;nT1p{+&#(&OSY!VD;J;5VTre^pE<6XtjH0hRdKr)YF|^mS8xP*?T`_I!-7u)^As zJ*1kGZ0y~zVj#<CC*+>GPqH;aL!@fdKd`;PsG;^V6jw0BQ2>ZEcJ!ANH4*_Nu4H$t zFnJ~&{R7|Im^<RD6Kk<<ghhfP^oL;(I>2VnVQ?s^N?qMb<O_MFZr~T21jj%-r<5U_ zZum2iLbqAZw^gO$I$zyNgc~A3wvAkv!VWKV2oYw!nk%5qyL$mxx4z!3(;?Q%`GL82 zapH!L>DcezQ*~5i)ndcozyRx4U$|u{I!3<crM8)6e%oJvUle-fo}?UP#Xnb9gbv?o z1XtM=wfEYmKPVeH@qggoKX5B(!`()hYyVY*EW8wV>jb)eU(5kKrupo}Duelv{sLNn z?*kp(jGSmn^GXjYs3@jL!Ir_><;%X_3owz9RJk?x9e=@z`-*Z*3GShzRwxhf7@SIr ztC69?P8mYo?_$R%5VZTqE9Fz9@hvgS(-G4u?8nL8-+p5$`LqaJDnGE!88n8U)ZCT9 zXgOvm8m0^xj!v4=RK6`Vj6ItC?X>KY=lMj!etODQk3EU7^}y-FP_*~soVpI|uYTUD zcJv+lBfaa&ZaJ4;Pivl>6DGYJ0S_Ovaycg|WJ#RQCi<XjT~~ykC3bYE^{(hRdt%a5 ze||orgzCcL3D}qY+_4iVy^F44{qA{<=Oy|24-No;TA<;sCHlN!Y}3wh_8-pK|3BdG z6gPnB;)>}kVE5{3*LTRnZ%y&~tna$z8ZVF1ynwC3y1F)n_90lv!5llZ8SdfovOm)1 zlX2Mc6RNIfYt==WDWQIrZtPB9VJ|IqQ^s_-G&a}A&Gl<MQ;C`#^|6JdzbdCD%P4dG z<l?2rENCs;XyGU%g+T)8^`;V&ux$A~!?S6vorHVbL*342&Et{q$pGQ@)ynl6K;ka- zyl==*OjFiYC#zH4-;h5*RG8u9X~djmqreC;Nt?Mo@i?Qx(PM)&w2cQg3$+zz)&!hQ z(<GWRu@aUunw9)BA#@@a&xYCEY0P2T%*xp2xU4#|G+clNh)f?YgH-jFJvqMRXB4SX z>yqA+wxHmElxg!dIpl^juTaeD+T0)V-DhOZKAwibbWfm~Sa0Cdn6y_a1{aWT^pC7h z++{>fsIK&1cg%_s;ot!Z)871IEPz8c$Zas#@&nt1JZ9+JUf@l@Ec0_^lxCYG&1r%T z3ecO1iSPmjP;WZw*>h0NULYn<r`4t4G9k*EtX98c#6~2D2<73VTO6GwGSUq1`c&^v zjs1nU35|oIs><1YJPJxLzMS)(MS;;Rq?a)Gx%(uX`}%lE?w^||PrKWOK*!(aGRO6A z4!4`%nM;0z0B8o!Bp&_GSghyHS$9I?*^$Nf^RJM@^cUcVc{)D11VrqWl(r^Mhv*GI zHoy8Jr)(rhuYs+lo2oGATH6@zTxFHxZmMiCo^6_0OItEZ7a~G^WYQIP(nk<9q2#6w zC9)kd^H0jKW=qnE7;M^E)5t9^=uC?e82RMpcJ#7r#074X#;FG$FSZtyKK;fJk#AN? z>3{!HUESTR?|{mT774f1{1{Anwqm1Bl6<?sbop5y$^9q!Y`Jw(cMP{GpZeX=h;l!^ zs~+Z5tnt{puu12$TFz#~4-BL$`IQ@<&<rc)mgBY1x4LSx9#D~>hEGu&^hsmU)gvu= z!?_Q43$40Ir(c9x))igUPnbyL&d8IkZ@Z-4Zj|gEeVc4!bMChQa9D|{G5kZz!Cnf< z%kMXO9v(XzExXVmvgpbxS;9XtZ&o(6RK{AAhV;2O{rLG`F2EH1v8xz)PSlfMF~?M_ zUyv}j#Rmu{<kR!`dOTv?qYQl`3J)*eW9m>dp3ZSxw!?+5ZJOhip}Wz$L)nXW^SO-W z_IiF&HJa@CDYH|RlQvJJagR3PB|P2^-|ZPt=^JCC`9VxW{rnzivya%=t7CosVAQ|@ z7ezI*Yrq?VmC{==zFREkr9P8T->He`{GqGKx^Tncxk9ui>lh1zO(M97<}~2$3j32s zybN8~{C-eb=WOGWd^o%I{d)=O>dDO)fk4`g_{W9~@0s&GUC8C9cF20iOi3}#PW|{_ z8|Lp{JyY)jmq=k>$0>n-i?me$(1<<R{Qp3{4HAZ>dRLP}@N4hy=R<uy>)i4~>Uh*) z9KS?;K4jUnIuGRI7<xA6*3wm|dH8Sh5}TRzV1$4Qx93164_<>)$?Io(86S!d$f~}V zd}=@}whPiduq`QOj9~08O@S>Vizt4n4|2{QJuvDk2$z{4pe(ft`{a625~?23E%(-b zv=zQWfE2JM*4jMDc3xHzY0=o`c?I;WM?XcB=#Kr3k~yg+upH^{fOWq(`WG#6Z(t;3 z{=kE(X~^N~Z-x>?D4bP|<Uc-YYd$%6PMg1E+_ySBLQ7saU6Rd+UoJc3tG-N}Ou$=m z(a>WyHG2OD4<)Eep}lRIl(?>v|30%wK^I0rHrn5UGASS7U0ai_fIP)fcvjIpj`2pI z98#LG%W01^AEmPdQcn%-@QtYQ;EXgo1hrM@y7{3C8BeZ#;<2G5?X$6j3bE)aB4xv# zJEB(~O{S?*zu8E-pNLe+qgW8<c3Lf`h6Hv5KH8t#$I9L=8UrJSeuR-ZccYS{`}W7D z_XBZEV~Iy`{OZz|xVt^#KHT{*u~DNrDAlmjc06753>SWjRBZzbEP07J$<v7Q*?U$` z6ryg=O|@(wtPT{w%n>Wa_{ZmTK63>1U^Noyy;shosVQ5~wvKAHo!?upm*fU%<iJnb zox{@9D9N5=s~D29#zrhxe-=?i`z;c>;ED=;ktp74$6!0(k!JE60z=kNjDDM^*K@i| zUP}x;`iJ0uu7URgyn_JP!+Yt~fxy2lf`A3}>|giK0Pi#eU!U*%sTleb7?qh59~@ty zZl)OyE^gJ-YFZohYM8ei!4SY0f5MWk;NasL66tPv9K<gb#tYZ!s=DJevd-D%I<7__ z_8sF9Ak7n|m~qIuc>3t!bZv-TqUqb<-k+MXB_CgZHKgzl9GP0r{Om9eDL4N71y)hY zFj7+a{ytkvIzO3K&x|DJjBdgSF)^7xg>=8yu~xoe-og$Ro;ouqla=8p{(a47zd=<x zniGfYlXS-Q-XE0y%D&{PlKW;rZ?&zd4mjjUq$Cq>aCkqQF$n`$dD(4H8aQkg$##i6 zLuj07vKYZ$3-ar51S$-vnRvUF+leNllZ&BrWjnxltCF%e4VxHs53vOn_ZFv3MjEgZ zd2+nbT}7Lo`q}*!Sa~{{m#~>29&07qTe)d-menWSqEeNXW(4C&h8ggt`2=9mqY!Do zcBTXZcO87J#OfWmPr?Q&og05!VN@DX74~4XvGu#}kMM+3Y2A*9&XKr|nUf7Q{T*cg z<x+}nS7cIvVD|3Ok7>f)d$C4$zMT7F^{S`VC3OS}4<q}a>QzQri*=4#)8}00lk=Cs ziA4MAA!sBxr5T{G0|6VDjsnj`V?|m_XS(ut7C5}qIiOvpT&;-@RoA=C++`J9v{T;V z@SLsmm_Cndl~VxZ%WNKDlRNGD6W#%{<UiXq#P=Y6YYvy=ibt1%^OxoG6o05=fX)96 z!iFMSy84rn>3?s*ACF#Qe1l^C1+V!^7^ZRiEi*HDT})V{ok#c0$E%W~>>{*n77HKC zS-l>belzA3NuHwfxX^k%pCE!T&Q|ryA?&xKesEF)O$4}rw9wrq)u{lNs0QG2zE9M^ z(~2W!8Ep2~&*C8gu6h<UBN)ZC`r~jVeW#t1u|}urm|v8I1=x%6fqr^FaC3#DHb9vI zQ2T;7Gig8^g<}|$m8sM(1d!~@UUw1T*=bD!TBgnT0W83Lr$m!<bim+oce0sOR=hK7 zi#U7v2TtARP&=c#h`vXsI;63l%3xhWivnER1eas((oh|u(PlU&YHXvvGH8@XnzXKF zG*>sv$-lA(UX=7Eu1U29Yg2TF=bW7Hhq%dr7P^(i@Y~b|s&oNSS^A*R24kBuSoGV1 zws>y8NoY~j$@6thXy%Vmvj$WAmq>?uY4c#x&3fB;OInp0-S7~WQbrL$E??1h`|*>- z6KG8x+am7qXys~^Nh&oAB)e1vk|Uv&%<UjFq9Q42l#o|8M?TEnm4!&RKmEA-3O<}w z!W^`C+%6>iG-wju^3{DoB#czJ^mnr1^@_9BI>(mf!--sK^&uPQ%@W}Nbh1KkF-tqZ zO>JG~-Da`k)%tPbP`u&5ubSZJ!z;5Q?VQ3<P#*U>je9w}(7vf{Owoz0UA4mqv+r0+ zqICOQ4=~BP1?cb+IgfMjXXQ{dEle*S@8OY>l*7@dfF&)uiHVkh;j##RJ^O|<SpJW7 zF7l?%ZGSrO``?@Fzv#vPTHnzHCSbcr={~v}7n}f8JR;{iYGL<!g4J)^gsE4S6CapZ zji7@+;4uw6>pXO`O8v54^X<b%Q`2!UZhdiSfrKq^-l;h_((&hiAWSjNRevWm>ff^^ zby;)JoL<O95<wXlL!R4E5c`l`?{S^L7aZ_i7{rMxk9>M=c@(cue3&?jM6Nx9f(?YH zTOMy)D%wZ+Y_3A9nZX?g__q)MclV9GS`e?^LLpnMjr3ZGi-^A`9qk5%O#u&7%WV4Y zNQ8*5b~UIzU*!wQD9_ZKu^nb|yUlysVGm<|zZg!T%HyI$M%x4o6X)J5x6o1I{zrM} zx=Kh(?5gRYXJ^exNO&E8jfYnYw&9`Qz;l8wBV{t3qG@67STD^-<Mu0RKF3AFrytk} zZEER`t48W*Rz*Ml3J)*$C5p^(X`S%ai4;OmMQWao4Z4EiFHUPiepX_5^LV~n;JiP+ zu-I*XEzvDi2NOO3Q3}7JciF#qH4}^#5siZ^Cy;V34{%>Z0U-;AJ%XQTcST&mfd6M5 z(ev2JTW#^7^G_F(f3iRdc6yyz6C+G(xh+0>lP>@CaF4(xpDpOv_vk#V8=;QN&M8Rm z9uWU5MP;<S&t-iENc}`bD4)k1#naD@dSs_`t|z+g4e=*f-#=Hg|LPp(?s$>2M!Eql zZLw4LJ@1=28LhhPXNFuuuD~JQ)hvIA9syKqVgQhFdd0WG@GpUkDOLc-m}MnRs(SaI z(N_Nhp1#BD<2+J7U`_=&VFw2(69!OX@Vr&uu_GziFEEo)pW%c}Iz0Yf5W+1tF4LF0 ztBZ0sq9ihK`y^SUFQSHDJV%}LEt(cS6CLs%USz0MyGhM?5^l!p=0AT2j|C8uMS#_Y zrRY@bV~sulJaf9up3E1}Wv4o!?w&F%{BW;fv{8r%VqSuKXyAe}HtkcAQ4&CX`V<)O z>7wOEL3F+VOC`jhmXyX**WS%XQs5(aKBr$LRnze{lWW)r>T>qhHNILV_O2`uuC9sb z!ZgX{x}<wln5FGvQ>3bS>$x7Goi<F&6vM!E%%$x;M_cNAk*ud5pQ0Vsc&sK!fNCUm zT%)LH^$l7IE?<GN<}^KV*lcVj5>?Zh&R_KUB|N+u6tdltQ1J?{>iM*HCD&Ne8tF4H z=%^x1W*Rn`9ci^9RzUEA?PwcK`Q9rDAG1CFSInN1UcX#9?mq}zE;uN@1%!1sB<-`W z6I;Wn?(W_OvDd=_q|c1azrF-DR>rb_rNpbeXxa-veUgDU=#}g2wA`u%+5qMnKB1aY zR+F;^AyOP1zl0W3KXv;>Rk;<<7LjFVHRHDoa}4;6IS)*pcbR!f;y&K+mMw-zVz`!~ zgHt33dd(U?Lsv31#Kf9x(ljTBrK7<4Q9tVd(q=2zbE`od-Os#hskHaU&J1<qjeuHs zdidyH9+x|KHx(;1r`!840Jb{lKiydi;Hdc>a&#JhTS5MqctBlMOq1BaLsy?o4PNpL zPbdP~quU*fYwKkvpk_9P3;X5hg20Yy(A!i9ag)+>@#lP*x@3Uo&W>#u)CBZ$)NKxf z{Kr+pwN1wt0|K!Rx1l!psKJljBqJCarIiyWIv^77BiVxIL}pbk<Rg><Hzr>EMx2Zi zSRuFar1i1Kxe$0CmKteWrADO)z~360Ff^{qAIH`lb+7bvkLaxjT5ipb-)WT)9?rjO zo2*B5MSKU=WIdRxopC>p(fz$L^35?l`IJy2|DDX_+5-7f?a@lnpxP3E33601nQOl( z%3cK5+ht01s)L;uoj}#|i0Mc}XX^z8LKoh`SLNl3KCS-RdQ*M8USwz*zE~xU_;$D5 zFl^eVU)SbAqq?L?g6F&LD;VF*Gao?kxFs7PZPo_@->UCEE9TGV+5$g&O3{aNSRCYZ z*5HmfYi%EurrGs-;_%vSRwe2#MI@;tPj6}>k;(+She-IV%G^h)K2PROo6n}fj7**D z_DYab(+?iitX&PJKI%~gajM@g&mNI<o(H6m9IPMEja-H-3GNfevJ8X2Ay^M0seY=y zb$BwJHT5DMS(9=eu3y+{d3)e{hTPTRX~Qbq6KSGYe~r~}AKUED)rsMzI!!aL62}3- zZvWynRd7?C3KZi{rT$Z$_G0n74_mKKVy;o^0Lsy=dDU=H(S$9qtGNlvd~E+V=h$!C z(i#&AcnGRSH&4PIQYH%oL#8o`kLNUA84lmKk23wi>j=!zDQakmK7-B1%H+u0qV+)v z1rLw`-z*PI$0Z%@^+EP3>8hI)l8ig_Q6E5Cgn<0XZc;x4JJnU+tIEk&9jlG}IMU5L z^;LPZa3Na7#oq>_x_<#~Q&(Nsd1ZKC^mlF7v}6k4ex8r9YHc9lv4!2^67`_qad7@Y zxlHnA=1`%r*PafVxK5irqg2pFQmEb9T2@tG7K$<8B?B7ljA+yngVhwNFKFZQ9Fo5W zW|N@F87z$P5T&y!ds`ty5er9-hjj~+1)9V4(Cb%1QTiiO29r~BBTM9TW$YQpx2lVv z7PoM#7iKQvo|;cL^<Hf$RZ`)F+}@@8xD9qKW>U9g{xpK*52nI+YfRzKNnp%TG>spm zHNNZU-oo*vvh9cO_Gi$2>8x7_?{O(@?%;V0cZx93qO6O&8mLhxgsth528dD4jJ4@Y zgDG$9lZaVYu@=;n?7{ArRnqt>4>L>*YF-`#D@(*#_FBU75fNG>?+xSkhteJIJj%MG z&5rrsH5PMs=YJlNf3oU~%KqsBfTFU`-)yg$o%wrZIfVI{-Omryel&YH-r|7XXHE0G zj%zT|Ul!S0`V&vraTb_<`^<_u&+z=KjrAGPAOpBpHe8s#2mgh|az}%1VP0=qi0v0J zp?;Tjr*~#_JN%A&_|7gPBWrApbR~0iCYYE`xJ&8h7|DpOvedY(icrY(y?tB<0lE{N zWr*@^tsJ}|YH2NwCk5myCC`hqYMRnZ07OQc$Ha)n;u{u?mfbrcL_D_WZ-0rV>M0d$ zpj)T@fHk$H5VlYMNd(WWLFrq=29}_-9=leR$1-SDhqO3#$Ppa*I%#_sq4Fl7^%th& z%xpki_}#{Q3{9(=I`M=?z^Iu<))fz<x_C9exQv4`T{c<^*WT75g1_rQ=cN*#XptT5 zlSl3D)~VcgO*RLVyr@D`2dwfIYT`#txH`5_PN*^OLLVDlP!teI44`cklgMo_(!M%) zMSHxp&1`5os)BRU6+R-Aj3t#ru$tBx3M9?zCNM^iQS5$OZ=A6z<Ek_Q3nBx>m1WH= zkZdmu)@oKjbV?5^1{?9q87>%a<ML5{_kA@2z6^g!7FtTL@rHD3mU&4s3tZ2az6aeY zjU~CleF=mK`pNJI?dwm-{uETeQ-{}0CGg=R0w+=%m(DO3zcM~57gU5F7@lK(F;qMC z{Q(*M%7Q(&;Ckzr3f!lV#wx`RCU=&OB}<$k5192<jm@LyHg(orlEX1v+Y_`X)9d8T z?O&GpfrWIqef6Yd8{I^9z1C56HU8J|yQb_<!*9n~01)$;74w=A`nUV)&CR|#dHr7e ze<nlN0q@hU0dZmVH{iZVD)tP_nU2a%6!x(CKwEE#Xy;T%6E_w!37blATqK8l#n*7E za`F$P<5=ezu7^pk@;7qH0c43x!g4kAwhfMohkwlN8E9=s(<go!A$R`)xICyW<p+o6 zR{}&W`u9OAZl8X0i)g=a#-qE)?O{9DN2yErEJ`f{!=fRdbUD>~3&VJ8a3fVn-TXzG zS~$|5SV%$UPPl2;I$-3E(g$zIg0ZIZiWZX6S#-Yf+fc0*sR+8sQxO;B?{8-0%3Es) zv0@=Vvo!)5MbhGmoQ~T$$M=~cnRV@wJ<~z-8o%sn2yADd`jc0S<=hR^SCLh80$?UT zr2BO35l<j>;Wll`_RIozQt*0d)230;!=j#V^O2vfC~~(iejpcKe$ve`ba~1$6S&>8 zq+jlN4LO<NA1^DfKlC2eLHUWVy2>srJn-buQ_V9)P~sEZ!PN3+nSYlhqh`jNH~i4u zc*)4tFvTHHP3+-!mBrGQZcqD9s;bLAZ{PD)-r*#`N@GLnMSe!$>NhhyJYE-D-9pW5 zCS4zj*)&+B4smKzyA_O}Aq@?^bu-8H3CGB~^Iy^MNW=K)B!KTD$JmBU+(pLa77;Y1 zN|^X7hZ~8IoHXGN`tElH@7v(LTJX?%OSpQ6=3{-W5{Bo3`SNCNs^ktsNI|8ocT;xN z^Izf^+@R>OK6J$kH`%Mg+NQF#)$ncC>2~iP_4m>uGAz0>uFB0?qo~+kY+Aqi&!&%> zbSh;NbIP=Yso!Gtnl1V)9f&()eoAgC+O0<So<in!u6F{==^UEh{E?Ez0-Uy&PyWq0 zd-FR8Hwj?px*bRz@c(uBEG7!Di@og45xd&wzUoLwyOPy{VFbOzFHWZ|QnHdI9=F^6 zWjIz(vE`#nbtgjkTgwKyL|M^NbAJ8UQ@*Nt?y%gk%8}ccwxtMb%;fu1R`)Ljt>eA5 z9v5FA@{jYStezt%Rf)iYvkzDH7h-hN@A{{j*t9`c&>{KHP%#G&clv-yV)i#6S8TjD zFfJ79IIc*WmK)npzuehB2Bas18Z*0o<K*qX1ulm?jU^4SqR$Poday5$pdcUFR_j?O zBt9x06RhLlwmOWeTItCsv|pMmBx8Q1Z5W?hrLoEXs4b1QNyTrrODvxWq}Q|6Gv)rx zlB+xqP8~oJRxq8^Zq2Wu2fl?$D}x+UugD?;HiQ%$g`f0KrYnPX){;x?$+xC2pL6-D z>yBo473~ThyA+w!&E;_;@E;{rhwoDOUOqyz8^xnbh;LUTAh4R50~mu7OlnWHRH~lO zb^}U^f@!)8#atk{hNq<h8)n#_{iYH(5W&aYUsLB=q?(^KqZUZBm-X;eWa96$M-eo? zcN#Q&p!%&Lm1n(ESg*HE=>v-m>?bUddEG;;8w~bA73z(DZCMdcOABpgC#H9KlKl0j z%V|U470z?Wy{0$LzpmS2flz}k(yEV*qY$1F$UNHGWmN1ckhNvI<a`JGey-SCd@rPG zW<9O+CV2NBUkC!Atv?U^`{>}GR{}O~5Z%qC@FknS{+^x@CfMs@^Sjp;AspR*UH7S~ z-^@+$TeU(izZ)f5PhH|;K=2B7oyBDLEPGu%yVnD+u~mHCM<rn}^=$ioRpQca40rY) z(d|ZBFZb2a;~iCxK$)t-h-u1LPhTBqat<R@ByI9HE!9^2+hIg+>kz<JM!TlSEc&Ek z6*5FV(Ws-@{(_a#>^j2B8P6wD0y%s`ShWIL-L}{H;;V0++PR~}E~{U0E0CX92oOjo z7%Ec=6_%E>`tr#RYmROz4(kihjB~E>tLt{w6?nQ@&2E6_Vi-W0ak^cBI9UW+Lv}@r zIEKS0X@OQbtxc1<p%d;kWOSk5Ywv&y8`K^40`anS>e8%BVaBYUWA<UH_ET?bZm`d~ zaAjWbws8i_Xp)zW_j%lS*_(bx!{QMn=dB+b3kjrMRK7kh`|o88QnriJhhH+t6ey1x z6MM_r29wX~2capmq$BS9yb@562h9YcH?N8eOO{`Fcs2*}2&qOa*EB3VII(<7i8Jxq zJkxO^R!EOa=lrBlPfgr|E;?{R%e-#jQqIY!T3806RQLmBKfDqQN@3_QW_tx#Hb)tE z^tWfibegE{KL2pA<tL#0U~>bac8`E%*luaGYT6H3w_A70<Wn(n{J|NGH2wb1VgjI| zd;#GYUXlDST<ecN&I#X`od};lIR785s%Ef1A@)^^qR+k}{HzCB@OE=pTL=-5pJ<sh zM2A}w1r&<q+Zp!DAn!4%ES*d%#EiFEjb_4{^_5)|%ZQtsVqGeIIDHielV|4vm2|`? zeTCscMw~<Xt!7#x+J=)S7}Sa_`ykD=YGJ(PldAN6_{DGoCea(!53p=&zr42G%@;F6 zm^>O``SgZ`AdG62;B@8YPecdyeb|N#CwNzRy0-+(9*Oin)eqb+&>WLa%I`>DiJL@i z0FFGsXOReIvYvT-YooY8u|V`hg?-EK*XWV#Nc(r_u1BeMPUqH=8^-w2h#e;o`sW12 zA{@?6arU>n?X3?;@*f*44T}hg<&5Y-G`zho3(8R&8~YRYw^|*KQ@v^uYXyt}G~nVj z{Lw}O$d+L^*)p6~<gTC0o~xbowY49i?k!ch9exZT9f5uvO8VSg`a^m|$_3Ixb|LWi znK;!LeV-Y99@dLy@ur_CVaIb9X-}SESFihpRvX`Duc-8HZ7Nuva4-FT82bvSDBEuB z8M;GaXiyNPyQRZGKt$;->6DNfLPAnNKpGLGnW38*KoBYE?(ULusQ=-7@B9DjeBa^x z?^-O@n&BB(i+kTYu6^xm+t;tp`oWVs)y<^rh4DJ;E`1Kz-w~-JqjqdaibFOy_34!M z{dhVr0tNZ4ndc#h<ErO*<>_7gACF_-(^f&(@ZSl?3u(ITMJ<jWwCzc@Bv0KT5I?<W zi)sFoe%idi<w1pScq_6nk9ouX0*m_mV;vG03*e@Vp3YJJ`qxN-Q!mNcq6YL&sL|Qb z+@Il~DKzIA8;TUAA~Yv3Set&H<XVWsvkFyv$fay{dSnaicWkeDNN@azNJ1s`Req{A z3TZOu@}ew(8^fYzcNfckuTH$3RBjn3BS#q6T$K0VWs<h9L0Wkj+->>oBH(joXlSl& zNq_KfrnczKCbBzkfFKTAFAo&O%Q2`r&&6{uWQZA}ij^>pA&}zDCF(Vh-ZIRBsV!*x zc-XQ10be@}yCvojt0`Va$G)`fL7kUtAtrlficENskic_$6WYdMvyzze51Q^9Up1B< zKE#}lpFkMCQo^3hn?cD!pA=gLB}tmR8%Et#O`nzdBR?f^PV;Mx->dRmYMX9-9Q&B6 zU_LX;I~+e_g4>U@NLUs!wV-7JSa;F+^cg+M8PSkwEA3bOf$dDDN3raD)=eT(W>zuE zHE5t+jexPXfeNmBnG6|Z|0GrpC6$PxGd4do&7nvT63_iuq0LMzt~kJ%{gBpycpkOe z`BnshqeoxwST-3Mu_2TA)d%k>qxAOd35nN!??SL@c{Jt0Cj4Waf<SBpztPk8H9A(y zdvBSyf-}UYHg_JyZ@he&qrb*|LQ4<ni!%Fm_IQ@v5IUwecY@F8`HM%g-)?G)mhgYE zoZuVFxhw8-dzSQXR2&%7jpfK1QD!+li2j=k5c8K6l>j>+52St9=dK2{nvd4zys{tZ z;UI(`U%;>~bp2o<And|<x&5FiEm!~85!;IA%_Auxlb=`nv0^dNYPbl;5#FLQNb8L) zn@J~-TkR*a7<%LG0XL$3-1C}gwfOMMz^LeFpJVk{-fmic<q!2Gd~UGbEQL3IF>9O? z+iG>9>Y41+-?DIAK<i>b)h{z|hAoQ!5`!{E5c}*sC=$05teP%i^Q-{#OSP9*e&Zeg zgW*^<+s(rbFFoBN6jkqnP}?w8kMc1?QLoTr2<8bnJ?&|G5<Q}_2WGs>?*2o;XS1G% zVSzGel<$0OZ2Y^j%DghBu}XRS)CjRn-ce{Z<V4FzpOFXZ_kc@Z;ywL<AxMjE_(Z(Q zE<MG52j3||eiU0}S7>gW#ZUr-YVNV&U5qh_$=Y8;#~sD9gG^7>M5JU?q6!a*&|45O z4qse&hK)4lzktmc{D3tYFOp<sCD`Hv`0y>X3(^b4B7a4{{i@>eu8fQCPDyC_czoN3 z=iUe8Cp=Q=rUD-^UqVC6BLg|7i~B6kd%wyTvncD(KXH248^syTlKzxA(Ub$S7FT>f z{C<o@*+(6A?A?f6mX)H-h3P$-0z`?)n(uYn<JpV8a|erM*tKlgZ3{T}vv1U82J*H4 zYnRo(*~<U;a!eRVyT?vW+lKy?L^bl`_-t%AJ~~X`xr}f{)btH61qoWkv6n-+7^zws zzMZF#M^>u6bs_8=!HOBX=QvQ)Z!Fs6^cHBeeuod8RP)*dK9ZLe+-0`cu5l%89#s`X zvZ8FrovOfTQ^;V@*i<eNTvCXv*5Nt@wG|jGP@F9C#UexB#?f4eO2}j!1F({DT;#6x zCuY3y_a^vf!JT!z=8nXDm6l&p&T+Fl!C1t<I>Up$Ic$%p@Ab-|N3&OrOnq}#;yCFx z-G5nA%{?-D{?IRAimW0H6+x;IQQ|lYqaQr=y@0`5IJd@NS09gmZ_$o;v<swagqp&3 zV8RF~EB{Sq!xu_?eQQaQO{YI|w>VP!ZQsZz%(a>uz`$)oRqgf;mjxyBH67#?(B7eA ziLb>ENXv^|H!udB>v{Bza?W;T4tk#<AoY$@m*{0=EqjW+ye)_zm)GQP@gyyI6gi!0 z5Y*hi<WWLnkXXbM)J%MkUiF+U_6I`u2qBDl!)67YT7y%f)zmjfT)G9EC--&n7NNiP zw(MV7b?mvb4`>S8>M&DLsnzgTKz|in4bC7;DC*-wE|v{ErjPMY=XyKm;-z_JZ%czO zo&dPy^^;od=eHJL|7IIw+&5OS>(LhfmsJen*u^hjUkv|XylBnzJ4l`54T5CAQkq{7 z8UVtqCFL63RI}OsyxZ-@MXw~sDcZoouSvv^CXm8xJtQu2ok^3*1!hU4rMEs*t-)=8 z1Lrbrb{2e3rc;Q>12Pm6_mpE2<C+*-&(H(pA{3}@!jbGe%pm3%QJGmssvUwEL(dU@ z@c7DQJsm)3SdfroiiQ`zovJVXnK4d;#*318gCW~$^-&n2ym6F6h^VmX&rtc)?my<g z#a~R(aZu)CLs<wb>tib$t*)qJ&Gq_F<>!rxJs00<_zJ2y^8}xLI*rh)9Qi3|EZr@B zTvQUoRxh+|`nyTZej~<$-kT6wLX2t_tI01IDuWvhXDyxos;Mn;VmBOzh3GuY$49!I zL#j*d1Na+bxmLCa8T+u*s49jR-Dr4eY<gaHJb^|2aWio9Z>YmVp3PIv!g_;3iV&hA z4UFB?v8m`Ybk{vSoJveipPoU#K1KX7(V9QyCcVa=fk^k#C(kxs&f2boMlrS7SA;c` zKP3jl{7)iAPI%+?EdD(A2!o`6(u_X+*05fzx|6JOf4s}@p2nlDT-xsP7d7-MF<)gD z;)GeIH>Q6t5F=L7_ueeS&f~^!OJw~xfp7xl^hx{YmIADmM~?M*w8Z~aF^OQ1;9UHK z`5a`XpL<Mkh6LifX}y*|cI&2^N2SWmz7DGC6ymJ)C&4Kilhk@wy-j{se*$^2kTn&3 z_#Gcv&6zU?pTME9QMY-^>kyl4n_)shZ1>Vx^u2mP3C>7Q@u;)-0pLPX@e@Q|XYvtr z$P-?<5we=E-icIu4{8__#MX{*?+6p?Pyhx8RMt{`1l?;$QfH`X?WvD#Wh+!cea4pc z{ziiNSx<|D-Z+%&Tgalp)6rs>(Az?k4%l?Y(&fRcsx>9b1=Xv#Mb-SC_K)>1QAs;f zct2v&(Csvw+Mga#6cRb8wO>z`)Yz&JS9_&;`vf!SzPeYoV`}t(z0ut^bpqG!8#K!6 zN1w+Avw)*o`s@^9J!{11r>0XVTgeP6r8*^@&^G13Ru`7!J;0X=A*w7PCWIuMiRm;+ z7wR@TB)wdA^A^X{g~q{uphx|#3e`=;Mf3A^=<ndG!X&IkiS&<m7RlE=T`ulq4I9)+ zG$Z{`&z3eT;Bvq^;ke2-Y@`g*6oA(GxS3tM9X5@13Y^K(>-U^5V0k%_thEQ&S<;-) z>VKr$Xx7kSE%#F`uM#BtSzWH*Da9W!Ge(G@nloD@%6_|#An>m^PI0`1U3E+BHC?Oh zHRKV+`rbkk0EPygZ-!W%*PXd<DaQY!Lf4nSVWrC(Va5EHhAE4aFR2XE{`EnD+Qk(_ z>N?law}~A3rNbt>l=bx9VhsUChh7`j`_4i%Ckj%ZL9p<7P1ta$Lbiih77;J%uH|b& zd^r$N7TAMH0dNx#G=hTh6kOy=uTz!~w@B?SNJOGu(TblV``O6PVM{b#aU8l)+Y*q3 zX-@GYHjr&455bHjcB$hAFzUrW$+ctD(}iw5pVlw5U@QJhup=s7dEqDpJDkZ#L*L~2 z?)C=r^y)}N&^`ASg-W<fh%-TIMCi9GIrM6pNC}GHXQL->_;ezvyLo3RYxFQNq?_JJ z`6i6ew4feki!C9U{j@*VFGAqc1R{@U!EvCh85*Ne^I-1akSCJO?Y!oSzq<L<lgB^> z`lxRVD2Dp=Buh~h#bRxqcwnmD9HWTEV~cToX7>oRq)Yr`2s-Ogc8m&~rPYu0BH|!p z0^#st$iL{VQ4f)3;9Nu0669^f+fe7q&kZvX8O0CUNlU}7>DL}Vx#X&VCjBn!nMcju zTl?jZNm#wbq;hww=%69i^zO!&?*h1#<zA}aKIC+sr7MHUJn#ROi{5uB$T>0VX6aBH zpcixV3{+oRgI>1PAhsN@hwW<`%;2}hppQu98>m@1Bo6=9NB+$~klo6_C%U^c8~)XQ zo5sNa=)z>glBl)o<yh>o17U)2ka{!wL?L?d2BPq*xGy;u&is+-@b2^8V17F^I8Q}g zl*2|tqQ%M`)B`(_AWifS&9hfkp)@?(Dc|;5Q|OA^0a*y<W0l;20diBv>(#&u6RO6Q z>Cw*Qv_6jNmO=376AgPQK+t0pb6ylbet^j4t?W3$3K-EZnB2m@7w=m^GVgXDWJYJ< z{U#cJ-u<2i#USUf70*_68mA4u7kFI8Zqe*~tf5T!z;hs;vIG}iE5|<Cl|7w5oy{Lr zLJ(y5S#i$Ja1S)**qf_ZCRwGUndJ+)h|rT?hG+pmqVJ<+qUaV>$8l1bR7Un|X@O&l zl6QEu#~d=Cj#>8-SR`7!+fF#!74Is_^t<K>CRJH;L1XQrnGxS=wxiY_YB4WZRvMH3 zVspBz_sX6;<shQaAz<0i8e`J&o47T3K7m~eLK{{W>zBm}??NV1*39fgKc5`>xj9i< zJQbjO)bIPFojewCIT9RD%mi8*icD%~88GyGf3SXGQr5{lyoep;Xv{iPXGg3!YIC6) z!xD<3RfZ2=xh7*UCCLwKWyAdsAUyNKb4*s`Fz<7EkIU9ekLyMB-fHTB6UF^o=I4Q2 zgohf4Dm>KBxc_kp&BJr^2_ERK>VM@pPV%Il%Vj**2U?8RTAA-2{#5CFPpSPrKnc7i zyDVv#gxXBO!YZ;V!nBdQ$E58TgP+z+>)y*U9I1|Y!jRVoc2K;mF4cI7DAmJ5PDW%g zZMoC177u*qh1}n)mg{jLJb{g*_S%Lxkr6os;G%Gr@-U1EQqZ^K{AP|Ur|$T_1|?cb z(O8SZbI)31j)<J%Ix+6#xvCE|g0`#GxhQ*I&FZCLMK(XJaDb#^I*z{ll-d`K6}O&K zUbH1c>;AG##Ti;P5r#MpV(&<~)Z?fi8-*PBPN88M?j94t8GV{*e1qpbO(hG?U}o2e z(iNNO7qnhR5H+8ublekmaS|<OD+v(?3fbIM({Qo+>cY(3vEpu|+m|sEilaok!BIsk z2p*yH5J};i=cMQEir=nCy+m+M>BpmBM1F$b)cRb@WBmA_ZQ{6NPpO-=58GjxhIE=O z&|v_#y6sphZT7=+(jCC>v>^I@zg)SS3pl?+kOa{l6mq0G^U~VAnfi?zX%yB>3Sx=l zSy@zMOGI_gGIZLpe^EwBKDTgI|Ca9@?Vj8dm9za~PT1iYufyDF5o6sY{T|{NKvqQm zm--m*rf(XIbkVsr3jG_fTRV9ZV(b^EWBv>2n-6&ak6wzAJi^ZO-Yig)I#~gI$qK-2 z>T`IFsYNljv>L+q4UIP=(eewCEYXPtF#n{fn~GO6_NUpTfwVHkL``MB9;83n`XWYc z6{JV1X}5jP;k8~ehz?oxw%X~Va&(wR1dnEvfR)lfZJsX7mWLB$i^IEZG^D<yfN5M@ zc*T}zw@$-c!^2`I;HGlP^;!d`%OR%Xjo{VT@Gx3ot{OUbe0c7_EBSGEXMt(TQZwaT zZj$ki60_aHW5Nfhdd2op*y;n+$bKi08UE;wQDkOZzz&P}F8_NKvucV>UowCDp_ic2 zy@i<FBv+X0w3D4gKH;CCB%^p*E-erGaYX))5e#EJN+BviLBomm5~DxE#J_l=X%u$l zdW1G0OCwreH92XNjCZ|e#!&Wz=Oan&u4^dMJAu$L9L-j2=Ch-H9K?J5ufAo^ha`g! zBqlmlv)Ed~u4iK5NkZ8<4>)R@(<d-%o12W$yS0A%(N3KllGHoeiqSvDe^g)4K-FDL z3iEC+q;O<9cKB9!Re0Hu*#3piUhvH0bJu|GVs7Wl@~G{vSPMwK79(FSs&%S<=7MO( z$a?AP1*3D~xw8|I*~{O%2@|*FuTSQ0w1#}zNnO$Zv4x1=SO|UJbnstTF!z1<(>Uny zMkw_9cjozp#@t8Cwzv8@=NV4^D&xoT=_cBa4+i~7V|A-Qz=C-M+Qou{ghIWevW03q ze-#VC>vcDIQTZ$p!{N8TJbu)+_Ew$EwZ?gOzcP9F`Agl86q9Y*jOb7)FqJ7h7^H{h z6o)YwP^(i_4<cBr+yM5Nj`*AGk6yfd6g;#=s6qA$+j}$n-Wg<b+lNg(L1wDB8reOO zRaeShD!xPM++vl=PB@;KH>^>F))-M&Dok%-=qqX1|EGeghLp^DV6K*Q?+8VNRl>mR zhCQyiuf+pOI)U}J;Mz6Qx5F%!e!v#I+?k}c5kk?zGnrJ_a&tZw()8G9uZvEPE>B-x zOYyc77!c^bd6C|dZ<08Y%0M7bRWpL8o+s#cuqY~LeJyv|YmuhRGpu0LgY*<pKOQ3r zo&sllE9W@0IXb}2R+rMxU|e>sdUt=<GVEmLGcbcx(~y25wC#ZorlQ&B9qgQo?a4mo zpI$D<HP<XA&hf`?itBwRrvEU(iMd^ObRD+Ll<-Fm4LQ~I%&eknqw21XMz-JY8N>yL zW8>DYNb@N}Oa}d}CtdsRM|-Q;{LN!6y;+{8MaL)dmm3K{gd-steuuFzpA9o&DBS{5 zF^3hNd!DU<b?vn^_B07q>5t<rH{`ZdxR==Q4y?^cCsA21YQCf@uxZN#r;y)K9D3YR zcA3f;QGJJ~Ua>)EwLFn_z1;FTvDIl=@rC5Get%jz3g5Gok1x_eX|maNtyd}^qr;ax zj@2hfE`W*IZ(2A=D{TVnwvXXI+Q{y3u<8mpQ)q?dZoTsQ`mzeZ6aIXs+9MRy8=quN zfagvWuOeHoO1vA{0>cbu*iuKv=3|rIY?1Lf)VSY)vI}{0+#eS-{*<1N+l5wC`8c2N zlrp`098sOTW70h#=o6D9nJ?}96L~2n6s9+II2hgA+Qp!9Uu$ek!`#Wq-h#7gNviX> z9sAf_*bEGX^pY%XzBOE5PdV5MamI)=!4fwq#edtw%$*Y&QvvnhZ)&{~qNb`4|B%>1 zDb2C)(AHzo558F{IOFm87wINGc5QOY@ywC=454uPjveRF7tRHA4`WQ87}kMC9Txuh z<K}rhdv9NsKd%;<#lnG=R1FEdqf_>rYe|9YRz4E%?xre0JI@poHy!2uHv6XLj%Lqy zFZ&<s&7>^)p+OvPJ?#0e8<vE{9~ZY<E$82(h|P_U5E`Bi`^!fdentvEz54S&`at?> z7ZHG~LoPe+pRr}Gb%_qsiVtv2U`Fr8s~#z=G{l%sw6wDlLneT>A1!3R^ev*%qI07e z$RZPFKDHZKlRSC9b;48azpO149IYo5$+UE;EfzvfEz}+Az$S`(=zmFjB9VecCv5iS z+O&mWO^9?v5ZI1ZRskJgLN7vXMZWN?vyWGvVcsTM80>PYBE}dIeGRUb9^BUjVu28u zzs7?frWlm$J?i>yr|@B2zQj7Tcs<v&nmBVFj*;xajvXrZh-OBGximxA;bQFGRx<q? zT0Xu}RNkY7ZXBd`C!zuhg`ydZ2zf6%ZY?F9*sCamPQ;K`zQqjK!nR{+h6sFdsrL|H zZ|ZS`NP{zRCxb~TF?NT|L#v`od=E%rvG30_>P2){I^uyA=I-<0%Lp|6SoWwzTtD31 zf{;tr!mH?<k!X))EBJIwI6<6;-r`eH#^s6+&#~LH<4YFM<w3icTeBxP2MDs{ULJ?L zpwo&+Z@~zg>r!)fmfyZVYvO)cGz@!$-)YL2>pFbGLVA&+xtpmDX19zLVR7tKn?9+z zn!P?uh5p{z+Yg)gm%h!v9q-M{fTUoc^_zq#A#(p;13LfT?*U0S>yDB#*tGsd8D$D! zOhvxQyg*%FTwly(`X2JU-U<fMDR9q1G90L_^y*vcNzE1B+^g5LK{|l0N@!g%6Q&|8 zRA1@tI||r5#|p#jV1`|3+LUp9*;)b#i|`UsVL9Od9k%bxl37>keA?Ib=vEi7hF%E+ z&S(<j>DAy=tMG?(#$^7agSI78?3nXAPl2}Jf>HE?2Xw~I`N330E#Qzx;q&Gg7Y?NO z1oFd*8`&kcXuJ*)>^;J2F>_h3oACJ!n=bWEwRz|Tp_;^+A8PVX(cpyN0vM<+y`qjw z?)b*PDIpj$qkt?s?=hYcRTmRamUs`9&!VovO>OgLTPSN>hegDN=xdyuTClaU+U{Y& zU%qq02n|{BRx<yU4z9U+?}@Lx9Xt@h=F~@vf_QwD$()bZeDIwp9mF;;sJQ9)?VJFw z$v%&U%ZJhg@wuT8Ex_VVFYAHSqR)XhO-{u_P8!*e;<fahKTY%fb<IP@b?-q0Gaes% zdHJ71rmWSAg|@X42X(sLxv?Sl6+3va#^PZ2-PMxt>%vZ*i1sV*<y}+lClnTOO8@Dr zxlX^{fL^A0OuMo1ME}o(0iXm$cFWzAoq_48|B#dpl(uR&rR}dz9DjWRsjM)MuO@xa z`PJwuFXp1bEv~gtk)4-PIC=ED@wC^Mv6CY)q#>UBmzK%>hce@PKiM=HYjLKtMhH;p z9r-a$fFAHfWBq%*pVD|8%n?MR>e37aMcaC_RzE2x8v4K;9Fa=eD)Rn9QWRcRE1<l( zBa)p>nny3l{C_K)_j_#JMUwdQ;b4!m4}`97NowFAvnrj*N|1EMow+acwf6mHxKGG= zqBP!rR5vJt=w50NIG8{+H=0YIrBaO7@+kd~viz-^&x7hbAK3yd%C*U5i{98MD3<I1 zkr(*Ro>n4MtiaC^DhgGQaLz4dU~Iagd5A>=%|bD!MspPFM_danLEvdWih7lbu{`e{ zFPiPy5%Ip)dH(o?qnaRd{lhofU%XoCY>+5apIOa;1N)^+NU$K9^<6O4Voj%tL-ME+ zwzur?FQ(Jo_Fs4RAc!2xdf8G(p7+D}d8g~E>x(Ka!6)ugi8=y`X#3ydxg}BwD`yE? z{Y2t;SjM|H8+({QJS><&RlDft9(AAEv|%=U56XM)^BhU2Co^2*rQSJ8-Se6csF^tr z5NSMC#SVzNl>|^q0l=ZK1joR&|G{JYj}9V$F&=OVjATrCe{qJ939N9HIOt_TsNZ$O zO**NDLHIC?+hR<o`lELna`B1U8cJM%$_pmIUbK2_{24h*M^yfdQqifDn@%C#q<@E; z{z+<{-Y$!|;E;bT*v`wT5}k((?+w)}G^c=9hMbhaQeaV6a4XHV1dTjM=`p6Uoo>?W z^8~DEn-93i&qI&i-Pr?8eNU*+>kUxBW0TuBes)d1bQvHc6Vg%lR?}%A!7S?4D4nit zQ}mV4myyI{8!mAijOvy(4*1OFceA>&pZ$g)rGR5TE1~AWj)hWP!e+eJVO&?I<!Eqe z#?iy6OmVM2F1s<3g)wKcj}Fn`6vp3eo0^HiwO5KDdZm6&>hVg0hRJv2X&lI%7ujX? z4Z{8Y{adRoSM)3V1Q<ViJ>O@|knlTw!&k$rn`m5;i_`8C#26I0*flYn7sjdI=~d;W z@5-kAMRFa{Y4rWN6*~kpt*a7y+3+BAr@dWZ=Cy>u+X@xYZUOCP>5tZ&nA>y7;>ahL zBP7P}FHN_q?2OSI%^5Mvu26y6lzpi7v8>FH9F;$`9!)FNncmk;*Ym&}?6IDZW#g^4 z9a$v{T<@v_$$j#FYm?mia^LJm^3;rZ`R|5{QvwbX$=USR7~k#K7{?_y669`g1aFrh zzR+XFgL=`&+A?_DWS+`8HU1cMUNfhn_r?{$@=Par#7ttV`_8WqxZuz70O*%bj2g#> z9i#S+KVLg*NRuj2kuayE3H?~V*7AJf39KmcaG`%Mm&U0{huo=w;(qE<*nB;@9U5=( z%WiNrhH*aPTe=)*^m019Hkvh#2{GcM`v5d0`rJ}Tj{`hT)bCCMe_A+eAQVIKYG}t= zo{D3>U{2YQ>t}Uho}ST<v9C)((AP(9TW7ID2Z)oimxSX)QF&Jy(os;GJGH(8?ldy{ za}CmXbn{*nkw&y-e!dt>vn0YBW0)6-vMt(Vz0vj@1i6rc^`eq;=v`3JC2d!2KgPT$ zThjZ>i1t3pa&$tf<N13n4(bGfCbsH1@G?Dh?d{Ikj%#kjT)c|bs7c~tHBYyRJI1kx zh^P%`bO*m<aeR;Bxv+@KLTH>6$64qdmN@R^{U;wO=>YlqPM7<k!97}oJvp7`M5?Nn zimcB5u8WzySqHmDSLYrxuF}lV9om(ITdx27e<?|&T-tc@{?k11Y~Th0AMh+o`RjL< zg3*YjPgZ{U?ATtT1c>tr*vl2iA0E>EtcJf!U*8f`cIEnl3CZ2u0LUAHglD1{wco&y zI#hN)gY)Y=NC5IH!}EFg+MtnJ-v^R;v$^pO^r(}OE>bxI1J}DqVbV=l^m5%(L<@XP zizDKa(F(cyDi>Wp=CyH{>fc-dX5pnV$szJN)je(h_9q6QkaIvw!XEzB_^3b`Bz&&L zC<-25L$%(kwwRh(+Se6rI>rK)*J<w6WPfGUvc%&4^qS0TE1@}tC`Aoas%5%A{=4eT z=vC^yZ3*`8^;{(hQw>~v)V-WWZ&foI(*pBOT0L#B+wneIb*GR<p`DMHFn)JLatu90 z;yOpP1mOP`A{*b^RU40Um+!dOU*vlNQ|+?QlJ`9xdX_`BY5I+##`xM{`878-m5~*T zI)@}PHh?`c5v)b=`O&^fnuDhM>{T5G1#nJH;349_aGr1BFBwbqtSz`qPA#`Q3lIJd zu}FUA{_u~!d7<>y*E)0MDril=zd&8sfgIBiGd7htTzL8Ak`@6+9dpg>pTx||y3@JS zQ|dpqR-U(|eYK-NOTBp%aW~^%5YpeJ;;rR{KZYU84HkKay!)?b=5?9>LY-nBp;mtR zZKc8)?^erg5em(cU%&YROQOnJkw8LUb5)mOFyE(onH$B7IZm^!FA#7{$-1Azc;qGf zn9Mh(-N5mpKBb-^(vLTgW>e1JtpaBgR-&(VDMUD4U7gpisi>*_L;Fi{&ou3h4O8(M zhH;d&qD@)%VSB6n8?-h^@M(nQ6`Ok{QK`H_mz*L|%*w1%ZUw;p1Qv`8yG6VrDjCxi zqNJ?0D^3u`7ZUEa=@+RR%P{mhCfg$7#S(G2XGrgB0M~Eg_ja~*fxlkgC`>vEfvc1~ zu5JAWz>@StH78SWNxN(Vbw{+)jTXa>5}0K;>@;AZQ<wU!Ar3NZSIE9LCD7mEQJJyv zj`<+bYxG@8{yqzmd{88O&b^q(3HuFxRebTWUVYs|))tnO#n72Vd-CO_kv|#5dM4!` z{RDInN*MvbhKF}2lwz50+FdeYXuA!>Y#f&U$Wn2=3>cM2V*Y;7$AX-KS$G>pkH-1C z7LPH?ov5&=eYzJ{Vdme0pt~SB(DjT_Uz;U{9=(}!+oPTJ34M$ty0vGee|}T@ozIb~ z{bNoAPdJbRK!QIg{uLjb2+7V`htzygMKRZas2ujzqYzVDBHq693z~fk4CCQc^kSY( zK?99<F_`l<EZdcVeh=t~qbs238cIOAUOCNFN%0DOmU`_qNm)QKK2m(}sIL5k4(nS7 z4rHef7d#FOh$-PX;pvQR6u%HQsSuB<xH!7|wLXMYBYGsyt>(qcURfn5+U4+0MDs=& zfIKn7!w#$qkUn$;wkJGF&pbrfJc=V~Mjr>bZE6YFUxsl7HWgE8;V+I1>BgoLXmOPP z`4R3^(!;P}GLz-;)>-ct*gejcnk|xFAlwbX?mc$L(|HRmvs=bcf`B0z6v?4)<cNPB z-P_K!_?8wefMyOokx#<&^VYT$gDj{|P=KnGry1ORr6}bDSw%ey33%2TcClkYmb^>; zm>tAJRNwyX{y~0OAbOhl0@vZR`Q@}u-M-DcZw*qf>V9ANgupuH`0gE>J?2TZwZp z>pbpv=aSq0Ou7SG;f=i)EBgAl=81)wTxCU!K-i{A-EsO}?I{GhQ+<9V@Yw(MT+h%1 zIA=s_GcUt!yTSkC=4af<Uam2>IsX+OJS|AaS$`tVhJkIM=LioIDZ;Fm!X(*V7g+4* zjB^<z{-mE%wSEnQmGDW&@SUq8uO*4jOUQ5oo%sE+^kt5}`&k`7G>%#&TmYF-(Klh4 z0D4UYJC&EVU%A$b8KypuOMVi*P^pM0vNJU34n{?XvV)kZspMe90NH|4D7_1;nzm;f z&QU5_Qkn&!f4`WD&0qJ_(WDOOL-l>3t$RDSD}&7$Ol4sOtdfnTP2J)g9<SxHEqXUI z=F#XFv53+*vTqsO8R=!;7!zmR%HE?lerqS-y)07Q1TZy^E<7Cbj<&Lv9++z6*IWKx z#A}CC@X|AWTCm~fx#N9+<EuB3V+3t?T9ETSz<qTvGC%jqD`1;^5VvZt#CVynhD<2n z^+O^HZ0W(*!@UjV8=<LRIF-8BP=D^lRX#{{C~Ni9Ta2~~NyUEw{Y4J(2x?nw<(K=& z)7<|&kz?ZO1&tn?u#4xzg8)G-i+p|t`)U`4yGT82%W^r%a_CI=*ZaF?y|U+}#8-n7 zd*>20{D(F7+7P$pXE22u*4&3VnqU8z=a6(m@a2CY`gcPLrj3Rj@#jaM<eA=@RI`dO z=|yh{nU_J47!sNQDwfM-|H?`zL3ZXzkH~V*=1n7Lb2cJD0+`GQwfkM<!vi#UMhoz0 z70B)Yp$aP9Os6Iwt;$%JpfXSbRr9|GrB2&a!wEO<2!W}nTde?5*gB7)GC=*F@t4~s z=kQ!#7TtR}peiHt@0|%&_GwhUf0SY!;RT!4<#Vv_e-6Cg#8CW=k3D+Npz3GKXux<l z8X}y2tW*@krV$i51>}ScrX+eP6x)w^t!9DtbRx*kcgUYF5Qbh|nvAS2F4-f{E!w0= zIHi4pz5BK>9JX>9jc5Hvyn)t63SI*(WATG5R8zD!IR!-;`JlFf%6hQ=0DJ-i9gm1( znM54$uASu@47C0Br+(wfCBj2;mUk@T>@B=l%0DUH+d@xf2rtgX6%kEr3*L4#4~|^_ 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 diff --git a/dox/img.png b/dox/img.png deleted file mode 100644 index 95122991d7c42905e5ddd927420db557e6d1f73b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681759 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�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 z�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⪙uF}pK&hVDApNnLc&l-#17&82+WCOHtkwW$FW0r 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�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%0Ahp4CM=8lX85$n#tcD8_$uXykLKAONZ! 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%0D@Xq6>{|@ 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≫s5mw6iGin9ehj5J=DKwUR;(J@sdrS1+MQx@fEX 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�>MzoUxnc%_N|*OKwGA>pv#m*d4fijoNUi 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 diff --git a/dox/logo.jpg b/dox/logo.jpg deleted file mode 100644 index 17aeb3377b96b8ec85fed719dd8b3fdc25bd6913..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10837 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 diff --git a/ext/CMakeLists.txt b/ext/CMakeLists.txt deleted file mode 100644 index 3c75cd07..00000000 --- a/ext/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -ADD_SUBDIRECTORY(amfe) diff --git a/ext/amfe b/ext/amfe deleted file mode 160000 index 7b5a21b0..00000000 --- a/ext/amfe +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7b5a21b0c5fc3885a11e98ebc2e5acbd19bc55bf diff --git a/heat/CMakeLists.txt b/heat/CMakeLists.txt deleted file mode 100644 index 3fc1d71d..00000000 --- a/heat/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Add source dir -ADD_SUBDIRECTORY( src ) -ADD_SUBDIRECTORY( _src ) - -# Add test dir -MACRO_AddTest(${CMAKE_CURRENT_SOURCE_DIR}/tests) diff --git a/heat/__init__.py b/heat/__init__.py deleted file mode 100644 index 312d11ec..00000000 --- a/heat/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# heat MODULE initialization file - -import fwk -import tbox -from heatw import * diff --git a/heat/_src/CMakeLists.txt b/heat/_src/CMakeLists.txt deleted file mode 100644 index 3507ecc2..00000000 --- a/heat/_src/CMakeLists.txt +++ /dev/null @@ -1,52 +0,0 @@ - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# CMake input file of the SWIG wrapper around "heatw.so" - -INCLUDE(${SWIG_USE_FILE}) - -FILE(GLOB SRCS *.h *.cpp *.inl *.swg) -FILE(GLOB ISRCS *.i) - -SET(CMAKE_SWIG_FLAGS "") -SET_SOURCE_FILES_PROPERTIES(${ISRCS} PROPERTIES CPLUSPLUS ON) - -SET(SWINCFLAGS --I${PROJECT_SOURCE_DIR}/heat/src --I${PROJECT_SOURCE_DIR}/ext/amfe/tbox/src --I${PROJECT_SOURCE_DIR}/ext/amfe/tbox/_src --I${PROJECT_SOURCE_DIR}/ext/amfe/fwk/src --I${PROJECT_SOURCE_DIR}/ext/amfe/fwk/_src -) -SET_SOURCE_FILES_PROPERTIES(${ISRCS} PROPERTIES SWIG_FLAGS "${SWINCFLAGS}") - -if (${CMAKE_VERSION} VERSION_LESS "3.8.0") - SWIG_ADD_MODULE(heatw python ${ISRCS} ${SRCS}) -else() - SWIG_ADD_LIBRARY(heatw LANGUAGE python SOURCES ${ISRCS} ${SRCS}) -endif() -MACRO_DebugPostfix(_heatw) - -TARGET_INCLUDE_DIRECTORIES(_heatw PRIVATE ${PROJECT_SOURCE_DIR}/ext/amfe/fwk/_src - ${PROJECT_SOURCE_DIR}/ext/amfe/tbox/_src - ${PYTHON_INCLUDE_PATH} -) - -SWIG_LINK_LIBRARIES(heatw - heat tbox fwk ${PYTHON_LIBRARIES} -) - -INSTALL(FILES ${CMAKE_SWIG_OUTDIR}/heatw.py DESTINATION ${CMAKE_INSTALL_PREFIX}) -INSTALL(TARGETS _heatw DESTINATION ${CMAKE_INSTALL_PREFIX}) diff --git a/heat/_src/heatw.i b/heat/_src/heatw.i deleted file mode 100644 index 0e9b0695..00000000 --- a/heat/_src/heatw.i +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// SWIG input file of the 'heat' module - -%feature("autodoc","1"); - -%module(docstring= -"'heatw' module: projet MP 2015/2016 -(c) ULg - A&M", -directors="1", -threads="1" -) heatw -%{ - -#include <string> -#include <sstream> -#include <typeinfo> -#include "heat.h" - -#include "wProblem.h" - -#include "wBoundary.h" -#include "wMedium.h" -#include "wSource.h" -#include "wDirichlet.h" -#include "wPeriodic.h" - -#include "wSolver.h" - -#include "wCompiledFct.h" - -#include "wDisplayHook.h" - -#include "fwkw.h" -#include "tboxw.h" - -#include "wExtractor.h" - -%} - - -%include "fwkw.swg" - -// ----------- MODULES UTILISES ------------ -%import "tboxw.i" - -// ----------- HEAT CLASSES ---------------- -%include "heat.h" - -%shared_ptr(heat::Medium); -%shared_ptr(heat::Source); -%shared_ptr(heat::Dirichlet); -%shared_ptr(heat::Boundary); -%shared_ptr(heat::Periodic); -%shared_ptr(heat::Problem); -%shared_ptr(heat::Solver); - - - -%feature("director") heat::DisplayHook; -%include "wDisplayHook.h" - -%feature("director:except") { - if ($error != NULL) { - std::cout << "[in director:except]\n"; - //throw Swig::DirectorMethodException(); - throw std::runtime_error("Director problem"); - } -} - -%include "wDirichlet.h" -%include "wMedium.h" -%include "wSource.h" -%include "wBoundary.h" -%include "wPeriodic.h" -%shared_ptr(heat::CompiledFct1a); -%shared_ptr(heat::CompiledFct2a); -%shared_ptr(heat::CompiledFct1b); -%shared_ptr(heat::CompiledFct2b); -%include "wCompiledFct.h" -%include "wExtractor.h" - -%immutable heat::Problem::msh; // avoids the creation of the setter method -%include "wProblem.h" - -%immutable heat::Solver::pbl; // avoids the creation of the setter method -%immutable heat::Solver::tms; // avoid the creation of the setter method -%include "wSolver.h" diff --git a/heat/broken/heat_multiscale.py b/heat/broken/heat_multiscale.py deleted file mode 100755 index d8d6cd58..00000000 --- a/heat/broken/heat_multiscale.py +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# 1er test multiscale (sans MPI) - - - - -import heat as h -import tbox -import tbox.gmsh as gmsh -import math - -class MicroModel(tbox.Fct2UdU): - def __init__(self): - tbox.Fct2UdU.__init__(self) - print("[m] creation of the micro model") - - self.msh = gmsh.MeshLoader("heat_ms_micro.geo", __file__).execute() - self.pbl = h.Problem(self.msh) - - self.solver = h.Solver(self.pbl) - self.solver.nthreads = 1 - self.solver.save = False - self.solver.verbose = 0 - - h.Medium(self.pbl, "Matrix", tbox.Fct2C(1.,1.,0), 1.0) - h.Medium(self.pbl, "Inclusion", tbox.Fct2C(100.,100.,0), 1.0) - self.p = h.Periodic(self.pbl, 0.0, 0.0, 0.0) - - def eval(self, elem, npg, u, gradu, k, fake): - #def eval(self, u, gradu, k, fake): - verb=False - - TM = u - dTxM = gradu[0] - dTyM = gradu[1] - dTnorm = math.sqrt(dTxM*dTxM+dTyM*dTyM) - if dTnorm==0.0: - dTxM = 1.0 - dTyM = 1.0 - dTnorm=math.sqrt(dTxM*dTxM+dTyM*dTyM) - - if verb: - print("-"*10) - print("**solving micro problem...") - print("[m] TM =",TM) - print("[m] dTxM =",dTxM) - print("[m] dTyM =",dTyM) - - #if dTxM==0: dTxM=1e-5 - #if dTyM==0: dTyM=1e-5 - - self.p.reset(TM, dTxM, dTyM) - self.solver.start() - - qMx = self.p.qM[0] - qMy = self.p.qM[1] - - if verb: - print("[m] qMx =", qMx) - print("[m] qMy =", qMy) - - dTnorm = math.sqrt(dTxM*dTxM+dTyM*dTyM) - qnorm = math.sqrt(qMx*qMx+qMy*qMy) - ampl = qnorm / dTnorm - - ps = -(dTxM*qMx+dTyM*qMy)/dTnorm/qnorm - if ps>1.0: ps=1.0 - if ps<-1.0: ps=-1.0 - - #print ps - ang = math.acos(ps) - print("ang=", ang, "ampl=", ampl) - #print "qMx=", qMx, "ampl*dT=", dTxM*ampl, "res=", qMx-dTxM*ampl - cos = math.cos(ang) - sin = math.sin(ang) - K11 = cos*ampl - K21 = sin*ampl - K22 = K11 - K12 = -K21 - - k[0,0]=K11 - k[1,1]=K22 - k[1,0]=K21 - k[0,1]=K12 - - if verb: - print(k) - -def main(): - - msh = gmsh.MeshLoader("heat_ms_macro.geo", __file__).execute() - pbl = h.Problem(msh) - - solver = h.Solver(pbl) - solver.nthreads = 1 - - myk = MicroModel() - h.Medium(pbl, "S1", myk) - - h.Dirichlet(pbl,"Left", 0.) - h.Dirichlet(pbl,"Right", 10.) - - solver.restol = 1e-6 - solver.start() - - from heat.viewer import GUI - GUI().open('heat_ms_macro') - -if __name__ == "__main__": - main() diff --git a/heat/broken/honeycomb_jalil.geo b/heat/broken/honeycomb_jalil.geo deleted file mode 100644 index 325d850d..00000000 --- a/heat/broken/honeycomb_jalil.geo +++ /dev/null @@ -1,71 +0,0 @@ -// Gmsh project created on Tue Mar 31 15:09:01 2015 - -L=3; // Length of the cell -l=2; // Width of the cell -e=0.15; //width of the hexagonal path -d=0.75; //Side of the hexagon -density=0.1; - - -Point(1) = {0, 0, 0, density}; -Point(2) = {0, L, 0, density}; -Point(3) = {l, L, 0, density}; -Point(4) = {l, 0, 0, density}; -Point(5) = {l/2-e/2, L, 0, density}; -Point(6) = {l/2+e/2, L, 0, density}; -Point(7) = {l/2+e/2, 0, 0, density}; -Point(8) = {l/2-e/2, 0, 0, density}; -Point(9) = {l/2-e/2, d/2, 0, density}; -Point(10) = {l/2+e/2, d/2, 0, density}; -Point(11) = {l/2+e/2, L-d/2, 0, density}; -Point(12) = {l/2-e/2, L-d/2, 0, density}; -Point(13) = {0, L/2-d/2, 0, density}; -Point(14) = {0, L/2+d/2, 0, density}; -Point(15) = {l, L/2+d/2, 0, density}; -Point(16) = {l, L/2-d/2, 0, density}; -Point(17) = {l/2, d/2+e/2, 0, density}; -Point(18) = {l/2, L-d/2-e/2, 0, density}; -Point(19) = {e/2, L/2-d/2+e/2, 0, density}; -Point(20) = {e/2, L/2+d/2-e/2, 0, density}; -Point(21) = {l-e/2, L/2+d/2-e/2, 0, density}; -Point(22) = {l-e/2, L/2-d/2+e/2, 0, density}; -Line(1) = {1, 8}; -Line(2) = {8, 7}; -Line(3) = {7, 4}; -Line(4) = {4, 16}; -Line(5) = {16, 15}; -Line(6) = {15, 3}; -Line(7) = {3, 6}; -Line(8) = {6, 5}; -Line(9) = {5, 2}; -Line(10) = {2, 14}; -Line(11) = {14, 13}; -Line(12) = {13, 1}; -Line(13) = {8, 9}; -Line(14) = {7, 10}; -Line(15) = {10, 16}; -Line(16) = {15, 11}; -Line(17) = {11, 6}; -Line(18) = {12, 5}; -Line(19) = {12, 14}; -Line(20) = {13, 9}; -Line(21) = {17, 22}; -Line(22) = {22, 21}; -Line(23) = {21, 18}; -Line(24) = {18, 20}; -Line(25) = {20, 19}; -Line(26) = {19, 17}; -Line Loop(27) = {2, 14, 15, 5, 16, 17, 8, -18, 19, 11, 20, -13}; -Line Loop(28) = {21, 22, 23, 24, 25, 26}; -Plane Surface(29) = {27, 28}; -Line Loop(30) = {1, 13, -20, 12}; -Plane Surface(31) = {30}; -Line Loop(32) = {3, 4, -15, -14}; -Plane Surface(33) = {32}; -Line Loop(34) = {6, 7, -17, -16}; -Plane Surface(35) = {34}; -Line Loop(36) = {9, 10, -19, 18}; -Plane Surface(37) = {36}; -Plane Surface(38) = {28}; -Physical Surface("Skeleton") = {29}; -Physical Surface("Air") = {38, 37, 35, 31, 33}; diff --git a/heat/broken/honeycomb_jalil.py b/heat/broken/honeycomb_jalil.py deleted file mode 100755 index b6d1d752..00000000 --- a/heat/broken/honeycomb_jalil.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# test periodic BCs - - -import heat as h -import tbox -import tbox.gmsh as gmsh - -def main(): - msh = gmsh.MeshLoader("honeycomb_jalil.geo", __file__).execute() - pbl = h.Problem(msh) - - solver = h.Solver(pbl) - solver.nthreads = 6 - - fa=tbox.PwLf() - fa.add(0, 80) - fa.add(300, 80) - fa.add(350, 20) - fa.add(450, 10) - fa.add(550, 5) - fa.add(750, 1) - fa.add(1000, 1) - - fs=tbox.PwLf() - fs.add(0, 140) - fs.add(300, 140) - fs.add(350, 180) - fs.add(450, 200) - fs.add(550, 210) - fs.add(750, 220) - fs.add(1000, 220) - - fz = tbox.PwLf() - fz.add(0,0) - - h.Medium(pbl, "Air", tbox.Fct2PwLf(fa,fa,fz), 1.) - h.Medium(pbl, "Skeleton", tbox.Fct2PwLf(fs,fs,fz), 1.) - - TM = 600.0 - dTxM = 0. - dTyM = 200. - p = h.Periodic(pbl, TM, dTxM, dTyM) - - solver.restol = 1e-6 - solver.start() - - print("mean flux=", p.qM) - - from heat.viewer import GUI - GUI().open('honeycomb_jalil') - -if __name__ == "__main__": - main() diff --git a/heat/broken/jalil1.py b/heat/broken/jalil1.py deleted file mode 100755 index 4b546fdd..00000000 --- a/heat/broken/jalil1.py +++ /dev/null @@ -1,247 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# test multiscale - -# exc: mpiexec.openmpi -n 12 ./jalil1.py - - - - - - -import heat as h -import tbox -import tbox.gmsh as gmsh -import math -import mpi4py.MPI as mpi - -comm = mpi.COMM_WORLD -rank = comm.rank -siz = comm.size - -""" -if siz!=2: - print "error! siz=%d"% siz - import sys; sys.exit() -""" - -class Job: - def __init__(self, TM, dTxM, dTyM): - # input - self.TM = TM - self.dTxM = dTxM - self.dTyM = dTyM - # output - self.K11 = 0.0 - self.K22 = 0.0 - self.K12 = 0.0 - self.K21 = 0.0 - # killme - self.killme = False - -class MicroModel(tbox.Fct2UdU): - def __init__(self): - tbox.Fct2UdU.__init__(self) - print("[m] creation of the micro model") - - self.msh = gmsh.MeshLoader("jalil1_micro.geo", __file__).execute() - self.pbl = h.Problem(self.msh) - - self.solver = h.Solver(self.pbl) - self.solver.nthreads = 1 - self.solver.save = False - self.solver.verbose = 0 - - h.Medium(self.pbl, "Matrix", tbox.Fct2C(10.,10.,0), 1.0) - h.Medium(self.pbl, "Inclusion", tbox.Fct2C(140.,140.,0), 1.0) - self.p = h.Periodic(self.pbl, 0.0, 0.0, 0.0) - - self.verb = False - - self.jobs = [] - self.ijob = 0 - - def execute(self, job): - - TM = job.TM - dTxM = job.dTxM - dTyM = job.dTyM - - self.p.reset(TM, dTxM, dTyM) - self.solver.start() - - # resulting flux qM - qMx = self.p.qM[0] - qMy = self.p.qM[1] - - if self.verb: - print("[m] qMx =", qMx) - print("[m] qMy =", qMy) - - # convert flux to an anisotropic conductivity "k(2,2)" - dTnorm=math.sqrt(dTxM*dTxM+dTyM*dTyM) - qnorm=math.sqrt(qMx*qMx+qMy*qMy) - ampl=qnorm/dTnorm - - ps=-(dTxM*qMx+dTyM*qMy)/dTnorm/qnorm - if ps>1.0: ps=1.0 - if ps<-1.0: ps=-1.0 - - #print ps - ang=math.acos(ps) - #print "ang=", ang, "ampl=", ampl - #print "qMx=", qMx, "ampl*dT=", dTxM*ampl, "res=", qMx-dTxM*ampl - cos=math.cos(ang) - sin=math.sin(ang) - job.K11 = cos*ampl - job.K21 = sin*ampl - job.K22 = job.K11 # => K22 inutile! - job.K12 = -job.K21 # => K12 inutile! - - def eval(self, elem, npg, u, gradu, k, fake): # tjs exécuté par rank#0 - if fake: # on cree un job - TM = u - dTxM = gradu[0] - dTyM = gradu[1] - dTnorm=math.sqrt(dTxM*dTxM+dTyM*dTyM) - if dTnorm==0.0: - dTxM = 1.0 - dTyM = 1.0 - dTnorm=math.sqrt(dTxM*dTxM+dTyM*dTyM) - - if self.verb: - print("[m] TM =",TM) - print("[m] dTxM =",dTxM) - print("[m] dTyM =",dTyM) - - if self.ijob==0: - job = Job(TM, dTxM, dTyM) - self.jobs.append(job) - #print "[%d] adding job #%d" % (rank,len(self.jobs)) - else: - if self.ijob==len(self.jobs): - self.ijob=0 - job = self.jobs[self.ijob] - job.TM=TM - job.dTxM=dTxM - job.dTyM=dTyM - self.ijob+=1 - - else: # on retourne le resultat du job - if self.ijob==len(self.jobs): - self.ijob=0 - #print "[%d] retrieving results from job #%d/%d" % (rank, self.ijob, len(self.jobs)) - job = self.jobs[self.ijob] - k[0,0]=job.K11 - k[1,1]=job.K22 - k[1,0]=job.K21 - k[0,1]=job.K12 - self.ijob+=1 - - - def evalall(self): # tjs exécuté par rank#0 - #print "looping on %d jobs" % len(self.jobs) - - # version 1 proc (master travaille seul) - if siz==1: - for job in self.jobs: - self.execute(job) - return - - # version 2 procs (1 slave - 1 master) - """ - for job in self.jobs: - #self.execute(job) - - print "[%d] sending job to 1.." % rank - comm.send(job, dest = 1) - print "[%d] waiting job from 1.." % rank - job2 = comm.recv(source = 1) - print "[%d] job received from 1!" % rank - job.K11=job2.K11 - job.K22=job2.K22 - job.K12=job2.K12 - job.K21=job2.K21 - """ - - # version N procs - i=0 - njobs=len(self.jobs) - slaves=list(range(1,siz)) - while True: - #send jobs to slaves - jlist=[] - for s in slaves: - if i==njobs: break - job = self.jobs[i] - jlist.append( (job,s) ) - if self.verb: print("[%d] sending job #%d to %s.." % (rank,i,s)) - comm.send(job, dest = s) - i+=1 - - if not jlist: - break - - #receive jobs - for (job,s) in jlist: - if self.verb: print("[%d] waiting job from %d.." % (rank,s)) - job2 = comm.recv(source = s) - if self.verb: print("[%d] job received from %d!" % (rank,s)) - job.K11=job2.K11 - job.K22=job2.K22 - job.K12=job2.K12 - job.K21=job2.K21 - - -def main(): - - myk = MicroModel() # chaque process a son objet "modèle micro" (distinct) - - if rank==0: - if myk.verb: print("[%d] démarrage du modèle macro" % rank) - msh = gmsh.MeshLoader("jalil1_corner.geo", __file__).execute() - pbl = h.Problem(msh) - - solver = h.Solver(pbl) - solver.nthreads = 1 - - h.Medium(pbl, "Volume", myk) - - h.Dirichlet(pbl,"Top BC", 400.) - h.Dirichlet(pbl,"Right BC", 600.) - - solver.restol = 1e-6 - solver.start() - - # kill slaves: - slaves=list(range(1,siz)) - for s in slaves: - job=Job(0,0,0); job.killme=True - if myk.verb: print("[%d] sending suicide job to %d" % (rank,s)) - comm.send(job, dest = s) - - from heat.viewer import GUI - GUI().open('jalil1_corner') - - else: - myk.verb=False - if myk.verb: print("[%d] démarrage d'un modèle micro" % rank) - - while True: - # attend un gradient et cree un job - if myk.verb: print("[%d] waiting job from 0.." % rank) - job = comm.recv(source = 0) # recoit un job - - if job.killme: - if myk.verb: print("[%d] Aaargl!" % rank) - break - - if myk.verb: print("[%d] job received from 0!" % rank) - myk.execute(job) # execute le job - if myk.verb: print("[%d] sending job to 0.." % rank) - comm.send(job, dest = 0) # envoie le resultat - if myk.verb: print("[%d] job sent to 0.." % rank) - -if __name__ == "__main__": - main() - print("[%d] end." % rank) diff --git a/heat/broken/jalil1_corner.geo b/heat/broken/jalil1_corner.geo deleted file mode 100644 index d7f276db..00000000 --- a/heat/broken/jalil1_corner.geo +++ /dev/null @@ -1,23 +0,0 @@ -// Gmsh project created on Sun May 10 12:08:39 2015 -L=10; //Length of each branch -w=2; // Width of the branch -d=2; //Density of elements -d=0.5; //Density of elements - -Point(1) = {0, 0, 0, d}; -Point(2) = {L, 0, 0, d}; -Point(3) = {L, w, 0, d}; -Point(4) = {0, L, 0, d}; -Point(5) = {w, L, 0, d}; -Point(6) = {w, w, 0, d}; -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 6}; -Line(4) = {6, 5}; -Line(5) = {5, 4}; -Line(6) = {4, 1}; -Line Loop(7) = {6, 1, 2, 3, 4, 5}; -Plane Surface(8) = {7}; -Physical Line("Top BC") = {5}; -Physical Line("Right BC") = {2}; -Physical Surface("Volume") = {8}; diff --git a/heat/broken/jalil1_micro.geo b/heat/broken/jalil1_micro.geo deleted file mode 100644 index 73f9a94a..00000000 --- a/heat/broken/jalil1_micro.geo +++ /dev/null @@ -1,60 +0,0 @@ -// RVE - -Lx = 0.01; -Ly = Lx; - -lc = Lx/10; - -ix = 6*Lx/10; -iy = 6*Lx/10; -iR = 3*Lx/10; - -// -- outer boundary - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { Lx, 0, 0, lc}; -Point(3) = { Lx, Ly, 0, lc}; -Point(4) = { 0, Ly, 0, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line Loop(1) = {1, 2, 3, 4}; - -// -- inclusion - -Point(11) = { ix-iR, iy, 0, lc}; -Point(12) = { ix, iy, 0, lc}; -Point(13) = { ix+iR, iy, 0, lc}; - -Circle(10) = {11, 12, 13}; -Circle(11) = {13, 12, 11}; - -Line Loop(11) = {11, 10}; - -Plane Surface(11) = {11}; - -// -- matrix - -Plane Surface(1) = {1, 11}; - - -Physical Point("P1") = {1}; -Physical Point("P2") = {2}; -Physical Point("P3") = {3}; -Physical Point("P4") = {4}; - -Physical Line("Bottom") = {1}; -Physical Line("Right") = {2}; -Physical Line("Top") = {3}; -Physical Line("Left") = {4}; - -Physical Surface("Matrix") = {1}; -Physical Surface("Inclusion") = {11}; - - - - - diff --git a/heat/broken/jalil1_micro.py b/heat/broken/jalil1_micro.py deleted file mode 100755 index 086a8eaf..00000000 --- a/heat/broken/jalil1_micro.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# simple RVE with 2 materials for testing periodic BCs - - -import heat as h -import tbox -import tbox.gmsh as gmsh - -def main(): - - msh = gmsh.MeshLoader("jalil1_micro.geo", __file__).execute() - - pbl = h.Problem(msh) - - solver = h.Solver(pbl) - solver.nthreads = 4 - - h.Medium(pbl, "Matrix", tbox.Fct2C(10.,10.,0), 1.0) - h.Medium(pbl, "Inclusion", tbox.Fct2C(140.,140.,0), 1.0) - - TM = 0.0 - dTxM = 1.0 - dTyM = 1.0 - p = h.Periodic(pbl, TM, dTxM, dTyM) - - solver.start() - print("flux=", p.qM) - - from heat.viewer import GUI - GUI().open('jalil1_micro') - -if __name__ == "__main__": - main() diff --git a/heat/broken/jalil2.py b/heat/broken/jalil2.py deleted file mode 100755 index cecfa974..00000000 --- a/heat/broken/jalil2.py +++ /dev/null @@ -1,270 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# test multiscale - -# mpiexec.openmpi --bycore --bind-to-core -n 6 ./run.py heat/tests/jalil2.py - - - - - - - - -import heat as h -import tbox -import tbox.gmsh as gmsh -import math - -try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - print("info: MPI found") -except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - -class Job: - """ Class containing data transmitted between MPI procs - """ - def __init__(self, id, TM, dTxM, dTyM): - # input - self.id = id # debug - self.TM = TM - self.dTxM = dTxM - self.dTyM = dTyM - # output - self.K11 = 0.0 - self.K22 = 0.0 # useless (=K11) - self.K12 = 0.0 - self.K21 = 0.0 # useless (=-K12) - # killme - self.killme = False - - -class MicroModel(tbox.Fct2UdU): - def __init__(self): - """ - creation du micro modele - """ - tbox.Fct2UdU.__init__(self) - print("[m] creation of the micro model") - - self.msh = gmsh.MeshLoader("jalil2_honey.geo", __file__).execute() - self.pbl = h.Problem(self.msh) - - self.solver = h.Solver(self.pbl) - self.solver.nthreads = 1 - self.solver.save = False - self.solver.verbose = 0 - - self.fa=tbox.PwLf() - self.fa.add(0, 80) - self.fa.add(300, 80) - self.fa.add(350, 20) - self.fa.add(450, 10) - self.fa.add(550, 5) - self.fa.add(750, 1) - self.fa.add(1000, 1) - - self.fs=tbox.PwLf() - self.fs.add(0, 140) - self.fs.add(300, 140) - self.fs.add(350, 180) - self.fs.add(450, 200) - self.fs.add(550, 210) - self.fs.add(750, 220) - self.fs.add(1000, 220) - - self.fz = tbox.PwLf() - self.fz.add(0,0) - - h.Medium(self.pbl, "Air", tbox.Fct2PwLf(self.fa,self.fa,self.fz), 1.) - h.Medium(self.pbl, "Skeleton", tbox.Fct2PwLf(self.fs,self.fs,self.fz), 1.) - - self.p = h.Periodic(self.pbl, 0.0, 0.0, 0.0) - - self.verb = False - - self.jbz = {} # liste des jobs - - def execute(self, job): - - TM = job.TM - dTxM = job.dTxM - dTyM = job.dTyM - - self.p.reset(TM, dTxM, dTyM) - self.solver.start() - - # resulting flux qM - qMx = self.p.qM[0] - qMy = self.p.qM[1] - - if self.verb: - print("[m] qMx =", qMx) - print("[m] qMy =", qMy) - - # convert flux to an anisotropic conductivity "k(2,2)" - dTnorm=math.sqrt(dTxM*dTxM+dTyM*dTyM) - qnorm=math.sqrt(qMx*qMx+qMy*qMy) - ampl=qnorm/dTnorm - - ps=-(dTxM*qMx+dTyM*qMy)/dTnorm/qnorm - if ps>1.0: ps=1.0 - if ps<-1.0: ps=-1.0 - - #print ps - ang=math.acos(ps) - #print "ang=", ang, "ampl=", ampl - #print "qMx=", qMx, "ampl*dT=", dTxM*ampl, "res=", qMx-dTxM*ampl - cos=math.cos(ang) - sin=math.sin(ang) - job.K11 = cos*ampl - job.K21 = sin*ampl - job.K22 = job.K11 # => K22 inutile! - job.K12 = -job.K21 # => K12 inutile! - - def eval(self, elem, npg, u, gradu, k, fake): # tjs exécuté par rank#0 - if fake: # on cree un job - TM = u - dTxM = gradu[0] - dTyM = gradu[1] - dTnorm=math.sqrt(dTxM*dTxM+dTyM*dTyM) - if dTnorm==0.0: - dTxM = 1.0 - dTyM = 1.0 - dTnorm=math.sqrt(dTxM*dTxM+dTyM*dTyM) - - if self.verb: - print("[m] TM =",TM) - print("[m] dTxM =",dTxM) - print("[m] dTyM =",dTyM) - - job = self.jbz.get((elem.no,npg)) - if job: # job existe deja, on le modifie - job.TM=TM - job.dTxM=dTxM - job.dTyM=dTyM - else: # on ajoute ce job - self.jbz[(elem.no,npg)] = Job((elem.no,npg), TM, dTxM, dTyM) - #print "[m] creating job", (elem.no,npg) - - - else: # on retourne le resultat du job - - job = self.jbz.get((elem.no,npg)) - if not job: - print("[m] job", (elem.no,npg), "not found!") - #else: - # print "[m] job", (elem.no,npg), "OK!" - k[0,0]=job.K11 - k[1,1]=job.K22 - k[1,0]=job.K21 - k[0,1]=job.K12 - - - def evalall(self): # tjs exécuté par rank#0 - - #print "looping on %d jobs" % len(self.jobs) - - # version 1 proc (master travaille seul) - if siz==1: - #for job in self.jbz.itervalues(): - for id,job in self.jbz.items(): - self.execute(job) - return - - # version N procs - it=self.jbz.__iter__() - njobs=len(self.jbz) - slaves=list(range(1,siz)) - while True: - #send jobs to slaves - jlist=[] - for s in slaves: - try: - jobk = next(it) # get next job - except: - break - job = self.jbz[jobk] - jlist.append( (job,s) ) - if self.verb: - print("[%d] sending job %s to %s.." % (rank,jobk,s)) - comm.send(job, dest = s) - - if not jlist: # plus de job? - break - - #receive jobs - for (job,s) in jlist: - if self.verb: print("[%d] waiting job from %d.." % (rank,s)) - job2 = comm.recv(source = s) - if self.verb: print("[%d] job received from %d!" % (rank,s)) - job.K11=job2.K11 - job.K22=job2.K22 - job.K12=job2.K12 - job.K21=job2.K21 - - -def main(): - - myk = MicroModel() # chaque process a son objet "modèle micro" (distinct) - - # faire en sorte que le rank0 charge le micro en 1er - - if rank==0: - if myk.verb: print("[%d] démarrage du modèle macro" % rank) - msh = gmsh.MeshLoader("jalil1_corner.geo", __file__).execute() - pbl = h.Problem(msh) - - solver = h.Solver(pbl) - solver.nthreads = 1 - - h.Medium(pbl, "Volume", myk) - - h.Dirichlet(pbl,"Top BC", 400.) - h.Dirichlet(pbl,"Right BC", 600.) - - solver.restol = 1e-6 - solver.start() - - # kill slaves: - slaves=list(range(1,siz)) - for s in slaves: - job=Job((0,0),0,0,0); job.killme=True - if myk.verb: print("[%d] sending suicide job to %d" % (rank,s)) - comm.send(job, dest = s) - - from heat.viewer import GUI - GUI().open('jalil1_corner') - - else: - myk.verb=False - if myk.verb: print("[%d] démarrage d'un modèle micro" % rank) - - while True: - # attend un gradient et cree un job - if myk.verb: print("[%d] waiting for job from 0.." % rank) - job = comm.recv(source = 0) # recoit un job - - if job.killme: - if myk.verb: print("[%d] Aaargl!" % rank) - break - - if myk.verb: print("[%d] job received from 0!" % rank) - myk.execute(job) # execute le job - if myk.verb: print("[%d] sending job results to 0.." % rank) - comm.send(job, dest = 0) # envoie le resultat - if myk.verb: print("[%d] job results sent to 0.." % rank) - -if __name__ == "__main__": - main() - print("[%d] end." % rank) - diff --git a/heat/broken/jalil2_honey.geo b/heat/broken/jalil2_honey.geo deleted file mode 100644 index bb336152..00000000 --- a/heat/broken/jalil2_honey.geo +++ /dev/null @@ -1,71 +0,0 @@ -// Gmsh project created on Tue Mar 31 15:09:01 2015 - -L=0.003; // Length of the cell -l=0.002; // Width of the cell -e=0.00015; //width of the hexagonal path -d=0.00075; //Side of the hexagon -density=0.0002; - - -Point(1) = {0, 0, 0, density}; -Point(2) = {0, L, 0, density}; -Point(3) = {l, L, 0, density}; -Point(4) = {l, 0, 0, density}; -Point(5) = {l/2-e/2, L, 0, density}; -Point(6) = {l/2+e/2, L, 0, density}; -Point(7) = {l/2+e/2, 0, 0, density}; -Point(8) = {l/2-e/2, 0, 0, density}; -Point(9) = {l/2-e/2, d/2, 0, density}; -Point(10) = {l/2+e/2, d/2, 0, density}; -Point(11) = {l/2+e/2, L-d/2, 0, density}; -Point(12) = {l/2-e/2, L-d/2, 0, density}; -Point(13) = {0, L/2-d/2, 0, density}; -Point(14) = {0, L/2+d/2, 0, density}; -Point(15) = {l, L/2+d/2, 0, density}; -Point(16) = {l, L/2-d/2, 0, density}; -Point(17) = {l/2, d/2+e/2, 0, density}; -Point(18) = {l/2, L-d/2-e/2, 0, density}; -Point(19) = {e/2, L/2-d/2+e/2, 0, density}; -Point(20) = {e/2, L/2+d/2-e/2, 0, density}; -Point(21) = {l-e/2, L/2+d/2-e/2, 0, density}; -Point(22) = {l-e/2, L/2-d/2+e/2, 0, density}; -Line(1) = {1, 8}; -Line(2) = {8, 7}; -Line(3) = {7, 4}; -Line(4) = {4, 16}; -Line(5) = {16, 15}; -Line(6) = {15, 3}; -Line(7) = {3, 6}; -Line(8) = {6, 5}; -Line(9) = {5, 2}; -Line(10) = {2, 14}; -Line(11) = {14, 13}; -Line(12) = {13, 1}; -Line(13) = {8, 9}; -Line(14) = {7, 10}; -Line(15) = {10, 16}; -Line(16) = {15, 11}; -Line(17) = {11, 6}; -Line(18) = {12, 5}; -Line(19) = {12, 14}; -Line(20) = {13, 9}; -Line(21) = {17, 22}; -Line(22) = {22, 21}; -Line(23) = {21, 18}; -Line(24) = {18, 20}; -Line(25) = {20, 19}; -Line(26) = {19, 17}; -Line Loop(27) = {2, 14, 15, 5, 16, 17, 8, -18, 19, 11, 20, -13}; -Line Loop(28) = {21, 22, 23, 24, 25, 26}; -Plane Surface(29) = {27, 28}; -Line Loop(30) = {1, 13, -20, 12}; -Plane Surface(31) = {30}; -Line Loop(32) = {3, 4, -15, -14}; -Plane Surface(33) = {32}; -Line Loop(34) = {6, 7, -17, -16}; -Plane Surface(35) = {34}; -Line Loop(36) = {9, 10, -19, 18}; -Plane Surface(37) = {36}; -Plane Surface(38) = {28}; -Physical Surface("Skeleton") = {29}; -Physical Surface("Air") = {38, 37, 35, 31, 33}; diff --git a/heat/broken/jalil2_honey.py b/heat/broken/jalil2_honey.py deleted file mode 100755 index 8f352db3..00000000 --- a/heat/broken/jalil2_honey.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# simple RVE with 2 materials for testing periodic BCs - - -import heat as h -import tbox -import tbox.gmsh as gmsh - -def main(): - - msh = gmsh.MeshLoader("jalil2_honey.geo", __file__).execute() - - pbl = h.Problem(msh) - - solver = h.Solver(pbl) - solver.nthreads = 4 - - fa = tbox.PwLf() - fa.add(0, 80) - fa.add(300, 80) - fa.add(350, 20) - fa.add(450, 10) - fa.add(550, 5) - fa.add(750, 1) - fa.add(1000, 1) - - fs = tbox.PwLf() - fs.add(0, 140) - fs.add(300, 140) - fs.add(350, 180) - fs.add(450, 200) - fs.add(550, 210) - fs.add(750, 220) - fs.add(1000, 220) - - fz = tbox.PwLf() - fz.add(0,0) - - h.Medium(pbl, "Air", tbox.Fct2PwLf(fa,fa,fz), 1.) - h.Medium(pbl, "Skeleton", tbox.Fct2PwLf(fs,fs,fz), 1.) - - TM = 500.0 - dTxM = 1.0 - dTyM = 0.0 - p= h.Periodic(pbl, TM, dTxM, dTyM) - - solver.start() - print("flux=", p.qM) - from heat.viewer import GUI - GUI().open('jalil2_honey') - -if __name__ == "__main__": - main() diff --git a/heat/broken/jalil2_taskpull.py b/heat/broken/jalil2_taskpull.py deleted file mode 100755 index 8335695e..00000000 --- a/heat/broken/jalil2_taskpull.py +++ /dev/null @@ -1,82 +0,0 @@ - -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# test multiscale - version "task pull" -# exc: -# mpiexec.openmpi --bycore --bind-to-core -n 6 ./run.py heat/tests/jalil2_taskpull.py - -import heat as h -import tbox -import tbox.gmsh as gmsh -import heat.fe2 as fe2 - -class HoneyComb: - def __init__(self): - self.msh = gmsh.MeshLoader("jalil2_honey.geo", __file__).execute() - self.pbl = h.Problem(self.msh) - - self.solver = h.Solver(self.pbl) - self.solver.nthreads = 1 - self.solver.save = False - self.solver.verbose = 0 - - self.fa=tbox.PwLf() - self.fa.add(0, 80) - self.fa.add(300, 80) - self.fa.add(350, 20) - self.fa.add(450, 10) - self.fa.add(550, 5) - self.fa.add(750, 1) - self.fa.add(1000, 1) - - self.fs=tbox.PwLf() - self.fs.add(0, 140) - self.fs.add(300, 140) - self.fs.add(350, 180) - self.fs.add(450, 200) - self.fs.add(550, 210) - self.fs.add(750, 220) - self.fs.add(1000, 220) - - self.fz = tbox.PwLf() - self.fz.add(0,0) - - h.Medium(self.pbl, "Air", tbox.Fct2PwLf(self.fa,self.fa,self.fz), 1.) - h.Medium(self.pbl, "Skeleton", tbox.Fct2PwLf(self.fs,self.fs,self.fz), 1.) - - self.p = h.Periodic(self.pbl, 0.0, 0.0, 0.0) - - -class Lshape: - def __init__(self, law): - self.msh = gmsh.MeshLoader("jalil1_corner.geo", __file__).execute() - self.pbl = h.Problem(self.msh) - - self.solver = h.Solver(self.pbl) - self.solver.nthreads = 1 - - h.Medium(self.pbl, "Volume", law) - - h.Dirichlet(self.pbl,"Top BC", 400.) - h.Dirichlet(self.pbl,"Right BC", 600.) - - self.solver.restol = 1e-6 - - - -if __name__ == "__main__": - - micro = HoneyComb() - - if fe2.rank==0: - law = fe2.FE2(micro) - macro = Lshape(law) - master = fe2.Master(macro) - master.start() - else: - worker = fe2.Worker(micro) - worker.start() - - - - diff --git a/heat/broken/rve.geo b/heat/broken/rve.geo deleted file mode 100644 index 2d6ba6b4..00000000 --- a/heat/broken/rve.geo +++ /dev/null @@ -1,60 +0,0 @@ -// RVE - -Lx = 1.0; -Ly = Lx; - -lc = Lx/20; - -ix = Lx/2; -iy = Ly/2; -iR = Lx/4; - -// -- outer boundary - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { Lx, 0, 0, lc}; -Point(3) = { Lx, Ly, 0, lc}; -Point(4) = { 0, Ly, 0, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line Loop(1) = {1, 2, 3, 4}; - -// -- inclusion - -Point(11) = { ix-iR, iy, 0, lc}; -Point(12) = { ix, iy, 0, lc}; -Point(13) = { ix+iR, iy, 0, lc}; - -Circle(10) = {11, 12, 13}; -Circle(11) = {13, 12, 11}; - -Line Loop(11) = {11, 10}; - -Plane Surface(11) = {11}; - -// -- matrix - -Plane Surface(1) = {1, 11}; - - -Physical Point("P1") = {1}; -Physical Point("P2") = {2}; -Physical Point("P3") = {3}; -Physical Point("P4") = {4}; - -Physical Line("Bottom") = {1}; -Physical Line("Right") = {2}; -Physical Line("Top") = {3}; -Physical Line("Left") = {4}; - -Physical Surface("Matrix") = {1}; -Physical Surface("Inclusion") = {11}; - - - - - diff --git a/heat/broken/rve.py b/heat/broken/rve.py deleted file mode 100755 index c474fddf..00000000 --- a/heat/broken/rve.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# simple RVE with 2 materials for testing periodic BCs - -import heat as h -import tbox -import tbox.gmsh as gmsh - -def main(): - - msh = gmsh.MeshLoader("rve.geo", __file__).execute() - - pbl = h.Problem(msh) - - solver = h.Solver(pbl) - solver.nthreads = 4 - - h.Medium(pbl, "Matrix", tbox.Fct2C(10.,1.,0), 1.0) - h.Medium(pbl, "Inclusion", tbox.Fct2C(100.,100.,0), 1.0) - - TM = 55.0 - dTxM = 30.0 - dTyM = 1.0 - h.Periodic(pbl, TM, dTxM, dTyM) - - solver.start() - - from heat.viewer import GUI - GUI().open(pbl.msh.name) - -if __name__ == "__main__": - main() diff --git a/heat/fe2.py b/heat/fe2.py deleted file mode 100755 index 268d97a0..00000000 --- a/heat/fe2.py +++ /dev/null @@ -1,305 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# FE² for "heat" - version "MPI task pull" - -import heat as h -import tbox -import math - -verb = False # set to True for (a lot of) debug info - -try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") -except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - -def barrier(): - if comm: - comm.Barrier() - -def enum(*sequential, **named): - enums = dict(list(zip(sequential, list(range(len(sequential))))), **named) - return type('Enum', (), enums) - -tags = enum('READY', 'DONE', 'EXIT', 'START', 'WAKEUP', 'SUICIDE') - - - -class Job: - """ Class containing data transmitted between MPI procs - """ - def __init__(self, id, TM, dTxM, dTyM): - # input - self.id = id - self.TM = TM - self.dTxM = dTxM - self.dTyM = dTyM - # output - self.K11 = 0.0 - self.K22 = 0.0 # useless (=K11) - self.K12 = 0.0 - self.K21 = 0.0 # useless (=-K12) - - def execute(self, fem): - """ - [executed by worker processes] - solve a given job and calculate "k" - """ - TM = self.TM - dTxM = self.dTxM - dTyM = self.dTyM - - fem.p.reset(TM, dTxM, dTyM) - fem.solver.start(fem.gmshWriter) - - # resulting flux qM - qMx = fem.p.qM[0] - qMy = fem.p.qM[1] - - if verb: - print("[%d] qMx = %f" % (rank,qMx)) - print("[%d] qMy = %f" % (rank,qMy)) - - # convert flux to an anisotropic conductivity "k(2,2)" - dTnorm = math.sqrt(dTxM*dTxM+dTyM*dTyM) - qnorm = math.sqrt(qMx*qMx+qMy*qMy) - ampl = qnorm / dTnorm - - if 1: - cos=-(dTxM*qMx+dTyM*qMy)/dTnorm/qnorm - sin=-(dTxM*qMy-dTyM*qMx)/dTnorm/qnorm - else: - ps=-(dTxM*qMx+dTyM*qMy)/dTnorm/qnorm - if ps>1.0: ps=1.0 - if ps<-1.0: ps=-1.0 - - #print ps - ang = math.acos(ps) - #print "ang=", ang, "ampl=", ampl - #print "qMx=", qMx, "ampl*dT=", dTxM*ampl, "res=", qMx-dTxM*ampl - cos = math.cos(ang) - sin = math.sin(ang) - - self.K11 = cos*ampl - self.K21 = sin*ampl - self.K22 = self.K11 # => K22 inutile! - self.K12 = -self.K21 # => K12 inutile! - - -class FE2(tbox.Fct2UdU): - def __init__(self, femicro): - """ - creation du micro modele - """ - tbox.Fct2UdU.__init__(self) - - self.fem = femicro # micro model (utile uniqt si 1 thread) - self.jbz = {} # list of jobs - - if verb: print("[%d] creation of the micro model" % rank) - - def eval(self, elem, npg, u, gradu, k, fake): # tjs exécuté par rank#0 - """ - [executed by the master process] - compute "k" from "u" and "gradu" - at element #elem and gauss point #npg - if "fake=True" => create a job to be run later in parallel - """ - if fake: # on cree un job - TM = u - dTxM = gradu[0] - dTyM = gradu[1] - dTnorm = math.sqrt(dTxM*dTxM+dTyM*dTyM) - if dTnorm==0.0: - dTxM = 1.0 - dTyM = 1.0 - dTnorm=math.sqrt(dTxM*dTxM+dTyM*dTyM) - - if verb: - print("[m] TM =",TM) - print("[m] dTxM =",dTxM) - print("[m] dTyM =",dTyM) - - job = self.jbz.get((elem.no,npg)) - if job: # job existe deja, on le modifie - job.TM = TM - job.dTxM = dTxM - job.dTyM = dTyM - else: # on ajoute ce job - self.jbz[(elem.no,npg)] = Job((elem.no,npg), TM, dTxM, dTyM) - #print "[m] creating job", (elem.no,npg) - - else: # on retourne le resultat du job - - job = self.jbz.get((elem.no,npg)) - if not job: - print("[m] job", (elem.no,npg), "not found!") - k.resize(2, 2) - k[0,0] = job.K11 - k[1,1] = job.K22 - k[1,0] = job.K21 - k[0,1] = job.K12 - - def evalall(self): # tjs exécuté par rank#0 - - import sys - sys.stdout.flush() - - if verb: print("[0] looping on %d jobs" % len(self.jbz)) - - # version 1 proc (master works alone) - if siz==1: - #for job in self.jbz.itervalues(): - for id,job in self.jbz.items(): - job.execute(self.fem) - return - - # version N procs - it=self.jbz.__iter__() - njobs=len(self.jbz) - slaves=list(range(1,siz)) - - for s in slaves: - if verb: print("[0] sending wake-up signal to worker", s) - comm.send(None, dest=s, tag=tags.WAKEUP) - - num_workers = siz-1 - closed_workers = 0 - while closed_workers<num_workers: - # get a msg from any source - data = comm.recv(source=mpi.ANY_SOURCE, - tag=mpi.ANY_TAG, status=status) - source = status.Get_source() - tag = status.Get_tag() - if tag == tags.READY: - if verb: print("[0] worker %d is ready" % source) - # worker is ready - send a new task - job = None - try: - jobk = next(it) # get next job - job = self.jbz[jobk] - except: - pass - if job: - if verb: print("[0] sending job to %d" % source) - comm.send(job, dest=source, tag=tags.START) - else: - if verb: print("[0] job list is empty! sending EXIT to %d" % source) - comm.send(None, dest=source, tag=tags.EXIT) - # other workers are still calculating... - # master should wait for them - elif tag==tags.DONE: - if verb: print("[0] worker %d gives me its results" % source) - # worker has done its job - get the results - job = self.jbz[data.id] - job.K11=data.K11 - job.K22=data.K22 - job.K12=data.K12 - job.K21=data.K21 - elif tag==tags.EXIT: - closed_workers+=1 - if verb: print("[0] worker %d exited (%d worker(s) still running)" % (source, num_workers-closed_workers)) - - if verb: print("[0] done.") - -class Master: - """ - MPI Process with rank #0 - """ - def __init__(self, macro): - self.macro = macro - - def start(self): - """ - master loop - """ - global rank - if rank!=0: - raise Exception("this routine should be called with MPI rank=0") - if verb: print("[%d] starting master" % rank) - self.macro.solver.start(self.macro.gmshWriter) - - self.killslaves() - - # show results if requested - from fwk.wutils import parseargs - args = parseargs() - if not args.nogui: - print("\n<CLOSE gmsh to quit!>") - from heat.viewer import GUI - GUI().open(self.macro.msh.name) - - def killslaves(self): - slaves=list(range(1,siz)) - for s in slaves: - if verb: print("[%d] sending suicide job to %d" % (rank,s)) - comm.send(None, dest=s, tag=tags.SUICIDE) - - -class Worker: - """ - MPI Process with rank #1-#n - """ - def __init__(self, micro): - self.micro = micro - - def start(self): - """ - worker loop - """ - global rank - if rank==0: - raise Exception("this routine should be called with MPI rank!=0") - - if verb: print("[%d] starting worker" % rank) - while True: - comm.recv(source=0, tag=mpi.ANY_TAG, status=status) - tag = status.Get_tag() - if tag==tags.WAKEUP: - if verb: print("[%d] waking up" % rank) - while True: - comm.send(None, dest=0, tag=tags.READY) - job = comm.recv(source=0, tag=mpi.ANY_TAG, status=status) - tag = status.Get_tag() - if tag==tags.START: - if verb: print("[%d] starting job" % rank) - job.execute(self.micro) - if verb: print("[%d] sending job results" % rank) - comm.send(job, dest=0, tag=tags.DONE) - elif tag==tags.EXIT: - if verb: print("[%d] sending exit confirmation" % rank) - comm.send(None, dest=0, tag=tags.EXIT) - break - elif tag==tags.SUICIDE: - if verb: print("[%d] I'm dying..." % rank) - if rank==2: - print(self.micro.solver.tms) - break - - diff --git a/heat/matlab/rotK.m b/heat/matlab/rotK.m deleted file mode 100644 index 0f952d70..00000000 --- a/heat/matlab/rotK.m +++ /dev/null @@ -1,26 +0,0 @@ - -self_theta = 20; -self_kx=1; -self_ky=100; -u=0; - -t = (self_theta) * pi/180.0 -u1 = 0. ; t1=-t; -u2 = 10. ; t2 = t; - -t = t1+(t2-t1)/(u2-u1)*(u-u1); - -kx = self_kx; -ky = self_ky; - -co = cos(t); -si = sin(t); - -R = [[co, -si], - [si, co]]; -Kt = [[kx, 0.0], - [0.0, ky]]; -Tmp = R*Kt; -Kxy = Tmp*R'; - -Kxy diff --git a/heat/models/__init__.py b/heat/models/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/heat/models/honeycomb.geo b/heat/models/honeycomb.geo deleted file mode 100644 index ba4ec75f..00000000 --- a/heat/models/honeycomb.geo +++ /dev/null @@ -1,93 +0,0 @@ -// honeycomb structure - -DefineConstant[ l = { 10.0, Min 1, Max 20, Step 1, Name "Lengths/hex edge length" } ]; -DefineConstant[ k = { 1.0, Min 1, Max 2, Step 1, Name "Lengths/bound. thickness" } ]; -DefineConstant[ lc = { 1./3, Min 1e-5, Max 1, Step 1e-5, Name "Mesh/density" } ]; - - -alp=30*Pi/180; - -Point(1) = {0, 0, 0, lc}; -Point(2) = {l*Cos(alp), l*Sin(alp), 0, lc}; -Point(3) = {l*Cos(alp), l*Sin(alp)+l, 0, lc}; -Point(4) = {0, 2*l*Sin(alp)+l, 0, lc}; -Point(5) = {-l*Cos(alp), l*Sin(alp), 0, lc}; -Point(6) = {-l*Cos(alp), l*Sin(alp)+l, 0, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 6}; -Line(5) = {6, 5}; -Line(6) = {5, 1}; - -Point(7) = {-k*Sin(alp), -k*Cos(alp), 0, lc}; -Point(8) = {+k*Sin(alp), -k*Cos(alp), 0, lc}; -Point(9) = {-k*Sin(alp)-l*Cos(alp), -k*Cos(alp)+l*Sin(alp), 0, lc}; -Point(10) = {+k*Sin(alp)+l*Cos(alp), -k*Cos(alp)+l*Sin(alp), 0, lc}; -Point(11) = {-k*Sin(alp), -k*Cos(alp)-l/2, 0, lc}; -Point(12) = {+k*Sin(alp), -k*Cos(alp)-l/2, 0, lc}; -Point(13) = {-k*Sin(alp)-l*Cos(alp), -k*Cos(alp)-l/2, 0, lc}; -Point(14) = {+k*Sin(alp)+l*Cos(alp), -k*Cos(alp)-l/2, 0, lc}; - - -Point(15) = {-k*Sin(alp), 2*l*Sin(alp)+l+k*Cos(alp), 0, lc}; -Point(16) = {+k*Sin(alp), 2*l*Sin(alp)+l+k*Cos(alp), 0, lc}; -Point(17) = {-k*Sin(alp)-l*Cos(alp), 2*l*Sin(alp)+l+k*Cos(alp)-l*Sin(alp), 0, lc}; -Point(18) = {+k*Sin(alp)+l*Cos(alp), 2*l*Sin(alp)+l+k*Cos(alp)-l*Sin(alp), 0, lc}; -Point(19) = {-k*Sin(alp), 2*l*Sin(alp)+l+k*Cos(alp)+l/2, 0, lc}; -Point(20) = {+k*Sin(alp), 2*l*Sin(alp)+l+k*Cos(alp)+l/2, 0, lc}; -Point(21) = {-k*Sin(alp)-l*Cos(alp), 2*l*Sin(alp)+l+k*Cos(alp)+l/2, 0, lc}; -Point(22) = {+k*Sin(alp)+l*Cos(alp), 2*l*Sin(alp)+l+k*Cos(alp)+l/2, 0, lc}; - - -Line(7) = {13, 11}; -Line(8) = {11, 12}; -Line(9) = {12, 14}; -Line(10) = {14, 10}; -Line(11) = {10, 18}; -Line(12) = {18, 22}; -Line(13) = {22, 20}; -Line(14) = {20, 19}; -Line(15) = {19, 21}; -Line(16) = {21, 17}; -Line(17) = {17, 9}; -Line(18) = {9, 13}; -Line(19) = {11, 7}; -Line(20) = {7, 9}; -Line(21) = {8, 12}; -Line(22) = {8, 10}; -Line(23) = {18, 16}; -Line(24) = {16, 20}; -Line(25) = {19, 15}; -Line(26) = {15, 17}; - - -Line Loop(27) = {4, 5, 6, 1, 2, 3}; -Plane Surface(28) = {27}; -Line Loop(29) = {20, 18, 7, 19}; -Plane Surface(30) = {29}; -Line Loop(31) = {-22, +10, +9, +21}; -Plane Surface(32) = {31}; -Line Loop(33) = {-23, -24, +13, +12}; -Plane Surface(34) = {33}; -Line Loop(35) = {-26, +16, +15, -25}; -Plane Surface(36) = {35}; - -Line Loop(37) = {-26, -17, +20, +19, -8, +21, -22, -11, -23, -24, -14, -25}; -Plane Surface(38) = {27, 37}; - -Physical Line("Left") = {16, 17, 18}; -Physical Line("Right") = {10, 11, 12}; -Physical Line("Bottom") = {7, 8, 9}; -Physical Line("Top") = {15, 14, 13}; - -Physical Surface("Hexagon") = {28, 32, 30, 36, 34}; -Physical Surface("Borders") = {38}; - - - -Physical Point("P1") = {13}; - - - diff --git a/heat/models/rect.geo b/heat/models/rect.geo deleted file mode 100644 index 03c11edf..00000000 --- a/heat/models/rect.geo +++ /dev/null @@ -1,33 +0,0 @@ -// rectangle (unstructured triangles) - -DefineConstant[ Lx = { 10, Min 1, Max 20, Step 1, Name "Lengths/Lx" } ]; -DefineConstant[ Ly = { 10, Min 1, Max 20, Step 1, Name "Lengths/Ly" } ]; - -DefineConstant[ lc = { 1.2, Min 0.1, Max 20, Step 1, Name "Mesh/lc" } ]; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { Lx, 0, 0, lc}; -Point(3) = { Lx, Ly, 0, lc}; -Point(4) = { 0, Ly, 0, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line Loop(1) = {1, 2, 3, 4}; - -Plane Surface(1) = {1}; - -Physical Point("P1") = {1}; -Physical Point("P2") = {2}; -Physical Point("P3") = {3}; -Physical Point("P4") = {4}; - -Physical Line("Bottom") = {1}; -Physical Line("Right") = {2}; -Physical Line("Top") = {3}; -Physical Line("Left") = {4}; - -Physical Surface("S1") = {1}; - diff --git a/heat/models/rect.py b/heat/models/rect.py deleted file mode 100755 index a7233327..00000000 --- a/heat/models/rect.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# simple test on a square using 'heat' - -import heat as h -import heat.utils -import tbox -import tbox.gmsh as gmsh - -def main(**d): - - # default params - p={} - p['Lx'] = 10. - p['Ly'] = 10. - p['Nx'] = 10 # structured mesh params - p['Ny'] = 10 - p['lc'] = 0.5 # unstructured mesh params - p['stru'] = False - p['src'] = False - p['bc'] = 'dirichletx' - p.update(d) - - # configure/build mesh - if p['stru']: - pars={ 'Lx' : p['Lx'] , 'Ly' : p['Ly'], 'Nx' : p['Nx'], 'Ny' : p['Ny']} - msh = gmsh.MeshLoader("rect_stru.geo",__file__).execute(**pars) - else: - pars={ 'Lx' : p['Lx'] , 'Ly' : p['Ly'], 'lc' : p['lc']} - msh = gmsh.MeshLoader("rect.geo",__file__).execute(**pars) - # define mesh writer - gmshWriter = tbox.GmshExport(msh) - - pbl = h.Problem(msh) - - # medium/boundary conditions - pbl.add(h.Medium(msh, "S1", tbox.Fct2C(1e-5,1e-5, 0))) - - if p['bc']=='dirichletx': - pbl.add(h.Dirichlet(msh,"Left", 3.)) - pbl.add(h.Dirichlet(msh,"Right", 5.)) - elif p['bc']=='dirichlety': - pbl.add(h.Dirichlet(msh,"Bottom", 3.)) - pbl.add(h.Dirichlet(msh,"Top", 5.)) - - if p['src']: - pbl.add(h.Source(msh, "S1", tbox.Fct0C(1e-6))) - - # solve problem - solver = heat.utils.solve(pbl, gmshWriter) - return solver - - -if __name__ == "__main__": - main() diff --git a/heat/models/rect_stru.geo b/heat/models/rect_stru.geo deleted file mode 100644 index ba5dd5b3..00000000 --- a/heat/models/rect_stru.geo +++ /dev/null @@ -1,44 +0,0 @@ -// rectangle (unstructured triangles) - -DefineConstant[ Lx = { 10, Min 1, Max 20, Step 1, Name "Lengths/Lx" } ]; -DefineConstant[ Ly = { 10, Min 1, Max 20, Step 1, Name "Lengths/Ly" } ]; - -DefineConstant[ Nx = { 10, Min 1, Max 20, Step 1, Name "Mesh/Nx" } ]; -DefineConstant[ Ny = { 10, Min 1, Max 20, Step 1, Name "Mesh/Ny" } ]; - -lc=Lx/Nx; -Point(1) = { 0, 0, 0, lc}; -Point(2) = { Lx, 0, 0, lc}; -Point(3) = { Lx, Ly, 0, lc}; -Point(4) = { 0, Ly, 0, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line Loop(1) = {1, 2, 3, 4}; - -Plane Surface(1) = {1}; - - -// regular mesh -Transfinite Line {1, 3} = Nx+1 Using Progression 1; -Transfinite Line {4, 2} = Ny+1 Using Progression 1; -Transfinite Surface {1}; -//Recombine Surface {1}; // for quads - - -Physical Point("P1") = {1}; -Physical Point("P2") = {2}; -Physical Point("P3") = {3}; -Physical Point("P4") = {4}; - - -Physical Line("Bottom") = {1}; -Physical Line("Right") = {2}; -Physical Line("Top") = {3}; -Physical Line("Left") = {4}; - -Physical Surface("S1") = {1}; - diff --git a/heat/src/CMakeLists.txt b/heat/src/CMakeLists.txt deleted file mode 100644 index 84c672b3..00000000 --- a/heat/src/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# CMake input file of heat.so - -FILE(GLOB SRCS *.h *.cpp *.inl *.hpp) - -ADD_LIBRARY(heat SHARED ${SRCS}) -MACRO_DebugPostfix(heat) -TARGET_INCLUDE_DIRECTORIES(heat PUBLIC ${PROJECT_SOURCE_DIR}/heat/src) - -TARGET_LINK_LIBRARIES(heat tbox) - -INSTALL(TARGETS heat DESTINATION ${CMAKE_INSTALL_PREFIX}) - -SOURCE_GROUP(base REGULAR_EXPRESSION ".*\\.(cpp|inl|hpp|h)") diff --git a/heat/src/heat.h b/heat/src/heat.h deleted file mode 100644 index ef7f4617..00000000 --- a/heat/src/heat.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// global header of the "heat" module - -#ifndef HEAT_H -#define HEAT_H - -#if defined(WIN32) -#ifdef heat_EXPORTS -#define HEAT_API __declspec(dllexport) -#else -#define HEAT_API __declspec(dllimport) -#endif -#else -#define HEAT_API -#endif - -#include "tbox.h" - -/** - * @brief this namespace avoids conflicts with similar names in 'waves' - */ - -namespace heat -{ -class Problem; -class Medium; -class Dirichlet; -class Solver; -class Periodic; -class Boundary; -class Source; -class Extractor; - -class NodePair; - -class HeatTerm; - -// not used yet -class DisplayHook; -}; // namespace heat - -#endif //HEAT_H diff --git a/heat/src/wBoundary.cpp b/heat/src/wBoundary.cpp deleted file mode 100644 index 2ec22218..00000000 --- a/heat/src/wBoundary.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wBoundary.h" -#include "wProblem.h" -#include "wTag.h" -using namespace heat; - -Boundary::Boundary(std::shared_ptr<MshData> _msh, int no, std::shared_ptr<Fct0> _f) : Group(_msh, no), f(_f) -{ - //pbl.bnds.push_back(this); -} - -Boundary::Boundary(std::shared_ptr<MshData> _msh, std::string const &name, std::shared_ptr<Fct0> _f) : Group(_msh, name), f(_f) -{ - //pbl.bnds.push_back(this); -} - -void Boundary::write(std::ostream &out) const -{ - out << "Boundary on " << *tag; -} diff --git a/heat/src/wBoundary.h b/heat/src/wBoundary.h deleted file mode 100644 index 3c0b8679..00000000 --- a/heat/src/wBoundary.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WBOUNDARY_H -#define WBOUNDARY_H - -#include "heat.h" -#include "wGroup.h" -#include "wFct0.h" - -using namespace tbox; - -namespace heat -{ - -/** - * @brief boundaries which requires a special treatment (such as prescribed fluxes) - */ - -class HEAT_API Boundary : public Group -{ -public: -#ifndef SWIG - std::shared_ptr<Fct0> f; -#endif - Boundary(std::shared_ptr<MshData> _msh, int no, std::shared_ptr<Fct0> _f); - Boundary(std::shared_ptr<MshData> _msh, std::string const &name, std::shared_ptr<Fct0> _f); - virtual ~Boundary() { std::cout << "~Boundary()\n"; } - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -} // namespace heat - -#endif //WBOUNDARY_H diff --git a/heat/src/wCompiledFct.cpp b/heat/src/wCompiledFct.cpp deleted file mode 100644 index 91310881..00000000 --- a/heat/src/wCompiledFct.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wCompiledFct.h" -using namespace heat; diff --git a/heat/src/wCompiledFct.h b/heat/src/wCompiledFct.h deleted file mode 100644 index f8d13926..00000000 --- a/heat/src/wCompiledFct.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WCOMPILEDFCT_H -#define WCOMPILEDFCT_H - -#include "heat.h" -#include "wFct0.h" -#include "wFct1.h" -#include "wFct2.h" - -using namespace tbox; - -namespace heat -{ - -/** - * @brief cfr heat_vark.py (version scalaire) - */ - -class HEAT_API CompiledFct1a : public Fct0XYZ -{ - double k1, k2; - -public: - CompiledFct1a(double _k1, double _k2) : k1(_k1), k2(_k2) {} - - virtual double eval(Eigen::Vector3d const &pos) const override - { - double x = pos(0); - double y = pos(1); - double L = 1; - return (k1 + k2) / 2 + fabs(k2 - k1) / 2 * sin(2 * M_PI / L * 4 * (x + y / 2)); - } -}; - -/** - * @brief cfr heat_vark.py (version matricielle) - */ - -class HEAT_API CompiledFct1b : public Fct2XYZ -{ - double k1, k2; - -public: - CompiledFct1b(double _k1, double _k2) : k1(_k1), k2(_k2) {} - - virtual void eval(Eigen::Vector3d const &pos, Eigen::MatrixXd &out, bool fake) const override - { - double x = pos(0); - double y = pos(1); - double L = 1; - out.resize(2, 2); - out(1, 1) = out(0, 0) = (k1 + k2) / 2 + fabs(k2 - k1) / 2 * sin(2 * M_PI / L * 4 * (x + y / 2)); - out(0, 1) = out(1, 0) = 0.0; - } -}; - -/** - * @brief cfr heat_nl.py (version scalaire) - */ -class HEAT_API CompiledFct2a : public Fct0U -{ -public: - CompiledFct2a() {} - - virtual double eval(double u) const override - { - return 10 + u * u; - } -}; - -/** - * @brief cfr heat_nl.py (version matricielle) - */ -class HEAT_API CompiledFct2b : public Fct2U -{ -public: - CompiledFct2b() {} - - virtual void eval(double u, Eigen::MatrixXd &out, bool fake) const override - { - out.resize(2, 2); - out(0, 0) = out(1, 1) = 10 + u * u; - out(0, 1) = out(1, 0) = u * u; - } -}; - -}; // namespace heat - -#endif //WCOMPILEDFCT_H diff --git a/heat/src/wDirichlet.cpp b/heat/src/wDirichlet.cpp deleted file mode 100644 index 932ee6f1..00000000 --- a/heat/src/wDirichlet.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wDirichlet.h" -#include "wProblem.h" -#include "wTag.h" -#include "wElement.h" -#include "wNode.h" -#include <algorithm> -using namespace heat; - -Dirichlet::Dirichlet(std::shared_ptr<MshData> _msh, int no, double _val) : Group(_msh, no), val(_val) -{ - for (auto e : tag->elems) - for (auto n : e->nodes) - nodes.push_back(n); - std::sort(nodes.begin(), nodes.end()); - auto it = std::unique(nodes.begin(), nodes.end()); - nodes.resize(std::distance(nodes.begin(), it)); - - //pbl.dBCs.push_back(this); -} - -Dirichlet::Dirichlet(std::shared_ptr<MshData> _msh, std::string const &name, double _val) : Group(_msh, name), val(_val) -{ - for (auto e : tag->elems) - for (auto n : e->nodes) - nodes.push_back(n); - std::sort(nodes.begin(), nodes.end()); - auto it = std::unique(nodes.begin(), nodes.end()); - nodes.resize(std::distance(nodes.begin(), it)); - - //pbl.dBCs.push_back(this); -} - -/** - * @brief default implementation (prescribes "val" to all nodes) - */ - -void Dirichlet::apply(std::vector<double> &rhs) -{ - for (auto n : nodes) - rhs[n->row] = val; -} - -void Dirichlet::write(std::ostream &out) const -{ - out << "heat::Dirichlet on " << *tag << " (val=" << val << ")\n"; - for (auto n : nodes) - { - out << '\t' << *n << '\n'; - } -} diff --git a/heat/src/wDirichlet.h b/heat/src/wDirichlet.h deleted file mode 100644 index 6ebf97ba..00000000 --- a/heat/src/wDirichlet.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WDIRICHLET_H -#define WDIRICHLET_H - -#include "heat.h" -#include "wGroup.h" -#include <vector> -#include <string> - -using namespace tbox; - -namespace heat -{ - -/** - * @brief manage Dirichlet BC - * - * @todo gerer Dirichlet comme Boundary (avec une Fct en argument au lieu d'un scalaire) - */ - -class HEAT_API Dirichlet : public Group -{ -public: - std::vector<Node *> nodes; - double val; ///< value for a constant BC - - Dirichlet(std::shared_ptr<MshData> _msh, int no, double _val = 0.0); - Dirichlet(std::shared_ptr<MshData> _msh, std::string const &name, double _val = 0.0); - virtual ~Dirichlet() { std::cout << "~Dirichlet()\n"; } - - virtual void apply(std::vector<double> &rhs); - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -} // namespace heat - -#endif //WDIRICHLET_H diff --git a/heat/src/wDisplayHook.cpp b/heat/src/wDisplayHook.cpp deleted file mode 100644 index 33264943..00000000 --- a/heat/src/wDisplayHook.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wDisplayHook.h" -using namespace heat; - -DisplayHook::DisplayHook() -{ -} - -void DisplayHook::display(int nt, double t, std::vector<double> &u) -{ - std::cout << "DisplayHook::display()\n"; -} - -void DisplayHook::refresh() -{ - std::cout << "DisplayHook::refresh()\n"; -} diff --git a/heat/src/wDisplayHook.h b/heat/src/wDisplayHook.h deleted file mode 100644 index 58dcbaf4..00000000 --- a/heat/src/wDisplayHook.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WDISPLAYHOOK_H -#define WDISPLAYHOOK_H - -#include "heat.h" -#include "wObject.h" -#include <vector> - -namespace heat -{ - -/** - * @brief quad element - */ - -class HEAT_API DisplayHook : public fwk::wObject -{ -public: - DisplayHook(); - virtual void display(int nt, double t, std::vector<double> &u); - virtual void refresh(); -}; - -} // namespace heat - -#endif //WDISPLAYHOOK_H diff --git a/heat/src/wExtractor.cpp b/heat/src/wExtractor.cpp deleted file mode 100644 index f62392d7..00000000 --- a/heat/src/wExtractor.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wExtractor.h" -#include "wGroup.h" -#include "wSolver.h" -#include "wTag.h" -#include "wNode.h" - -using namespace heat; - -void Extractor::write(std::ostream &out) const -{ - out << "Extractor on " << grp; -} - -Extractor::Extractor(Solver &_solver, Group &_grp) : solver(_solver), grp(_grp) -{ - // create a node list - for (auto e : grp.tag->elems) /// cfr Dirichlet - for (auto n : e->nodes) - nodes.push_back(n); - std::sort(nodes.begin(), nodes.end()); - auto it = std::unique(nodes.begin(), nodes.end()); - nodes.resize(std::distance(nodes.begin(), it)); -} - -std::vector<double> -Extractor::execute() -{ - std::vector<double> &vec = solver.T1; // vector of temperatures - - std::vector<double> ret; - for (auto n : nodes) - ret.push_back(vec[n->row]); - - return ret; -} diff --git a/heat/src/wExtractor.h b/heat/src/wExtractor.h deleted file mode 100644 index fb79c377..00000000 --- a/heat/src/wExtractor.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WEXTRACTOR_H -#define WEXTRACTOR_H - -#include "heat.h" -#include "wExtract.h" - -using namespace tbox; - -namespace heat -{ - -/** - * @brief an object able to extract scalar results from the model - */ - -class HEAT_API Extractor : public fwk::Extract -{ - Solver &solver; - Group &grp; - -public: - Extractor(Solver &_solver, Group &_grp); - virtual ~Extractor() { std::cout << "~Extractor()\n"; } - virtual std::vector<double> execute() override; - std::vector<Node *> nodes; ///< faire une classe intermediaire group/dirichlet (nodegroup) - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -} // namespace heat - -#endif //WEXTRACTOR_H diff --git a/heat/src/wHeatTerm.cpp b/heat/src/wHeatTerm.cpp deleted file mode 100644 index 8cecc32c..00000000 --- a/heat/src/wHeatTerm.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wHeatTerm.h" - -#include "wElement.h" -#include "wCache.h" -#include "wGauss.h" -#include "wFct0.h" -#include "wFct2.h" - -using namespace heat; -using namespace tbox; - -/** - * @brief Build volume terms for the heat equation on one element - */ -Eigen::MatrixXd HeatTerm::build(Element const &e, std::vector<double> const &u, Fct2 const &f, bool fake) -{ - // Get precomputed values - Cache &cache = e.getVCache(); - Gauss &gauss = cache.getVGauss(); - - Eigen::MatrixXd K = Eigen::MatrixXd::Zero(e.nodes.size(), e.nodes.size()); - if (fake) // fake run - fill MPI job list - { - for (size_t k = 0; k < gauss.getN(); ++k) - { - Eigen::MatrixXd fk; - f.eval(e, u, k, fk, fake); - } - } - else // true run - use MPI cached results - { - // Gauss integration - for (size_t k = 0; k < gauss.getN(); ++k) - { - // Jacobian inverse, shape functions and function evaluation - Eigen::MatrixXd const &J = e.getJinv(k); - Eigen::MatrixXd const &dff = cache.getDsf(k); - Eigen::MatrixXd fk; - f.eval(e, u, k, fk, fake); - - // Elementary stiffness matrix - K += (fk * J * dff).transpose() * J * dff * gauss.getW(k) * e.getDetJ(k); - } - } - return K; -} - -/** - * @brief Build surface/volume flux on one element - */ -Eigen::VectorXd HeatTerm::build(Element const &e, std::vector<double> const &u, Fct0 const &f) -{ - // Get precomputed values - Cache &cache = e.getVCache(); - Gauss &gauss = cache.getVGauss(); - - // Gauss integration - Eigen::VectorXd s = Eigen::VectorXd::Zero(e.nodes.size()); - for (size_t k = 0; k < gauss.getN(); ++k) - s += cache.getSf(k) * f.eval(e, u, k) * gauss.getW(k) * e.getDetJ(k); - return s; -} - -/** - * @brief Build volume flux of the heat equation on one element - * @todo not used - */ -Eigen::VectorXd HeatTerm::build2(Element const &e, std::vector<double> const &u, Fct2 const &f) -{ - // Get precomputed values - Cache &cache = e.getVCache(); - Gauss &gauss = cache.getVGauss(); - - // Gauss integration - Eigen::VectorXd qV = Eigen::VectorXd::Zero(e.nodes.size()); - for (size_t k = 0; k < gauss.getN(); ++k) - { - // Shape functions, gradient and flux evaluation - Eigen::MatrixXd const &dff = cache.getDsf(k); - Eigen::MatrixXd fk(2, 2); - f.eval(e, u, k, fk, false); - - // Elementary flux vector - qV += (fk * e.computeGradient(u, k)).transpose() * e.getJinv(k) * dff * gauss.getW(k) * e.getDetJ(k); - } - return qV; -} - -/** - * @brief Compute (integrate) volume flux - */ -Eigen::VectorXd HeatTerm::computeFlux(Element const &e, std::vector<double> const &u, Fct2 const &f) -{ - // Get precomputed values - Cache &cache = e.getVCache(); - Gauss &gauss = cache.getVGauss(); - - // Gauss integration - Eigen::VectorXd qV = Eigen::Vector2d::Zero(); // 2 dimensions - for (size_t k = 0; k < gauss.getN(); ++k) - { - // Gradient and matrix function evaluation - Eigen::VectorXd gradk = e.computeGradient(u, k); - Eigen::MatrixXd fk(2, 2); - f.eval(e, u, k, fk, false); - - qV -= fk * gradk * gauss.getW(k) * e.getDetJ(k); - } - return qV; -} - -/** - * @brief Compute (integrate) matrix - */ -Eigen::MatrixXd HeatTerm::computeMatrix(Element const &e, std::vector<double> const &u, Fct2 const &f) -{ - // Get precomputed values - Cache &cache = e.getVCache(); - Gauss &gauss = cache.getVGauss(); - - // Gauss integration - Eigen::MatrixXd out = Eigen::Matrix2d::Zero(); // 2 dimensions, should match fk size - for (size_t k = 0; k < gauss.getN(); ++k) - { - // Function evaluation - Eigen::MatrixXd fk; - f.eval(e, u, k, fk, false); - - out += fk * gauss.getW(k) * e.getDetJ(k); - } - return out; -} diff --git a/heat/src/wHeatTerm.h b/heat/src/wHeatTerm.h deleted file mode 100644 index 12f9bc51..00000000 --- a/heat/src/wHeatTerm.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WHEATTERM_H -#define WHEATTERM_H - -#include "heat.h" - -#include <vector> -#include <Eigen/Dense> - -namespace heat -{ - -/** - * @brief Formulation of heat terms - */ -class HEAT_API HeatTerm -{ -public: - // Volume - static Eigen::MatrixXd build(tbox::Element const &e, std::vector<double> const &u, tbox::Fct2 const &f, bool fake); - static Eigen::VectorXd build2(tbox::Element const &e, std::vector<double> const &u, tbox::Fct2 const &f); - // Boundary and Source - static Eigen::VectorXd build(tbox::Element const &e, std::vector<double> const &u, tbox::Fct0 const &f); - // Functionals - static Eigen::VectorXd computeFlux(tbox::Element const &e, std::vector<double> const &u, tbox::Fct2 const &f); - static Eigen::MatrixXd computeMatrix(tbox::Element const &e, std::vector<double> const &u, tbox::Fct2 const &f); -}; - -} // namespace heat -#endif //WHEATTERM_H diff --git a/heat/src/wMedium.cpp b/heat/src/wMedium.cpp deleted file mode 100644 index ad307a6d..00000000 --- a/heat/src/wMedium.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wMedium.h" -#include "wProblem.h" -#include "wTag.h" -#include "wFct2.h" -using namespace heat; - -Medium::Medium(std::shared_ptr<MshData> _msh, int no, - std::shared_ptr<Fct2> _k, double _rhoc) : Group(_msh, no), - k(_k), rhoc(_rhoc) -{ - //pbl.media.push_back(this); -} - -Medium::Medium(std::shared_ptr<MshData> _msh, std::string const &name, - std::shared_ptr<Fct2> _k, double _rhoc) : Group(_msh, name), - k(_k), rhoc(_rhoc) -{ - std::cout << "tag=" << *tag << std::endl; - //pbl.media.push_back(this); -} - -void Medium::write(std::ostream &out) const -{ - out << "Medium on " << *tag << " with k=" << this->k << " rhoc=" << this->rhoc; -} diff --git a/heat/src/wMedium.h b/heat/src/wMedium.h deleted file mode 100644 index 5ba9b425..00000000 --- a/heat/src/wMedium.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WMEDIUM_H -#define WMEDIUM_H - -#include "heat.h" -#include "wGroup.h" -#include "wFct0.h" - -using namespace tbox; - -namespace heat -{ - -/** - * @brief a thermal medium (with k, rhoc) - */ - -class HEAT_API Medium : public Group -{ -public: -#ifndef SWIG - std::shared_ptr<Fct2> k; - double rhoc; -#endif - Medium(std::shared_ptr<MshData> _msh, int no, std::shared_ptr<Fct2> _k, double _rhoc = 1.0); - Medium(std::shared_ptr<MshData> _msh, std::string const &name, std::shared_ptr<Fct2> _k, double _rhoc = 1.0); - virtual ~Medium() { std::cout << "~Medium()\n"; } - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -} // namespace heat - -#endif //WMEDIUM_H diff --git a/heat/src/wPeriodic.cpp b/heat/src/wPeriodic.cpp deleted file mode 100644 index 56930814..00000000 --- a/heat/src/wPeriodic.cpp +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wPeriodic.h" -#include "wProblem.h" -#include "wMedium.h" -#include "wTag.h" -#include "wElement.h" -#include "wNode.h" -#include <list> -#include <algorithm> -using namespace heat; - -HEAT_API std::ostream & -operator<<(std::ostream &out, NodePair const &obj) -{ - out << "node #" << obj.n->no << " <=> node #" << obj.d->no; - return out; -} - -NodePair::NodePair(Node *_n, Node *_d, double tol) : n(_n), d(_d) -{ - Eigen::Vector3d l = d->pos - n->pos; - if (fabs(l(0)) > tol && fabs(l(1)) > tol) - { - std::stringstream s; - s << " node #" << n->no << " and node #" << d->no << " are not facing each other!\n"; - throw std::runtime_error(s.str()); - } -} - -Periodic::Periodic(std::shared_ptr<heat::Problem> _pbl, - double _TM, double _dTxM, double _dTyM) : wSharedObject(), pbl(_pbl) -{ - //pbl->pdic = this; - reset(_TM, _dTxM, _dTyM); - verbose = false; -} - -void Periodic::reset(double _TM, double _dTxM, double _dTyM) -{ - TM = _TM; - dTxM = _dTxM; - dTyM = _dTyM; - qM = Eigen::Vector3d::Zero(); -} - -void Periodic::write(std::ostream &out) const -{ - out << "heat::Periodic\n"; - out << "\tT_M = " << TM << '\n'; - out << "\tgradT_M = (" << dTxM << ", " << dTyM << ")\n"; -} - -void Periodic::init() -{ - if (!LR.empty()) - return; - - //std::cout << "Periodic::init()\n"; - - // build a list of nodes related to all the media - if (verbose) - { - std::cout << "extracting nodes from " << pbl->media.size() - << " medi" << ((pbl->media.size() == 1) ? "um" : "a") << "...\n"; - } - std::list<Node *> nlist; - for (auto mat : pbl->media) - for (auto e : mat->tag->elems) - for (auto n : e->nodes) - nlist.push_back(n); - nlist.sort(); - nlist.unique(); - if (verbose) - std::cout << "number of nodes:" << nlist.size() << '\n'; - if (nlist.empty()) - throw std::runtime_error("Periodic::init() - no mesh!"); - - // compute bbox (p1,p3) - - Eigen::Vector3d p1 = (*nlist.begin())->pos; - Eigen::Vector3d p3 = p1; - for (auto n : nlist) - { - Eigen::Vector3d p = n->pos; - if (p(0) < p1(0)) - p1(0) = p(0); - if (p(0) > p3(0)) - p3(0) = p(0); - if (p(1) < p1(1)) - p1(1) = p(1); - if (p(1) > p3(1)) - p3(1) = p(1); - } - if (verbose) - { - std::cout << "bounding box:\n"; - std::cout << "\tp1=" << p1 << '\n'; - std::cout << "\tp3=" << p3 << '\n'; - } - - // compute smallest distance between 2 nodes (mesh characteristic length) - double lc = std::numeric_limits<double>::max(); - for (auto mat : pbl->media) - for (auto e : mat->tag->elems) - for (auto n1 : e->nodes) - for (auto n2 : e->nodes) - if (n1 != n2) - { - double l = (n1->pos - n2->pos).norm(); - if (l < lc) - lc = l; - } - if (verbose) - std::cout << "characteristic length = " << lc << '\n'; - - // build ordered lists of nodes on boundaries - auto nL = nodesOnEdge(nlist, lc, p1, 0, "L"); - auto nR = nodesOnEdge(nlist, lc, p3, 0, "R"); - auto nB = nodesOnEdge(nlist, lc, p1, 1, "B"); - auto nT = nodesOnEdge(nlist, lc, p3, 1, "T"); - - // corners detection - double eps = lc / 10.; - - corners.resize(4); - - { - if (verbose) - std::cout << "detecting corners...\n"; - auto itP1 = nL.begin(); - auto itP2 = nR.begin(); - auto itP4 = --nL.end(); - auto itP3 = --nR.end(); - - corners[0] = *itP1; - corners[1] = *itP2; - corners[2] = *itP3; - corners[3] = *itP4; - - NodePair(*itP1, *itP2, eps); // error check - NodePair(*itP2, *itP3, eps); // error check - NodePair(*itP3, *itP4, eps); // error check - NodePair(*itP4, *itP1, eps); // error check - - if (verbose) - for (auto n : corners) - std::cout << '\t' << *n << '\n'; - - // build LR node pairs - if (verbose) - std::cout << "detecting node pairs : left-right (LR)...\n"; - for (auto itL = ++itP1, itR = ++itP2; itL != itP4 && itR != itP3; ++itL, ++itR) - LR.push_back(NodePair(*itL, *itR, eps)); - /* - for(auto np : LR) - std::cout << '\t' << np << '\n'; - */ - } - - // build TB node pairs - { - auto itP1 = nB.begin(); - auto itP2 = --nB.end(); - auto itP4 = nT.begin(); - auto itP3 = --nT.end(); - - if (verbose) - std::cout << "detecting node pairs : bottom-top (BT)...\n"; - for (auto itB = ++itP1, itT = ++itP4; itB != itP2 && itT != itP3; ++itB, ++itT) - BT.push_back(NodePair(*itB, *itT, eps)); - /* - for(auto np : BT) - std::cout << '\t' << np << '\n'; - */ - } -} - -std::vector<Node *> -Periodic::nodesOnEdge(std::list<Node *> const &nlist, - double lc, Eigen::Vector3d const &pt, - int c, std::string const &name) const -{ - struct LessThan - { - int comp; - LessThan(int c) : comp(c) {} - inline bool operator()(Node *const &o1, Node *const &o2) const - { - return (o1->pos(comp) < o2->pos(comp)); - } - }; - - std::vector<Node *> lnods; - double eps = lc / 10.; - double xF = pt(c); - for (auto n : nlist) - { - double px = n->pos(c); - if (xF - eps < px && px < xF + eps) - lnods.push_back(n); - } - std::sort(lnods.begin(), lnods.end(), LessThan((c == 1) ? 0 : 1)); - - if (verbose) - std::cout << "nodes on " << name << " boundary: " << lnods.size() << '\n'; - if (lnods.size() < 2) - { - std::stringstream str; - str << "Periodic::nodesOnEdge - not enough nodes on " << name << " boundary!\n"; - throw std::runtime_error(str.str()); - } - - /* - for(auto n : lnods) - std::cout << '\t' << *n << '\n'; - */ - return lnods; -} diff --git a/heat/src/wPeriodic.h b/heat/src/wPeriodic.h deleted file mode 100644 index 0e1d4c9a..00000000 --- a/heat/src/wPeriodic.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WPERIODIC_H -#define WPERIODIC_H - -#include "heat.h" -#include "wObject.h" -#include <vector> -#include <string> -#include <list> -#include <memory> -#include <Eigen/Dense> - -using namespace tbox; - -namespace heat -{ - -#ifndef SWIG -class HEAT_API NodePair -{ -public: - Node *n; - Node *d; - NodePair(Node *_n, Node *_d, double tol = 1e-12); - friend HEAT_API std::ostream &operator<<(std::ostream &out, NodePair const &obj); -}; -#endif //SWIG - -/** - * @brief manages periodic BCs - */ - -class HEAT_API Periodic : public fwk::wSharedObject -{ - std::shared_ptr<heat::Problem> pbl; - -public: -#ifndef SWIG - double TM; - double dTxM; - double dTyM; - std::vector<NodePair> LR; ///< left-right boundaries - std::vector<NodePair> BT; ///< bottom-top boundaries - std::vector<Node *> corners; ///< corner nodes -#endif - Eigen::Vector3d qM; ///< calculated mean flux - bool verbose; ///< print on/off - - Periodic(std::shared_ptr<heat::Problem> _pbl, double _TM, double _dTxM, double _dTyM); - virtual ~Periodic() { std::cout << "~Periodic()\n"; } - - void reset(double _TM, double _dTxM, double _dTyM); - -#ifndef SWIG - virtual void write(std::ostream &out) const override; - - void init(); -#endif - -private: - std::vector<Node *> - nodesOnEdge(std::list<Node *> const &nlist, double lc, Eigen::Vector3d const &pt, int c, std::string const &name) const; -}; - -} // namespace heat - -#endif //WPERIODIC_H diff --git a/heat/src/wProblem.cpp b/heat/src/wProblem.cpp deleted file mode 100644 index 90d4fdc3..00000000 --- a/heat/src/wProblem.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wProblem.h" -#include "wMedium.h" -#include "wBoundary.h" -#include "wSource.h" -#include "wPeriodic.h" // sinon: warning C4150: deletion of pointer to incomplete type 'heat::Periodic'; no destructor called -#include "wElement.h" - -#include "wTag.h" -using namespace heat; - -Problem::Problem(std::shared_ptr<MshData> _msh) : msh(_msh), pdic(NULL) -{ -} - -void Problem::write(std::ostream &out) const -{ - out << "heat::Problem:\n"; -} - -Problem::~Problem() -{ - std::cout << "~Problem()\n"; -} - -/** - * @brief Initialize the elements precomputed values - */ -void Problem::initElems() -{ - // Update volume Jacobian - for (auto vol : media) - for (auto e : vol->tag->elems) - e->initValues(true); - // Update volume Jacobian (volume source) - for (auto vol : srcs) - for (auto e : vol->tag->elems) - e->initValues(true); - // Update surface Jacobian (Neumann B.C.) - for (auto surf : bnds) - for (auto e : surf->tag->elems) - e->initValues(false); -} \ No newline at end of file diff --git a/heat/src/wProblem.h b/heat/src/wProblem.h deleted file mode 100644 index 875aa6da..00000000 --- a/heat/src/wProblem.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WPROBLEM_H -#define WPROBLEM_H - -#include "heat.h" -#include "wObject.h" -#include <memory> -#include <iostream> -#include <vector> - -using namespace tbox; - -namespace heat -{ - -/** - * @brief a class containing the problem parameters - */ - -class HEAT_API Problem : public fwk::wSharedObject -{ -public: - std::shared_ptr<MshData> msh; ///< Mesh structure -#ifndef SWIG - std::vector<std::shared_ptr<Medium>> media; ///< Materials - std::vector<std::shared_ptr<Dirichlet>> dBCs; ///< Dirichlet boundary conditions - - std::vector<std::shared_ptr<Source>> srcs; ///< volumic sources - std::vector<std::shared_ptr<Boundary>> bnds; ///< prescribed fluxes on the boundary - - std::shared_ptr<Periodic> pdic; ///< periodic BC -#endif - -public: - Problem(std::shared_ptr<MshData> _msh); - virtual ~Problem(); - - void add(std::shared_ptr<Medium> m) { media.push_back(m); } - void add(std::shared_ptr<Dirichlet> d) { dBCs.push_back(d); } - void add(std::shared_ptr<Source> s) { srcs.push_back(s); } - void add(std::shared_ptr<Boundary> b) { bnds.push_back(b); } - void add(std::shared_ptr<Periodic> p) { pdic = p; } - -#ifndef SWIG - void initElems(); - virtual void write(std::ostream &out) const override; -#endif -}; - -} // namespace heat - -#endif //WPROBLEM_H diff --git a/heat/src/wSolver.cpp b/heat/src/wSolver.cpp deleted file mode 100644 index 0148904f..00000000 --- a/heat/src/wSolver.cpp +++ /dev/null @@ -1,712 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wSolver.h" -#include "wMshData.h" -#include "wNode.h" -#include "wElement.h" -#include "wTri3.h" -#include "wTimer.h" -#include "wTag.h" -#include "wFct2.h" -#include "wProblem.h" -#include "wMedium.h" -#include "wSource.h" -#include "wBoundary.h" -#include "wDirichlet.h" -#include "wDisplayHook.h" -#include "wPeriodic.h" -#include "wHeatTerm.h" -#include "wResults.h" -#include "wMshExport.h" -#include "wLinearSolver.h" - -#include <Eigen/Sparse> -#include <typeinfo> -#include <algorithm> -#include <iomanip> -#include <deque> - -#include <tbb/global_control.h> -#include <tbb/parallel_for_each.h> -#include <tbb/spin_mutex.h> -using namespace heat; -using namespace fwk; - -#undef min -#undef max - -Solver::Solver(std::shared_ptr<Problem> _pbl, std::shared_ptr<tbox::LinearSolver> _linsol) : pbl(_pbl), linsol(_linsol) -{ - dhook = NULL; - - // default values - nthreads = 1; - verbose = 1; - stopit = false; - restol = 1e-2; - itmax = 100; - save = true; - - // update element memory - pbl->initElems(); -} - -Solver::~Solver() -{ - std::cout << "~Solver()\n"; -} - -/** - * @todo planter clairement si pas de Medium - * @todo calculer la taille du systeme en fct du nombre de noeuds des physical groups utilisés - */ -void Solver::start(MshExport *mshWriter) -{ - tbb::spin_mutex mutex; - tbb::global_control control(tbb::global_control::max_allowed_parallelism, nthreads); - - // start timers - tms["total"].start(); - tms["prepro"].start(); // ----- start preprocessing phase - - if (verbose > 1) - std::cout << *this; - - auto msh = pbl->msh; - - // setup results - T1.resize(msh->nodes.size(), 0.); // in case of restart - Eigen::Map<Eigen::VectorXd> T1_(T1.data(), T1.size()); - - Results results; - results.scalars_at_nodes["T"] = &T1; - - // initial temperature guess - if (!pbl->dBCs.empty()) - { - double tmin = std::numeric_limits<double>::max(); - double tmax = std::numeric_limits<double>::min(); - for (auto dBC : pbl->dBCs) - { - double v = dBC->val; - if (v < tmin) - tmin = v; - if (v > tmax) - tmax = v; - } - /* - std::cout << "tmin=" << tmin << "\n"; - std::cout << "tmax=" << tmax << "\n"; - */ - for (auto n : msh->nodes) - T1[n->row] = (tmin + tmax) / 2; - - for (auto dBC : pbl->dBCs) - dBC->apply(T1); - } - - // periodic BCs - if (pbl->pdic) - { - if (!pbl->dBCs.empty()) - throw std::runtime_error("cannot manage periodic BCs and Dirichlet BCs simultaneously!\n"); - pbl->pdic->init(); - - // initial guess for T - for (auto n : msh->nodes) - T1[n->row] = pbl->pdic->TM; - } - tms["prepro"].stop(); // ----- end of preprocessing phase - - // -------------------------------------------------------------------- - // Iteration LOOP - // -------------------------------------------------------------------- - - int it = 0; - while (it <= itmax) - { - std::vector<double> rhs(msh->nodes.size()); // dummy RHS - Eigen::Map<Eigen::VectorXd> rhs_ = Eigen::Map<Eigen::VectorXd>(rhs.data(), rhs.size()); // actual RHS - - tms["Kass"].start(); - // K matrix assembly - Eigen::SparseMatrix<double, Eigen::RowMajor> K(msh->nodes.size(), msh->nodes.size()); - buildK(K, rhs_); - //tomatlab("K.txt", K); - //throw std::runtime_error("stop!"); - tms["Kass"].stop(); - - tms["BCs"].start(); - - if (!pbl->pdic) - { - builds(rhs_); // sources - buildq(rhs_); // prescribed fluxes (=sources over lines) - - // BCs - for (auto dBC : pbl->dBCs) // apply Dirichlet BCs to RHS - dBC->apply(rhs); - } - tms["BCs"].stop(); - //std::cout << rhs << "\n"; - - // residual calculation - tms["residual"].start(); - - // method #1 - Eigen::VectorXd qint = K * T1_; // calcul de q_int = K T1: - - // method #2 - if (0) - { - Eigen::VectorXd qint2; - buildqint(qint2); // calcul de q_int par integration du flux sur l'elem - double normdiff = (qint - qint2).norm(); - //if(verbose>1) - std::cout << "norm diff=" << normdiff << '\n'; - } - - /* - for(auto i=0; i<msh->nodes.size(); ++i) - std::cout << i << ":" << qint[i] << "," << qint2[i] << "\n"; - */ - - Eigen::VectorXd res = qint - rhs_; // residual - double rnorm2 = res.norm(); - double rnorminf = res.lpNorm<Eigen::Infinity>(); - tms["residual"].stop(); - - if (verbose > 0) - { - std::cout << std::fixed << std::setprecision(3); - std::cout << " * it #" << std::setw(3) << std::left << it - << " |r|2 = " << std::setw(9) << std::scientific << std::right << rnorm2 - << " |r|inf = " << std::setw(9) << std::scientific << std::right << rnorminf << '\n'; - } - // check convergence - if (rnorm2 < restol && it != 0) - break; - it++; - - // solve - tms["solve"].start(); - if (verbose > 1) - std::cout << "solving...\n"; - if (it == 1) - { - linsol->analyze(K); - } - linsol->factorize(K); - linsol->solve(rhs_, T1_); - tms["solve"].stop(); - } - if (it > itmax) - { - std::cout << "\n**WARNING! iterative process failed to converge\n"; - std::cout << " in less than " << itmax << " iterations!\n\n"; // TODO: generer une erreur! - } - - // -------------------------------------------------------------------- - // Postprocessing - // -------------------------------------------------------------------- - - if (verbose > 1) - std::cout << "postpro...\n"; - tms["post"].start(); - - // setup results - - std::vector<double> gradT_x(msh->elems.size()); ///< gradT_x - std::vector<double> gradT_y(msh->elems.size()); ///< gradT_y - std::vector<Eigen::Vector3d> gradT(msh->elems.size()); ///< gradT - std::vector<Eigen::Vector3d> kgradT(msh->elems.size()); ///< gradT - std::vector<double> kmoy11(msh->elems.size()); ///< mean k11 / element - std::vector<double> kmoy22(msh->elems.size()); ///< mean k22 / element - std::vector<double> kmoy12(msh->elems.size()); ///< mean k12 / element - std::vector<double> kmoy21(msh->elems.size()); ///< mean k21 / element - std::vector<Eigen::MatrixXd> kmoy(msh->elems.size()); - for (auto &km : kmoy) - km = Eigen::Matrix3d::Zero(); - - results.scalars_at_elems["gradT_x"] = &gradT_x; - results.scalars_at_elems["gradT_y"] = &gradT_y; - results.scalars_at_elems["k11"] = &kmoy11; - results.scalars_at_elems["k22"] = &kmoy22; - results.scalars_at_elems["k12"] = &kmoy12; - results.scalars_at_elems["k21"] = &kmoy21; - results.vectors_at_elems["gradT"] = &gradT; - results.vectors_at_elems["q [heat flux]"] = &kgradT; - results.tensors_at_elems["k [tensor]"] = &kmoy; - - double Vtot = 0.0; - Eigen::Vector2d qM = Eigen::Vector2d::Zero(); - for (auto mat : pbl->media) - { - tbb::parallel_for_each(mat->tag->elems.begin(), mat->tag->elems.end(), [&](Element *e) { - if (e->type() != ElType::TRI3) - return; - //std::cout << "processing element #" << e->no << "\n"; - - // (flux moyen . volume) sur l'element - Eigen::VectorXd qV = HeatTerm::computeFlux(*e, T1, *mat->k); - - double V = e->getVol(); - - if (save) - { - // gradient of T at GP 0 - Eigen::VectorXd grad = e->computeGradient(T1, 0); - int i = e->no - 1; - gradT_x[i] = grad(0); - gradT_y[i] = grad(1); - gradT[i] = Eigen::Vector3d(grad(0), grad(1), 0); - - // mean q over the element - kgradT[i] = Eigen::Vector3d(qV(0) / V, qV(1) / V, 0); - - // mean k over the element - Eigen::MatrixXd kmean = HeatTerm::computeMatrix(*e, T1, *mat->k) / V; - kmoy11[i] = kmean(0, 0); - kmoy22[i] = kmean(1, 1); - kmoy12[i] = kmean(0, 1); - kmoy21[i] = kmean(1, 0); - - // tensor - kmean.conservativeResize(3, 3); - kmean.row(2) = Eigen::RowVector3d::Zero(); - kmean.col(2) = Eigen::Vector3d::Zero(); - kmoy[i] = kmean; - //std::cout << kmean << '\n'; - } - - tbb::spin_mutex::scoped_lock lock(mutex); - Vtot += V; - qM += qV; // qM = qM + qV - }); - } - qM /= Vtot; - - if (verbose > 1) - { - std::cout << "Vtot = " << Vtot << '\n'; - std::cout << "qM = " << qM << '\n'; - } - - // periodic BCs - if (pbl->pdic) - { - pbl->pdic->qM = Eigen::Vector3d(qM(0), qM(1), 0.); - if (verbose > 1) - { - std::cout << "=> k_x = " << ((pbl->pdic->dTxM == 0.0) ? 0 : qM(0) / pbl->pdic->dTxM) << '\n'; - std::cout << "=> k_y = " << ((pbl->pdic->dTyM == 0.0) ? 0 : qM(1) / pbl->pdic->dTyM) << '\n'; - } - } - - if (save) - { - if (verbose > 1) - std::cout << "saving results to disk...\n"; - mshWriter->save(msh->name, results); - } - - tms["post"].stop(); - tms["total"].stop(); - - if (verbose > 0) - { - std::cout << "---CPU statistics ---\n"; - std::cout << tms; - std::cout << "---------------------\n"; - } -} - -void Solver::buildK(Eigen::SparseMatrix<double, Eigen::RowMajor> &K2, Eigen::Map<Eigen::VectorXd> &rhs) -{ - tbb::spin_mutex mutex; - - std::shared_ptr<MshData> msh = pbl->msh; - - // List of triplets to build matrix - std::deque<Eigen::Triplet<double>> T; - - // periodic BCs - // (on va sommer les lignes des noeuds "d" sur celles des noeuds "n") - - std::vector<int> rows(msh->nodes.size()); - for (size_t i = 0; i < msh->nodes.size(); ++i) - rows[i] = msh->nodes[i]->row; - - if (pbl->pdic) - { - for (auto np : pbl->pdic->BT) - rows[np.d->row] = np.n->row; - for (auto np : pbl->pdic->LR) - rows[np.d->row] = np.n->row; - } - - if (verbose > 1) - std::cout << "building K (TBB/lambda) using " << nthreads << " threads...\n"; - - bool useTBB = false; - if (useTBB) - { - // 1-STEP PROCEDURE - - for (auto mat : pbl->media) - { - if (verbose > 1) - std::cout << "\tprocessing " << *mat << '\n'; - tbb::parallel_for_each(mat->tag->elems.begin(), mat->tag->elems.end(), [&](Element *e) { - if (e->type() != ElType::TRI3) - return; - //std::cout << "processing element #" << e->no << "\n"; - - Eigen::MatrixXd Ke = HeatTerm::build(*e, T1, *mat->k, false); - - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - for (size_t jj = 0; jj < e->nodes.size(); ++jj) - { - Node *nodj = e->nodes[jj]; - T.push_back(Eigen::Triplet<double>(rows[nodi->row], nodj->row, Ke(ii, jj))); - } - } - }); - } - } - else - { - // 3-STEP PROCEDURE - - // *** build Job list - "fake run" - - if (verbose > 1) - std::cout << "building job list...\n"; - - for (auto mat : pbl->media) - { - if (verbose > 1) - std::cout << "\tprocessing " << *mat << '\n'; - std::for_each(mat->tag->elems.begin(), mat->tag->elems.end(), - [&](Element *e) { - if (e->type() != ElType::TRI3) - return; - Eigen::MatrixXd Ke = HeatTerm::build(*e, T1, *mat->k, true); // bidon - }); - } - - // *** execute all jobs generated during the fake run - - if (verbose > 1) - std::cout << "executing job list...\n"; - for (auto mat : pbl->media) - mat->k->evalall(); - - // *** perform the assembly with the results ("true run") - - if (verbose > 1) - std::cout << "performing assembly...\n"; - - for (auto mat : pbl->media) - { - if (verbose > 1) - std::cout << "\tprocessing " << *mat << '\n'; - - std::for_each(mat->tag->elems.begin(), mat->tag->elems.end(), [&](Element *e) { // devrait pouvoir etre fait en TBB... - if (e->type() != ElType::TRI3) - return; - Eigen::MatrixXd Ke = HeatTerm::build(*e, T1, *mat->k, false); - - // assembly - //tbb::spin_mutex::scoped_lock lock(mutex); - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - for (size_t jj = 0; jj < e->nodes.size(); ++jj) - { - Node *nodj = e->nodes[jj]; - T.push_back(Eigen::Triplet<double>(rows[nodi->row], nodj->row, Ke(ii, jj))); - } - } - }); - } - if (verbose > 1) - std::cout << "assembly done.\n"; - } - // Build matrix without BCs - K2.setFromTriplets(T.begin(), T.end()); - - // periodic BCs - if (pbl->pdic) - { - // equations \theta_d (R,T) fct (L,B) - double lx = pbl->pdic->corners[1]->pos(0) - pbl->pdic->corners[0]->pos(0); - double ly = pbl->pdic->corners[3]->pos(1) - pbl->pdic->corners[0]->pos(1); - if (verbose > 1) - std::cout << "lx = " << lx << '\n'; - if (verbose > 1) - std::cout << "ly = " << ly << '\n'; - double TM = pbl->pdic->TM; - double dTxM = pbl->pdic->dTxM; - double dTyM = pbl->pdic->dTyM; - - for (auto np : pbl->pdic->LR) - { - // clears related row - for (Eigen::SparseMatrix<double, Eigen::RowMajor>::InnerIterator it(K2, np.d->row); it; ++it) - it.valueRef() = 0.; - - K2.coeffRef(np.d->row, np.d->row) = 1.0; - K2.coeffRef(np.d->row, np.n->row) = -1.0; - rhs(np.d->row) = lx * dTxM; - } - - for (auto np : pbl->pdic->BT) - { - // clears related row - for (Eigen::SparseMatrix<double, Eigen::RowMajor>::InnerIterator it(K2, np.d->row); it; ++it) - it.valueRef() = 0.; - - K2.coeffRef(np.d->row, np.d->row) = 1.0; - K2.coeffRef(np.d->row, np.n->row) = -1.0; - rhs(np.d->row) = ly * dTyM; - } - - // corners \theta_2,3,4 fct \theta_1 - - for (auto i = 0; i < 4; ++i) - { - Node *nod = pbl->pdic->corners[i]; - // clears related row - for (Eigen::SparseMatrix<double, Eigen::RowMajor>::InnerIterator it(K2, nod->row); it; ++it) - it.valueRef() = 0.; - } - - Node *n1 = pbl->pdic->corners[0]; - for (auto i = 1; i < 4; ++i) - { - Node *ni = pbl->pdic->corners[i]; - K2.coeffRef(ni->row, ni->row) = 1.0; - K2.coeffRef(ni->row, n1->row) = -1.0; - } - Node *n2 = pbl->pdic->corners[1]; - Node *n3 = pbl->pdic->corners[2]; - Node *n4 = pbl->pdic->corners[3]; - rhs(n2->row) = lx * dTxM; - rhs(n3->row) = lx * dTxM + ly * dTyM; - rhs(n4->row) = ly * dTyM; - - // thermal energy consistency condition (n1->row) - - double Vtot = 0.0; - double rhocM_Vtot = 0; - for (auto mat : pbl->media) - { - //std::cout << "\tprocessing " << *mat << '\n'; - tbb::parallel_for_each(mat->tag->elems.begin(), mat->tag->elems.end(), [&](Element *e) { - if (e->type() != ElType::TRI3) - return; - //std::cout << "processing element #" << e->no << "\n"; - - // ** Ce matrix => K matrix - Eigen::VectorXd Ce = HeatTerm::build(*e, T1, Fct0C(1.0)); - - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); - for (size_t jj = 0; jj < e->nodes.size(); ++jj) - { - Node *nodj = e->nodes[jj]; - K2.coeffRef(n1->row, nodj->row) += (mat->rhoc) * Ce(jj); - - Vtot += Ce(jj); - rhocM_Vtot += (mat->rhoc) * Ce(jj); - } - }); - } - rhs(n1->row) = rhocM_Vtot * TM; - if (verbose > 1) - std::cout << "Vtot=" << Vtot << "\n"; - if (verbose > 1) - std::cout << "rhocM_Vtot=" << rhocM_Vtot << "\n"; - } - - if (!pbl->dBCs.empty()) - { - if (verbose > 1) - std::cout << "applying Dirichlet BCs...\n"; - - // apply Dirichlet BCs to K - for (auto dBC : pbl->dBCs) - { - for (auto nod : dBC->nodes) - { - //std::cout << "processing " << *nod << "\n"; - for (Eigen::SparseMatrix<double, Eigen::RowMajor>::InnerIterator it(K2, nod->row); it; ++it) - { - if (it.row() == it.col()) - it.valueRef() = 1.; - else - it.valueRef() = 0.; - } - } - } - if (verbose > 1) - std::cout << "done." << std::endl; - } - - // Clean matrix and turn to compressed row format - K2.prune(0.); - K2.makeCompressed(); - - if (verbose > 1) - { - std::cout << "K (" << K2.rows() << "," << K2.cols() << ") nnz=" << K2.nonZeros() << "\n"; - } -} - -void Solver::buildqint(Eigen::VectorXd &qint) -{ - tbb::spin_mutex mutex; - - qint = Eigen::VectorXd::Zero(pbl->msh->nodes.size()); - - for (auto mat : pbl->media) - { - if (verbose > 1) - std::cout << "\tprocessing " << *mat << '\n'; - tbb::parallel_for_each(mat->tag->elems.begin(), mat->tag->elems.end(), [&](Element *e) { - if (e->type() != ElType::TRI3) - return; - //std::cout << "processing element #" << e->no << "\n"; - - Eigen::VectorXd qe = HeatTerm::build2(*e, T1, *mat->k); - - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - qint(nodi->row) += qe(ii); - } - }); - } - - if (!pbl->dBCs.empty()) - { - if (verbose > 1) - std::cout << "applying Dirichlet BCs...\n"; - - // apply Dirichlet BCs to qint - for (auto dBC : pbl->dBCs) - { - for (auto nod : dBC->nodes) - { - qint(nod->row) = T1[nod->row]; // pour comparer avec K.T1 - } - } - if (verbose > 1) - std::cout << "done." << std::endl; - } -} - -/** - * @brief volume sources - */ - -void Solver::builds(Eigen::Map<Eigen::VectorXd> &s) -{ - tbb::spin_mutex mutex; - - if (verbose > 1) - std::cout << "building s (TBB/lambda) using " << nthreads << " threads...\n"; - - for (auto src : pbl->srcs) - { - //std::cout << "\tprocessing " << *src << '\n'; - tbb::parallel_for_each(src->tag->elems.begin(), src->tag->elems.end(), [&](Element *e) { - if (e->type() != ElType::TRI3 && e->type() != ElType::LINE2) - return; - //std::cout << "processing element #" << e->no << "\n"; - - // ** se vector => s vector - Eigen::VectorXd se = HeatTerm::build(*e, T1, *src->f); - - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); - - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - s(nodi->row) += se(ii); - } - }); - } - - if (verbose > 1) - { - std::cout << "s (" << s.size() << ")\n"; - } -} - -/** - * @brief terme BC Neumann (pourrait etre mergé avec "builds"... c'est idem) - * @todo merge this routine with builds - */ -void Solver::buildq(Eigen::Map<Eigen::VectorXd> &q) -{ - tbb::spin_mutex mutex; - - if (verbose > 1) - std::cout << "building q (TBB/lambda) using " << nthreads << " threads...\n"; - - for (auto bnd : pbl->bnds) - { - //std::cout << "\tprocessing " << *src << '\n'; - tbb::parallel_for_each(bnd->tag->elems.begin(), bnd->tag->elems.end(), [&](Element *e) { - if (e->type() != ElType::LINE2) - return; - //std::cout << "processing element #" << e->no << "\n"; - - // ** qe vector => q vector - Eigen::VectorXd qe = HeatTerm::build(*e, T1, *bnd->f); - - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); - - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - q(nodi->row) += qe(ii); - } - }); - } - - if (verbose > 1) - { - std::cout << "q (" << q.size() << ")\n"; - } -} - -void Solver::write(std::ostream &out) const -{ - out << "heat::Solver" - << "\n"; -} diff --git a/heat/src/wSolver.h b/heat/src/wSolver.h deleted file mode 100644 index bd83c28c..00000000 --- a/heat/src/wSolver.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WSOLVER_H -#define WSOLVER_H - -#include "heat.h" -#include "wObject.h" -#include "wTimer.h" -#include "wTimers.h" -#include "wElement.h" -#include <iostream> -#include <vector> -#include <memory> -#include <Eigen/Sparse> - -using namespace tbox; - -namespace heat -{ - -/** - * @brief heat solver - */ - -class HEAT_API Solver : public fwk::wSharedObject -{ -public: - int verbose; -#ifndef SWIG - DisplayHook *dhook; - -#endif - std::shared_ptr<Problem> pbl; - std::shared_ptr<tbox::LinearSolver> linsol; ///< linear solver - - bool stopit; ///< stop the calculation - int nthreads; ///< # of threads for the assembly - fwk::Timers tms; ///< timers - std::vector<double> T1; ///< nodal temperatures - double restol; ///< tolerance on the residual - int itmax; ///< max number of iterations - bool save; ///< calculate all results -public: - Solver(std::shared_ptr<Problem> _pbl, std::shared_ptr<tbox::LinearSolver> _linsol); - virtual ~Solver(); - - virtual void start(MshExport *mshWriter); - - void setGUI(DisplayHook &hook) { dhook = &hook; } - - void stop() { stopit = true; } -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif - -private: - void buildK(Eigen::SparseMatrix<double, Eigen::RowMajor> &K2, Eigen::Map<Eigen::VectorXd> &rhs); - void builds(Eigen::Map<Eigen::VectorXd> &s); - void buildq(Eigen::Map<Eigen::VectorXd> &s); - void buildqint(Eigen::VectorXd &qint); -}; - -} // namespace heat - -#endif //WSOLVER_H diff --git a/heat/src/wSource.cpp b/heat/src/wSource.cpp deleted file mode 100644 index 149c18d1..00000000 --- a/heat/src/wSource.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wSource.h" -#include "wProblem.h" -#include "wTag.h" -using namespace heat; - -Source::Source(std::shared_ptr<MshData> _msh, int no, std::shared_ptr<Fct0> _f) : Group(_msh, no), f(_f) -{ - //pbl.srcs.push_back(this); -} - -Source::Source(std::shared_ptr<MshData> _msh, std::string const &name, std::shared_ptr<Fct0> _f) : Group(_msh, name), f(_f) -{ - //pbl.srcs.push_back(this); -} - -void Source::write(std::ostream &out) const -{ - out << "heat::Source on " << *tag << '\n'; -} diff --git a/heat/src/wSource.h b/heat/src/wSource.h deleted file mode 100644 index b83b7263..00000000 --- a/heat/src/wSource.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WSOURCE_H -#define WSOURCE_H - -#include "heat.h" -#include "wGroup.h" -#include "wFct0.h" -#include <vector> -#include <string> - -using namespace tbox; - -namespace heat -{ - -/** - * @brief manage (volumic) heat sources - */ - -class HEAT_API Source : public Group -{ -public: -#ifndef SWIG - std::shared_ptr<Fct0> f; -#endif - Source(std::shared_ptr<MshData> _msh, int no, std::shared_ptr<Fct0> _f); - Source(std::shared_ptr<MshData> _msh, std::string const &name, std::shared_ptr<Fct0> _f); - virtual ~Source() { std::cout << "~Source()\n"; } - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -} // namespace heat - -#endif //WSOURCE_H diff --git a/heat/tests/basics/anisotropy.py b/heat/tests/basics/anisotropy.py deleted file mode 100755 index 97b0ef25..00000000 --- a/heat/tests/basics/anisotropy.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# simple test on a square : heat source + anisotropy - -import heat as h -import heat.utils as u -import tbox -import tbox.gmsh as gmsh -from fwk.testing import * - -def main(): - - # mesh a unit square - pars = {'Lx' : 1 , 'Ly' : 1, 'Nx' : 30, 'Ny' : 30} - msh = gmsh.MeshLoader("../../models/rect_stru.geo",__file__).execute(**pars) - gmshWriter = tbox.GmshExport(msh) - pbl = h.Problem(msh) - - # medium/boundary conditions - pbl.add(h.Source(msh, "S1", tbox.Fct0C(1.0))) # heat src - - pbl.add(h.Medium(msh, "S1", tbox.Fct2C(2.0,1.0,-1.0))) # anisotropy - - pbl.add(h.Dirichlet(msh,"Left", 0.)) - pbl.add(h.Dirichlet(msh,"Right", 0.)) - pbl.add(h.Dirichlet(msh,"Bottom", 0.)) - pbl.add(h.Dirichlet(msh,"Top", 0.)) - - # solve problem - solver = u.solve(pbl, gmshWriter) - - # check results - x1,y1,T1 = u.getTemp(solver,"S1") - tests = CTests() - tests.add(CTest('max(T)', max(T1), 0.053841, 1e-2)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/heat/tests/basics/dirichletx.py b/heat/tests/basics/dirichletx.py deleted file mode 100755 index 65a7c5be..00000000 --- a/heat/tests/basics/dirichletx.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import heat.utils as u -from fwk.testing import * - -if __name__ == "__main__": - import heat.models.rect as m - solver = m.main(bc='dirichletx') - - x1,y1,T1 = u.getTemp(solver,"Bottom") - - u.simpleplot(x1, T1, xlabel='x [mm]', title='Temperature along x') - - tests = CTests() - tests.add(CTest('mean(Tbottom)', sum(T1) / len(T1), 4.0, 1e-9)) - tests.add(CTest('max(Tbottom)', max(T1), 5.0)) - tests.add(CTest('min(Tbottom)', min(T1), 3.0)) - tests.run() - diff --git a/heat/tests/basics/dirichletx_stru.py b/heat/tests/basics/dirichletx_stru.py deleted file mode 100755 index cd444f39..00000000 --- a/heat/tests/basics/dirichletx_stru.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import heat.utils as u -from fwk.testing import * - -if __name__ == "__main__": - import heat.models.rect as m - solver = m.main(bc='dirichletx', stru=True) - - x1,y1,T1 = u.getTemp(solver,"Bottom") - - u.simpleplot(x1, T1, xlabel='x [mm]', title='Temperature along x') - - tests = CTests() - tests.add(CTest('mean(Tbottom)', sum(T1) / len(T1), 4.0, 1e-9)) - tests.add(CTest('max(Tbottom)', max(T1), 5.0)) - tests.add(CTest('min(Tbottom)', min(T1), 3.0)) - tests.run() diff --git a/heat/tests/basics/dirichlety.py b/heat/tests/basics/dirichlety.py deleted file mode 100755 index abcedb8b..00000000 --- a/heat/tests/basics/dirichlety.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import heat.utils as u -from fwk.testing import * - -if __name__ == "__main__": - import heat.models.rect as m - solver = m.main(bc='dirichlety',Lx=5, lc=0.5) - - x1,y1,T1 = u.getTemp(solver,"Left", sort='y') - - u.simpleplot(y1, T1, xlabel='y [mm]', title='Temperature along y') - - tests = CTests() - tests.add(CTest('mean(Tleft)', sum(T1) / len(T1), 4.0, 1e-9)) - tests.add(CTest('max(Tleft)', max(T1), 5.0)) - tests.add(CTest('min(Tleft)', min(T1), 3.0)) - tests.run() - diff --git a/heat/tests/basics/mat2hole.geo b/heat/tests/basics/mat2hole.geo deleted file mode 100644 index 98f855e6..00000000 --- a/heat/tests/basics/mat2hole.geo +++ /dev/null @@ -1,79 +0,0 @@ -// 2 materials and a hole - -lc = 0.5; -Lx = 13; -Ly = 9; - - -ix = 3; -iy = 3; -//iR = 1.5; -DefineConstant[ iR = { 1.5, Min 0.5, Max 1.5, Step 0.1, Name "Lengths/iR" } ]; - -hx = Lx-3; -hy = Ly-4; -hR = 2.5; - - -// -- outer boundary - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { Lx, 0, 0, lc}; -Point(3) = { Lx, Ly, 0, lc}; -Point(4) = { 0, Ly, 0, lc}; - - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line Loop(1) = {1, 2, 3, 4}; - - -// -- inclusion -Point(11) = { ix-iR, iy, 0, lc/2}; -Point(12) = { ix, iy, 0, lc/2}; -Point(13) = { ix+iR, iy, 0, lc/2}; - -Circle(10) = {11, 12, 13}; -Circle(11) = {13, 12, 11}; - -Line Loop(11) = {11, 10}; - -Plane Surface(11) = {11}; - -// -- hole - -Point(21) = { hx-hR, hy, 0, lc/2}; -Point(22) = { hx, hy, 0, lc/2}; -Point(23) = { hx+hR, hy, 0, lc/2}; - -Circle(20) = {21, 22, 23}; -Circle(21) = {23, 22, 21}; - -Line Loop(21) = {21, 20}; - - -// -- matrix -Plane Surface(1) = {1, 11, 21}; - - - -Physical Point("P1") = {1}; -Physical Point("P2") = {2}; -Physical Point("P3") = {3}; -Physical Point("P4") = {4}; - -Physical Line("Bottom") = {1}; -Physical Line("Right") = {2}; -Physical Line("Top") = {3}; -Physical Line("Left") = {4}; - -Physical Surface("Matrix") = {1}; -Physical Surface("Inclusion") = {11}; - - - - - diff --git a/heat/tests/basics/mat2hole.py b/heat/tests/basics/mat2hole.py deleted file mode 100755 index e0e3153b..00000000 --- a/heat/tests/basics/mat2hole.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import heat as h -import heat.utils as u -import tbox -import tbox.gmsh as gmsh -from fwk.testing import * - -def main(**d): - # default params - p={} - p['iR'] = 1.0 - p.update(d) - - msh = gmsh.MeshLoader("mat2hole.geo",__file__).execute(**p) - gmshWriter = tbox.GmshExport(msh) - - pbl = h.Problem(msh) - - pbl.add(h.Medium(msh, "Matrix", tbox.Fct2C(1e-5,1e-5,0))) - pbl.add(h.Medium(msh, "Inclusion", tbox.Fct2C(1e5,1e5,0))) - - pbl.add(h.Source(msh, "Inclusion", tbox.Fct0C(1e-4))) - - gleft = h.Dirichlet(msh,"Left", 3.) - pbl.add(gleft) - gright = h.Dirichlet(msh,"Right",5.) - pbl.add(gright) - - # solve problem - solver = u.solve(pbl, gmshWriter) - - # extract some results - x1,y1,T1 = u.getTemp(solver,"Top", sort='x') - - u.simpleplot(x1, T1, xlabel='x [mm]', title='Temperature along x') - - tests = CTests() - tests.add(CTest('mean(Ttop)', sum(T1) / len(T1), 6.639428, 1e-3)) - tests.add(CTest('max(Ttop)', max(T1), 8.3445125, 1e-3)) - tests.add(CTest('min(Ttop)', min(T1), 3.0)) - tests.run() - -if __name__ == "__main__": - main() diff --git a/heat/tests/basics/source.py b/heat/tests/basics/source.py deleted file mode 100755 index 65d0fe84..00000000 --- a/heat/tests/basics/source.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import heat.utils as u -from fwk.testing import * - -if __name__ == "__main__": - import heat.models.rect as m - solver = m.main(bc='dirichletx', src=True) - - x1,y1,T1 = u.getTemp(solver,"Bottom") - - u.simpleplot(x1, T1, xlabel='x [mm]', title='Temperature along x') - - tests = CTests() - tests.add(CTest('mean(Tbottom)', sum(T1) / len(T1), 4.791563, 1e-4)) - tests.add(CTest('max(Tbottom)', max(T1), 5.449610, 1e-4)) - tests.add(CTest('min(Tbottom)', min(T1), 3.0)) - tests.run() - diff --git a/heat/tests/directors/material.py b/heat/tests/directors/material.py deleted file mode 100755 index a0dc3916..00000000 --- a/heat/tests/directors/material.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# simple test where -# the material anisotropy depends on temperature - -import heat as h -import heat.utils as u -import tbox -import tbox.gmsh as gmsh -from fwk.testing import * - -class MyMaterial(tbox.Fct2U): - """ - Custom material - calculates the conductivity tensor - as a function of the local temperature - """ - def __init__(self, kx, ky, theta): - tbox.Fct2U.__init__(self) - self.kx = kx - self.ky = ky - self.theta = theta - - def eval(self, u, k, fake): - import numpy as np - import math - t = (self.theta) *math.pi/180.0 - u1 = 0. ; t1=-t - u2 = 10. ; t2 = t - - t = t1+(t2-t1)/(u2-u1)*(u-u1) - - kx = self.kx - ky = self.ky - - co = math.cos(t) - si = math.sin(t) - - R = np.array([[co, -si], - [si, co]]) - Kt = np.array([[kx, 0.0], - [0.0, ky]]) - Tmp = np.dot(R,Kt) - Kxy = np.dot(Tmp,R.T) - - k.resize(2, 2) - k[0,0]=Kxy[0,0] - k[1,1]=Kxy[1,1] - k[1,0]=Kxy[1,0] - k[0,1]=Kxy[0,1] - #print k - -def main(): - # mesh a unit square - pars={ 'Lx' : 1 , 'Ly' : 1, 'Nx' : 20, 'Ny' : 10} - msh = gmsh.MeshLoader("../../models/rect_stru.geo",__file__).execute(**pars) - gmshWriter = tbox.GmshExport(msh) - pbl = h.Problem(msh) - - # medium/boundary conditions - myk = MyMaterial(1., 100., 20.) # version python - #myk=h.CompiledFct2b() # compiled version (not the same fct) - pbl.add(h.Medium(msh, "S1", myk)) - pbl.add(h.Dirichlet(msh,"Left", 0.)) - pbl.add(h.Dirichlet(msh,"Right", 10.)) - - # solve problem - solver = u.solve(pbl, gmshWriter) - - # extract some results - x1,y1,T1 = u.getTemp(solver,"Top", sort='x') - - u.simpleplot(x1, T1, xlabel='x [mm]', title='Temperature along x') - - tests = CTests() - tests.add(CTest('mean(Ttop)', sum(T1) / len(T1), 5.0, 5e-2)) - tests.add(CTest('max(Ttop)', max(T1), 10, 1e-3)) - tests.add(CTest('min(Ttop)', min(T1), 0, 0.1)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/heat/tests/directors/neumann.py b/heat/tests/directors/neumann.py deleted file mode 100755 index 8cdd8e2a..00000000 --- a/heat/tests/directors/neumann.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# test of Neumann BCs - -import heat as h -import heat.utils as u -import tbox -import tbox.gmsh as gmsh -from fwk.testing import * - -class MyFlux(tbox.Fct0XYZ): - def __init__(self, ampl, cx, cy, freq): - tbox.Fct0XYZ.__init__(self) - self.freq = freq - self.ampl = ampl - self.cx = cx - self.cy = cy - def eval(self, pt): - import math - x = pt[0]-self.cx - y = pt[1]-self.cy - return self.ampl*math.sin(math.pi*self.freq*math.sqrt(x*x+y*y)/1.) - - -def main(): - # mesh a unit square - pars={ 'Lx' : 1 , 'Ly' : 1, 'Nx' : 50, 'Ny' : 50} - msh = gmsh.MeshLoader("../../models/rect_stru.geo",__file__).execute(**pars) - gmshWriter = tbox.GmshExport(msh) - pbl = h.Problem(msh) - - # medium/boundary conditions - pbl.add(h.Medium(msh, "S1", tbox.Fct2C(1.0,1.0,0.0))) - f1 = MyFlux(100, 0, 0, 2.0) - f2 = MyFlux(100, 1, 1, 2.0) - pbl.add(h.Boundary(msh, "Left", f1)) # <== Neumann - pbl.add(h.Boundary(msh, "Right", f2)) # <== Neumann - pbl.add(h.Dirichlet(msh, "Bottom", 0.)) - pbl.add(h.Dirichlet(msh, "Top", 0.)) - - # solve problem - solver = u.solve(pbl, gmshWriter) - - # extract some results - x1,y1,T1 = u.getTemp(solver,"Left", sort='y') - - u.simpleplot(y1, T1, xlabel='y [mm]', title='Temperature along y') - - tests = CTests() - tests.add(CTest('mean(Tleft)', sum(T1) / len(T1), 0.0, 1e-6)) - tests.add(CTest('max(Tleft)', max(T1), 15.782894, 1e-3)) - tests.add(CTest('max+min(Tleft)', max(T1)+min(T1), 0.0, 1e-6)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/heat/tests/directors/source.py b/heat/tests/directors/source.py deleted file mode 100755 index 83c28a92..00000000 --- a/heat/tests/directors/source.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# simple test on a square using 'heat' - -import heat as h -import heat.utils as u -import tbox -import tbox.gmsh as gmsh -from fwk.testing import * -import math - -class MySource(tbox.Fct0XYZ): - """ - Custom heat source - """ - def __init__(self, cx, cy, freq): - tbox.Fct0XYZ.__init__(self) - self.freq = freq - self.cx = cx - self.cy = cy - def eval(self, pt): - x = pt[0]-self.cx - y = pt[1]-self.cy - return math.sin(2*math.pi*self.freq*math.sqrt(x*x+y*y)/1.) - -def main(): - - # mesh a unit square - pars={ 'Lx' : 1 , 'Ly' : 1, 'Nx' : 50, 'Ny' : 50} - msh = gmsh.MeshLoader("../../models/rect_stru.geo",__file__).execute(**pars) - gmshWriter = tbox.GmshExport(msh) - pbl = h.Problem(msh) - - # source calculated by python using swig directors - pbl.add(h.Source(msh, "S1", MySource(0.2,0.3, 5.0))) - - # medium/boundary conditions - pbl.add(h.Medium(msh, "S1", tbox.Fct2C(0.1, 0.1, 0.0))) - pbl.add(h.Dirichlet(msh,"Left", 0.)) - pbl.add(h.Dirichlet(msh,"Right", 0.)) - pbl.add(h.Dirichlet(msh,"Bottom", 0.)) - pbl.add(h.Dirichlet(msh,"Top", 0.)) - - # solve problem - solver = u.solve(pbl, gmshWriter) - - # extract some results - x1,y1,T1 = u.getTemp(solver,"S1", sort='y') - - u.simpleplot(y1, T1, xlabel='y [mm]', title='Temperature along y') - - tests = CTests() - tests.add(CTest('max(T)', max(T1), 0.014730, 1e-3)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/heat/tests/fe2/Lmacro.geo b/heat/tests/fe2/Lmacro.geo deleted file mode 100644 index 2df0b02f..00000000 --- a/heat/tests/fe2/Lmacro.geo +++ /dev/null @@ -1,37 +0,0 @@ -// L - -lc = 3; - -Lx1 = 10; -Lx2 = 20; - -Ly1 = 10; -Ly2 = 20; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { Lx1, 0, 0, lc}; -Point(3) = { Lx1+Lx2, 0, 0, lc}; - -Point(4) = { 0, Ly1, 0, lc}; -Point(5) = { Lx1, Ly1, 0, lc}; -Point(6) = { Lx1+Lx2, Ly1, 0, lc}; - -Point(7) = { 0, Ly1+Ly2, 0, lc}; -Point(8) = { Lx1, Ly1+Ly2, 0, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 6}; -Line(4) = {6, 5}; -Line(5) = {5, 8}; -Line(6) = {8, 7}; -Line(7) = {7, 4}; -Line(8) = {4, 1}; - -Line Loop(9) = {5, 6, 7, 8, 1, 2, 3, 4}; - -Plane Surface(10) = {9}; - -Physical Line("Top") = {6}; -Physical Line("Right") = {3}; -Physical Surface("S1") = {10}; diff --git a/heat/tests/fe2/Lmicro.geo b/heat/tests/fe2/Lmicro.geo deleted file mode 100644 index 1e5af699..00000000 --- a/heat/tests/fe2/Lmicro.geo +++ /dev/null @@ -1,33 +0,0 @@ -// square with 2 materials - -lc = 5e-3; - -Lx1 = 5e-3; -Lx2 = 5e-3; - -Ly1 = 10e-3; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { Lx1, 0, 0, lc}; -Point(3) = { Lx1+Lx2, 0, 0, lc}; - -Point(4) = { 0, Ly1, 0, lc}; -Point(5) = { Lx1, Ly1, 0, lc}; -Point(6) = { Lx1+Lx2, Ly1, 0, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 6}; -Line(4) = {6, 5}; -Line(5) = {5, 4}; -Line(6) = {4, 1}; -Line(7) = {2, 5}; - -Line Loop(8) = {5, 6, 1, 7}; -Plane Surface(9) = {8}; - -Line Loop(10) = {4, -7, 2, 3}; -Plane Surface(11) = {10}; - -Physical Surface("S1") = {9}; -Physical Surface("S2") = {11}; diff --git a/heat/tests/fe2/Lmpi.py b/heat/tests/fe2/Lmpi.py deleted file mode 100644 index cd8ce77f..00000000 --- a/heat/tests/fe2/Lmpi.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# test multiscale - version "task pull" -# exc: -# mpiexec.openmpi --bycore --bind-to-core -n 6 ./run.py heat/tests/fe2/heat_mpi.py - - -import heat as h -import heat.utils as u -import tbox -import tbox.gmsh as gmsh -from tbox.solvers import LinearSolver -import heat.fe2 as fe2 -from fwk.testing import * - -class Micro: - def __init__(self): - self.msh = gmsh.MeshLoader("Lmicro.geo", __file__).execute() - self.gmshWriter = tbox.GmshExport(self.msh) - self.pbl = h.Problem(self.msh) - - self.pbl.add(h.Medium(self.msh, "S1", tbox.Fct2C(1.,1.,0), 1.0)) - self.pbl.add(h.Medium(self.msh, "S2", tbox.Fct2C(5.,5.,0), 1.0)) - self.p = h.Periodic(self.pbl, 0.0, 0.0, 0.0) - self.pbl.add(self.p) - - self.solver = h.Solver(self.pbl, LinearSolver().pardiso()) - self.solver.nthreads = 1 - self.solver.save = False - self.solver.verbose = 0 - -class Macro: - def __init__(self, law): - self.msh = gmsh.MeshLoader("Lmacro.geo", __file__).execute() - self.gmshWriter = tbox.GmshExport(self.msh) - self.pbl = h.Problem(self.msh) - - self.pbl.add(h.Medium(self.msh, "S1", law)) - self.pbl.add(h.Dirichlet(self.msh,"Top", 0.)) - self.pbl.add(h.Dirichlet(self.msh,"Right", 10.)) - - self.solver = h.Solver(self.pbl, LinearSolver().pardiso()) - self.solver.nthreads = 1 - self.solver.restol = 1e-10 - self.solver.itmax = 1000 - -if __name__ == "__main__": - - # le gmsh ne doit pas etre fait par toutes les machines - if fe2.rank==0: - micro = Micro() - fe2.barrier() # ok uniqut sur 1node - - if fe2.rank==0: - law = fe2.FE2(micro) - macro = Macro(law) - master = fe2.Master(macro) - master.start() - else: - micro = Micro() - worker = fe2.Worker(micro) - worker.start() - -# if fe2.rank==0: -# x1,y1,T1 = u.getTemp(macro.solver,"Bottom", sort='x') -# -# u.simpleplot(x1, T1, xlabel='x [mm]', title='Temperature along x') -# -# tests = CTests() -# tests.add(CTest('mean(Tleft)', sum(T1)/len(T1), 4.683412, 1e-6)) -# tests.add(CTest('max(Tleft)', max(T1), 10.0)) -# tests.add(CTest('min(Tleft)', min(T1), 0.0)) -# tests.run() - - - diff --git a/heat/tests/fe2/heat_mpi.py b/heat/tests/fe2/heat_mpi.py deleted file mode 100755 index 7b2dc037..00000000 --- a/heat/tests/fe2/heat_mpi.py +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# test multiscale - version "task pull" -# linux: -# mpiexec.openmpi --bycore --bind-to-core -n 6 ./run.py heat/tests/fe2/heat_mpi.py -# windows (msmpi): -# mpiexec -n 6 python run.py heat\tests\fe2\heat_mpi.py - - -import heat as h -import heat.utils as u -import tbox -import tbox.gmsh as gmsh -from tbox.solvers import LinearSolver -import heat.fe2 as fe2 -from fwk.testing import * - -class Micro: - def __init__(self): - self.msh = gmsh.MeshLoader("micro.geo", __file__).execute() - self.gmshWriter = tbox.GmshExport(self.msh) - self.pbl = h.Problem(self.msh) - - self.pbl.add(h.Medium(self.msh, "Matrix", tbox.Fct2C(1.,1.,0), 1.0)) - self.pbl.add(h.Medium(self.msh, "Inclusion", tbox.Fct2C(100.,100.,0), 1.0)) - self.p = h.Periodic(self.pbl, 0.0, 0.0, 0.0) - self.pbl.add(self.p) - - self.solver = h.Solver(self.pbl, LinearSolver().pardiso()) - self.solver.nthreads = 1 - self.solver.save = False - self.solver.verbose = 0 - -class Macro: - def __init__(self, law): - self.msh = gmsh.MeshLoader("macro.geo", __file__).execute() - self.gmshWriter = tbox.GmshExport(self.msh) - self.pbl = h.Problem(self.msh) - - self.pbl.add(h.Medium(self.msh, "S1", law)) - self.pbl.add(h.Dirichlet(self.msh,"Left", 0.)) - self.pbl.add(h.Dirichlet(self.msh,"Right", 10.)) - - self.solver = h.Solver(self.pbl, LinearSolver().pardiso()) - self.solver.nthreads = 1 - self.solver.restol = 1e-6 - -if __name__ == "__main__": - - # le gmsh ne doit pas etre fait par toutes les machines - if fe2.rank==0: - micro = Micro() - fe2.barrier() # ok uniqut sur 1node - - if fe2.rank==0: - law = fe2.FE2(micro) - macro = Macro(law) - master = fe2.Master(macro) - master.start() - else: - micro = Micro() - worker = fe2.Worker(micro) - worker.start() - - if fe2.rank==0: - # extract some results - x1,y1,T1 = u.getTemp(macro.solver,"Bottom", sort='x') - - u.simpleplot(x1, T1, xlabel='x [mm]', title='Temperature along x') - - tests = CTests() - tests.add(CTest('mean(Tleft)', sum(T1) / len(T1), 4.683412, 2e-5)) - tests.add(CTest('max(Tleft)', max(T1), 10.0)) - tests.add(CTest('min(Tleft)', min(T1), 0.0)) - tests.run() - - - diff --git a/heat/tests/fe2/heat_mpi.sge.sh b/heat/tests/fe2/heat_mpi.sge.sh deleted file mode 100755 index d850c830..00000000 --- a/heat/tests/fe2/heat_mpi.sge.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash -# -# Your job name -#$ -N heat_mpi -# -# Use current working directory -#$ -cwd -# -# Join stdout and stderr -#$ -j y -# -# pe (Parallel environment) request. Set your number of processors here. -#$ -pe openmpi 12 -# -# Run job through bash shell -#$ -S /bin/bash -# -# Mail notifications -#$ -m beas -#$ -M boman -# -# Use this queue -#$ -q lomem.q -## If modules are needed, source modules environment: -#. /etc/profile.d/modules.sh -# Add any modules you might require: -#module add shared sge openmpi/gcc abaqus - -. ~/.bash_profile $SGE_O_HOST - -echo "Got $NSLOTS processors." - -module list -mpirun python ./run.py --nogui heat/tests/fe2/heat_mpi.py - diff --git a/heat/tests/fe2/heat_mpi.slurm.sh b/heat/tests/fe2/heat_mpi.slurm.sh deleted file mode 100755 index d1a5391e..00000000 --- a/heat/tests/fe2/heat_mpi.slurm.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -# Submission script for NIC4 -#SBATCH --job-name=heat_mpi -#SBATCH --time=00:40:00 # hh:mm:ss -# -#SBATCH --ntasks=4 -#SBATCH --mem-per-cpu=400 # megabytes -#SBATCH --partition=defq -# -#SBATCH --mail-user=rboman -#SBATCH --mail-type=ALL -# -#SBATCH --comment=math0471 -#SBATCH --output=heat_mpi.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -env | egrep ^SLURM -module list -mpirun --version - - -mpirun python-mpi heat_mpi.py -#mpirun -v --bind-to none --tag-output --report-bindings -d --display-allocation python-mpi heat_mpi.py - diff --git a/heat/tests/fe2/macro.geo b/heat/tests/fe2/macro.geo deleted file mode 100644 index 904403fb..00000000 --- a/heat/tests/fe2/macro.geo +++ /dev/null @@ -1,50 +0,0 @@ -// simple regularly-meshed square - -lc = 2; - -Lx = 10; -Ly = 10; - -Nx=3; -Ny=3; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { Lx, 0, 0, lc}; -Point(3) = { Lx, Ly, 0, lc}; -Point(4) = { 0, Ly, 0, lc}; - - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line Loop(1) = {1, 2, 3, 4}; - -Plane Surface(1) = {1}; - -/* -// regular mesh -Transfinite Line {1, 3} = Nx Using Progression 1; -Transfinite Line {4, 2} = Ny Using Progression 1; -Transfinite Surface {1}; -*/ - - -//Recombine Surface {1}; // for quads - - -Physical Point("P1") = {1}; -Physical Point("P2") = {2}; -Physical Point("P3") = {3}; -Physical Point("P4") = {4}; - - -Physical Line("Bottom") = {1}; -Physical Line("Right") = {2}; -Physical Line("Top") = {3}; -Physical Line("Left") = {4}; - -Physical Surface("S1") = {1}; - -Mesh.Algorithm = 5; // gmsh 4.5 change the default algo from Delaunay(5) to FrontalDelaunay (6). Force Delaunay for non regression tests \ No newline at end of file diff --git a/heat/tests/fe2/micro.geo b/heat/tests/fe2/micro.geo deleted file mode 100644 index 0555c587..00000000 --- a/heat/tests/fe2/micro.geo +++ /dev/null @@ -1,63 +0,0 @@ -// RVE - -Lx = 1.0e-3; -Ly = Lx; - -lc = Lx/10; - -ix = Lx/2; -iy = Ly/2; -iLx = 2*Lx/3; -iLy = 2*Lx/3; - -// -- outer boundary - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { Lx, 0, 0, lc}; -Point(3) = { Lx, Ly, 0, lc}; -Point(4) = { 0, Ly, 0, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line Loop(1) = {1, 2, 3, 4}; - -// -- inclusion - -Point(11) = { ix-iLx/2, iy-iLy/2, 0, lc}; -Point(12) = { ix+iLx/2, iy-iLy/2, 0, lc}; -Point(13) = { ix+iLx/2, iy+iLy/2, 0, lc}; -Point(14) = { ix-iLx/2, iy+iLy/2, 0, lc}; - -Line(11) = {11, 12}; -Line(12) = {12, 13}; -Line(13) = {13, 11}; -//Line(14) = {14, 11}; - -Line Loop(11) = {11, 12, 13};//, 14}; - -Plane Surface(11) = {11}; - -// -- matrix - -Plane Surface(1) = {1, 11}; - - -Physical Point("P1") = {1}; -Physical Point("P2") = {2}; -Physical Point("P3") = {3}; -Physical Point("P4") = {4}; - -Physical Line("Bottom") = {1}; -Physical Line("Right") = {2}; -Physical Line("Top") = {3}; -Physical Line("Left") = {4}; - -Physical Surface("Matrix") = {1}; -Physical Surface("Inclusion") = {11}; - -Mesh.Algorithm = 5; // gmsh 4.5 change the default algo from Delaunay(5) to FrontalDelaunay (6). Force Delaunay for non regression tests - - diff --git a/heat/tests/fe2/micro.py b/heat/tests/fe2/micro.py deleted file mode 100755 index 7ec064a1..00000000 --- a/heat/tests/fe2/micro.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# check the micro problem - -import heat as h -import heat.utils as u -import tbox -import tbox.gmsh as gmsh -from fwk.testing import * - -def main(TM, dTxM, dTyM): - msh = gmsh.MeshLoader("micro.geo", __file__).execute() - gmshWriter = tbox.GmshExport(msh) - pbl = h.Problem(msh) - - pbl.add(h.Medium(msh, "Matrix", tbox.Fct2C(1.,1.,0), 1.0)) - pbl.add(h.Medium(msh, "Inclusion", tbox.Fct2C(100.,100.,0), 1.0)) - p = h.Periodic(pbl, TM, dTxM, dTyM) - pbl.add(p) - - # solve problem - solver = u.solve(pbl, gmshWriter) - - # extract some results - tests = CTests() - tests.add(CTest('mean flux X', p.qM[0], -2.278200, 1e-4)) - tests.add(CTest('mean flux Y', p.qM[1], -2.278258, 1e-4)) - tests.run() - -if __name__ == "__main__": - TM = 1.0 - dTxM = 1.0 - dTyM = 1.0 - main(TM, dTxM, dTyM) diff --git a/heat/tests/nonlinear/mat2.geo b/heat/tests/nonlinear/mat2.geo deleted file mode 100644 index 0c0b3a28..00000000 --- a/heat/tests/nonlinear/mat2.geo +++ /dev/null @@ -1,72 +0,0 @@ -// 2 materials and a hole - -lc = 0.5; -Lx = 50; -Ly = 10; - - -ix = 8; -iy = 6; -DefineConstant[ iR = { 3.0, Min 0.5, Max 1.5, Step 0.1, Name "Lengths/iR" } ]; - -hx = Lx-8; -hy = Ly-6; -DefineConstant[ hR = { 3.0, Min 0.5, Max 1.5, Step 0.1, Name "Lengths/hR" } ]; - - -// -- outer boundary - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { Lx, 0, 0, lc}; -Point(3) = { Lx, Ly, 0, lc}; -Point(4) = { 0, Ly, 0, lc}; - - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line Loop(1) = {1, 2, 3, 4}; - - -// -- inclusion #1 -Point(11) = { ix-iR, iy, 0, lc}; -Point(12) = { ix, iy, 0, lc}; -Point(13) = { ix+iR, iy, 0, lc}; - -Circle(10) = {11, 12, 13}; -Circle(11) = {13, 12, 11}; - -Line Loop(11) = {11, 10}; -Plane Surface(11) = {11}; - -// -- inclusion #2 - -Point(21) = { hx-hR, hy, 0, lc}; -Point(22) = { hx, hy, 0, lc}; -Point(23) = { hx+hR, hy, 0, lc}; - -Circle(20) = {21, 22, 23}; -Circle(21) = {23, 22, 21}; - -Line Loop(21) = {21, 20}; -Plane Surface(21) = {21}; - -// -- matrix -Plane Surface(1) = {1, 11, 21}; - -Physical Point("P1") = {1}; -Physical Point("P2") = {2}; -Physical Point("P3") = {3}; -Physical Point("P4") = {4}; - -Physical Line("Bottom") = {1}; -Physical Line("Right") = {2}; -Physical Line("Top") = {3}; -Physical Line("Left") = {4}; - -Physical Surface("Matrix") = {1}; -Physical Surface("Inclusion") = {11, 21}; - - diff --git a/heat/tests/nonlinear/mat2vark.py b/heat/tests/nonlinear/mat2vark.py deleted file mode 100644 index 396dc994..00000000 --- a/heat/tests/nonlinear/mat2vark.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import heat as h -import heat.utils as u -import tbox -import tbox.gmsh as gmsh -from fwk.testing import * - -def main(**d): - - # default params - msh = gmsh.MeshLoader("mat2.geo",__file__).execute() - gmshWriter = tbox.GmshExport(msh) - pbl = h.Problem(msh) - - fa=tbox.PwLf() - fa.add(0, 100) - fa.add(150, 100) - fa.add(300, 100) - - fb=tbox.PwLf() - fb.add(0, 10) - fb.add(130, 10) - fb.add(170, 1000) - fb.add(300, 1000) - - fz = tbox.PwLf() - fz.add(0,0) - - pbl.add(h.Medium(msh, "Matrix", tbox.Fct2PwLf(fa,fa,fz))) - pbl.add(h.Medium(msh, "Inclusion", tbox.Fct2PwLf(fb,fb,fz))) - - pbl.add(h.Dirichlet(msh, "Left", 0.)) - pbl.add(h.Dirichlet(msh, "Right", 300.)) - - # solve problem - solver = u.solve(pbl, gmshWriter) - - # extract some results - x1,y1,T1 = u.getTemp(solver,"Top", sort='x') - - u.simpleplot(x1, T1, xlabel='x [mm]', title='Temperature along x') - - tests = CTests() - tests.add(CTest('mean(Ttop)', sum(T1) / len(T1), 169, 1., forceabs=True)) - tests.add(CTest('max(Ttop)', max(T1), 300)) - tests.add(CTest('min(Ttop)', min(T1), 0., refval=300)) - tests.run() - -if __name__ == "__main__": - main() diff --git a/heat/tests/periodic/honeycomb.py b/heat/tests/periodic/honeycomb.py deleted file mode 100755 index 3a868c19..00000000 --- a/heat/tests/periodic/honeycomb.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# test periodic BCs on a honeycomb structure - -import heat as h -import heat.utils as u -import tbox -import tbox.gmsh as gmsh -from fwk.testing import * - -class MyMaterial(tbox.Fct2U): - def __init__(self): - tbox.Fct2U.__init__(self) - def eval(self, u, k, fake): - t1 = -5. - t2 = 45. - k1 = 1. - k2 = 100. - k.resize(2, 2) - k[0,0] = k[1,1] = k1+(k2-k1)/(t2-t1)*(u-t1) - k[0,1] = k[1,0] = 0. - #k[0,0] = k[1,1] = k1 # simple case - #print "returning k=%f" %k - return k - -def main(): - # mesh a unit square - pars={ 'h' : 10. , 'k' : 1., 'lc' : 1. / 3.} - msh = gmsh.MeshLoader("../../models/honeycomb.geo",__file__).execute(**pars) - gmshWriter = tbox.GmshExport(msh) - pbl = h.Problem(msh) - - pbl.add(h.Medium(msh, "Hexagon", tbox.Fct2C(10,10,0), 1.0)) - f = MyMaterial() - pbl.add(h.Medium(msh, "Borders", f, 1.0)) - - TM = 20. - dTxM = 1. - dTyM = 1. - p = h.Periodic(pbl, TM, dTxM, dTyM) - pbl.add(p) - - # solve problem - solver = u.solve(pbl, gmshWriter) - - # extract some results - tests = CTests() - tests.add(CTest('mean flux X', p.qM[0], -12.6239, 1e-4)) - tests.add(CTest('mean flux Y', p.qM[1], -12.4904, 1e-4)) - tests.run() - - - - -if __name__ == "__main__": - main() diff --git a/heat/tests/periodic/lincomb.py b/heat/tests/periodic/lincomb.py deleted file mode 100755 index d5cbf01d..00000000 --- a/heat/tests/periodic/lincomb.py +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# calculate the conductivity matrix of a particular problem -# from the linear combination of 2 calculations (2 perpendicular gradients) -# then, checks if the resulting flux is the same as a direct calculation - -import heat as h -import heat.utils as u -import tbox -import tbox.gmsh as gmsh -import fwk -from fwk.testing import * - -class MyMaterial(tbox.Fct2XYZ): - """ - the considered conductivity is a function of the position (x,y) - """ - def __init__(self, k1, k2): - tbox.Fct2XYZ.__init__(self) - self.k1 = k1 - self.k2 = k2 - def eval(self, pt, k, fake): - x = pt[0] - y = pt[1] - L = 1. - import math - v = (self.k1+self.k2)/2 + abs(self.k2-self.k1)/2*math.sin(2*math.pi/L*4*(x+y/2)) - k.resize(2, 2) - k[0,0] = k[1,1] = v - k[0,1] = k[1,0] = 0. - #k[0,0] = self.k1 # constant - #k[1,1] = self.k2 - - -def solve(TM, dTxM, dTyM): - """ - solve one FE problem (for given mean values of T and gradT) - """ - pars={ 'Lx' : 1 , 'Ly' : 1, 'Nx' : 20, 'Ny' : 20} - msh = gmsh.MeshLoader("../../models/rect_stru.geo",__file__).execute(**pars) - gmshWriter = tbox.GmshExport(msh) - pbl = h.Problem(msh) - - myk = MyMaterial(1.,1000.) - pbl.add(h.Medium(msh, "S1", myk)) - - p = h.Periodic(pbl, TM, dTxM, dTyM) - pbl.add(p) - - # solve problem - solver = u.solve(pbl, gmshWriter) - - q1i = p.qM[0] - q2i = p.qM[1] - - return (q1i, q2i) - - -def main(): - - chrono = fwk.Timer(); chrono.start() - - # ------------- main problem ---------------------- - # ------------------------------------------------- - - TM0 = 0.0 - dTxM0 = 0.3 - dTyM0 = 0.2 - - q1i,q2i = solve(TM0, dTxM0, dTyM0) - print("flux along x dir = ", q1i) - print("flux along y dir = ", q2i) - - - # ------------- linear combination ---------------- - # ------------------------------------------------- - - TM = TM0 - dTxM = 1.0 # <= gradX =1 - dTyM = 0.0 - - K11,K21 = solve(TM, dTxM, dTyM) - print("flux along x dir = ", K11) - print("flux along y dir = ", K21) - - # ------------------------------------------------- - - TM = TM0 - dTxM = 0.0 - dTyM = 1.0 # <= gradY =1 - - K12,K22 = solve(TM, dTxM, dTyM) - print("flux along x dir = ", K12) - print("flux along y dir = ", K22) - - # ------------------------------------------------- - # try to calculate the first flux - # with the computed sensitivity matrix - # ------------------------------------------------- - - q1 = K11*dTxM0 + K12*dTyM0 - q2 = K21*dTxM0 + K22*dTyM0 - - print() - print("K=[[", K11, ",", K12,"]") - print(" [", K21, ",", K22,"]]\n") - - print("q (linear combination) =",q1,q2) - print("qi (direct calculation) =",q1i,q2i) - print(chrono) - - tests = CTests() - tests.add(CTest('q-qi (x)', abs(q1-q1i), 0.0, 1e-6)) - tests.add(CTest('q-qi (y)', abs(q2-q2i), 0.0, 1e-6)) - tests.run() - - - - -if __name__ == "__main__": - main() diff --git a/heat/tests/periodic/lincomb_fast.py b/heat/tests/periodic/lincomb_fast.py deleted file mode 100755 index c1b9677b..00000000 --- a/heat/tests/periodic/lincomb_fast.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# A NETTOYER - -import heat as h -import heat.utils as u -import tbox -import tbox.gmsh as gmsh -import fwk -from fwk.testing import * - -class MyF(tbox.Fct2XYZ): - def __init__(self, k1, k2): - tbox.Fct2XYZ.__init__(self) - self.k1 = k1 - self.k2 = k2 - - def eval(self, pt, k, fake): - x = pt[0] - y = pt[1] - L = 1. - import math - v = (self.k1+self.k2) / 2 + abs(self.k2-self.k1)/2*math.sin(2*math.pi/L*4*(x+y/2)) - k.resize(2, 2) - k[0,0] = k[1,1] = v; - """ - return (self.k1+self.k2)/2+ abs(self.k2-self.k1)/2*math.sin(2*math.pi/L*4*x)*math.sin(2*math.pi/L*4*y) - - if ((int(x/L*10))%2) ^ ((int(y/L*10))%2) ==1: - return self.k1 - else: - return self.k2 - """ - -def main(): - - chrono = fwk.Timer(); chrono.start() - from fwk.wutils import parseargs - args=parseargs() - - # main problem - msh = gmsh.MeshLoader("../../models/rect.geo", __file__).execute() - gmshWriter = tbox.GmshExport(msh) - pbl = h.Problem(msh) - - myk = h.CompiledFct1b(1., 1000.) - pbl.add(h.Medium(msh, "S1", myk)) - - TM = 0.0 - dTxM = 0.3 - dTyM = 0.2 - p = h.Periodic(pbl, TM, dTxM, dTyM) - pbl.add(p) - - solver = u.solve(pbl, gmshWriter) - - q1i = p.qM[0] - q2i = p.qM[1] - - # sensitivity - - p.reset(TM, 1.0, 0.0) - solver.start(gmshWriter) - K11 = p.qM[0] - K21 = p.qM[1] - if not args.nogui: - from heat.viewer import GUI - GUI().open(pbl.msh.name) - - p.reset(TM, 0.0, 1.0) - solver.start(gmshWriter) - K12 = p.qM[0] - K22 = p.qM[1] - if not args.nogui: - from heat.viewer import GUI - GUI().open(pbl.msh.name) - - # try to calculate the first flux with the computed sensitivity matrix - - q1 = K11*dTxM+K12*dTyM - q2 = K21*dTxM+K22*dTyM - print() - print("K=[[", -K11, ",", -K12,"]") - print(" [", -K21, ",", -K22,"]]") - print("q =", q1, q2) - print("qi =", q1i, q2i) - print() - chrono.stop() - print(chrono) - - tests = CTests() - tests.add(CTest('q-qi (x)', abs(q1-q1i), 0.0, 1e-6)) - tests.add(CTest('q-qi (y)', abs(q2-q2i), 0.0, 1e-6)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/heat/utils.py b/heat/utils.py deleted file mode 100644 index 29987fe3..00000000 --- a/heat/utils.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import tbox -import heat as h - -def solve(pbl, writer): - - from fwk.wutils import parseargs - args = parseargs() - - from tbox.solvers import LinearSolver - solver = h.Solver(pbl, LinearSolver().pardiso()) - solver.nthreads = args.k - solver.restol = 1e-6 - solver.start(writer) - - if not args.nogui: - from heat.viewer import GUI - GUI().open( pbl.msh.name ) - - return solver - -def getTemp(solver, linelabel="Bottom", sort='x'): - """ - extract x,y,T on a line & return 3 numpy arrays - """ - nodes_bot = tbox.Group(solver.pbl.msh, linelabel) - extr = h.Extractor(solver, nodes_bot) - - import numpy as np - v = np.array(extr.execute()) - - nos = np.zeros_like(v, dtype=np.int) - nxs = np.zeros_like(v) - nys = np.zeros_like(v) - for i in range(len(v)): - n = extr.nodes[i] - nos[i] = n.no - nxs[i] = n.pos[0] - nys[i] = n.pos[1] - if sort=='x': - iis = np.argsort(nxs) - else: - iis = np.argsort(nys) - return (nxs[iis], nys[iis], v[iis]) - - -def simpleplot(x, y, xlabel='x',title=''): - - # plot results using matplotlib - from fwk.wutils import parseargs - args = parseargs() - if not args.nogui: - import matplotlib.pyplot as plt - plt.plot(x, y, 'bo-',lw=2) - plt.xlabel(xlabel) - #plt.ylim(0,150) - plt.title(title) - plt.grid(True) - plt.show() - - diff --git a/heat/viewer.py b/heat/viewer.py deleted file mode 100644 index c6b48f4b..00000000 --- a/heat/viewer.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import os, os.path - -class GUI: - def __init__(self): - pass - def open(self,prefix): - mshfile = prefix+".msh" - if not os.path.isfile(mshfile): - raise Exception("file not found %s" % mshfile) - posfile = prefix+".pos" - if not os.path.isfile(posfile): - raise Exception("file not found %s" % posfile) - optfile = prefix+".opt" - if not os.path.isfile(optfile): - self.defopt(optfile) - cmd="gmsh %s %s %s" % (mshfile, posfile, optfile) - os.system(cmd) - - def defopt(self,fname='heat.opt'): - f = open(fname,'w') - f.write("General.Orthographic = 0;\n") - f.write("View[0].Visible = 1;\n") - f.write("View[0].IntervalsType = 3; // filled iso\n") - for i in range(1,10): - f.write("View[%d].Visible = 0;\n" % i) - f.write("View[8].TensorType = 4;\n") - f.write("View[8].VectorType = 1;\n") - f.write("View[8].ArrowSizeMax = 20;\n") - f.write("//View[8].ExternalView = 8;\n") - f.close() - diff --git a/katoptron/CMAME/MG/beam.geo b/katoptron/CMAME/MG/beam.geo deleted file mode 100644 index df548c67..00000000 --- a/katoptron/CMAME/MG/beam.geo +++ /dev/null @@ -1,81 +0,0 @@ -SetFactory("OpenCASCADE"); -If(GMSH_MAJOR_VERSION!=3 || GMSH_MINOR_VERSION!=0 || GMSH_PATCH_VERSION!=6) - Printf("gmsh %g.%g.%g is not supported by this .geo",GMSH_MAJOR_VERSION,GMSH_MINOR_VERSION,GMSH_PATCH_VERSION); -Else - LX = 10; - LY = 10; - lx2 = 2; - ly1 = 2; - ly2 = 7; - LZ = 1; - - lc = 0.1; - - nX1 = 5; - nY1 = 3; - nX2 = 3; - nX3 = 4; - nY2 = 6; - nZ = 1; - - Point(1) = { 0., LY-ly1, 0., lc}; - Point(2) = { 0., LY, 0., lc}; - Point(3) = { LX-lx2, LY, 0., lc}; - Point(4) = { LX-lx2, LY-ly1, 0., lc}; - Point(5) = { LX, LY, 0., lc}; - Point(6) = { LX, LY-ly1, 0., lc}; - - Point(7) = { LX-lx2, 0., 0., lc}; - Point(8) = { LX-lx2, ly2, 0., lc}; - Point(9) = { LX, ly2, 0., lc}; - Point(10) = { LX, 0., 0., lc}; - - Line(1) = {1, 2}; - Line(2) = {2, 3}; - Line(3) = {3, 4}; - Line(4) = {4, 1}; - Line(5) = {3, 5}; - Line(6) = {5, 6}; - Line(7) = {6, 4}; - - Line(8) = {7, 8}; - Line(9) = {8, 9}; - Line(10) = {9, 10}; - Line(11) = {10, 7}; - - Transfinite Line {1, 3, 6} = nY1 Using Progression 1; - Transfinite Line {2, 4} = nX1 Using Progression 1; - Transfinite Line {5, 7} = nX3 Using Progression 1; - - Transfinite Line {8, 10} = nY2 Using Progression 1; - Transfinite Line {9, 11} = nX2 Using Progression 1; - - Line Loop(9) = {1, 2, 3, 4}; - Plane Surface(9) = {9}; - Transfinite Surface {9}; - Recombine Surface {9}; - - Line Loop(10) = {-3, 5, 6, 7}; - Plane Surface(10) = {10}; - Transfinite Surface {10}; - Recombine Surface {10}; - - Line Loop(12) = {8, 9, 10, 11}; - Plane Surface(12) = {12}; - Transfinite Surface {12}; - Recombine Surface {12}; - - Extrude {0, 0, LZ} - { - Surface{9,10,12}; Layers{nZ}; Recombine; - } - - Physical Volume("body") = {1,2,3}; - - Physical Surface("load 1") = {14}; - Physical Surface("load 2") = {20}; - Physical Surface("clamped 1") = {13}; - Physical Surface("clamped 2") = {25}; - Physical Surface("conctact 1") = {18}; - Physical Surface("conctact 2") = {23}; -EndIf diff --git a/katoptron/CMAME/MG/beam.py b/katoptron/CMAME/MG/beam.py deleted file mode 100644 index 3dc43478..00000000 --- a/katoptron/CMAME/MG/beam.py +++ /dev/null @@ -1,240 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - - - - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_beam_test(msh, comm, test_case): - - directory = str(test_case) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - work_dir = os.getcwd() - args = parseargs() - - pbl = m.Problem(msh, comm) - - ensemble_size = 1 - - # Units are in mm - E = 70000 * np.ones(ensemble_size) # 70e9 Pa = 70000 MPa - nu = 0.35 * np.ones(ensemble_size) - k = 0. - d = 0. - m.Medium(pbl, "body", "test", E, nu, k, d) - - m.Dirichlet(pbl, "clamped 1", "Clamped", 1, 0., 1, 0., 1, 0., 0, 0., - ensemble_size) - m.Dirichlet(pbl, "clamped 2", "Clamped", 1, 0., 1, 0., 1, 0., 0, 0., - ensemble_size) - - f = 70 * np.ones(ensemble_size) # 700e6 Pa = 700 MPa - zero = np.zeros(ensemble_size) - one = np.ones(ensemble_size) - m.Neumann(pbl, 'load 1', 'load', 0, zero, 1, -f, 0, zero, 0, one, - ensemble_size) - m.Neumann(pbl, 'load 2', 'load', 0, zero, 1, -f, 0, zero, 0, one, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Ensemble Convergence Tolerance'] = 1e-8 - solverList['Maximum Iterations'] = 200 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - if test_case == 1: - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 3 - mueluParams['max levels'] = 1 - mueluParams['coarse: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 3 - mueluParamsSub2['relaxation: damping factor'] = 0.75 - - mueluParams['verbosity'] = "high" - - mueluParams['coarse: params'] = mueluParamsSub2 - - solverList['mueluParams'] = mueluParams - - elif test_case == 2: - file_dir = os.path.dirname(__file__) - muelu_xml_in = file_dir + '/../../preconditioners/gs_lvl.xml.in' - - old_strings = ['$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_00_GS_damping', - '$SCHUR_omega', '$SimpleSmoother_damping', "$N_LVLS", "$N_SIZES", "$EXPORT_DATA"] - new_strings = [ - '3', - '3', - '3', - '0.75', - '1', - '1', - '2', - '18', - "true" - ] - u.replace_strings(muelu_xml_in, work_dir + '/gs.xml', - old_strings, new_strings) - solverList['use xml file'] = True - solverList['MueLu xml file name'] = work_dir + '/gs.xml' - - elif test_case == 2.5: - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 3 - mueluParams['max levels'] = 2 - mueluParams['smoother: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "MT Gauss-Seidel" - mueluParamsSub2['relaxation: type'] = "Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 3 - mueluParamsSub2['relaxation: damping factor'] = 0.75 - - mueluParams['verbosity'] = "high" - mueluParams['smoother: params'] = mueluParamsSub2 - mueluParams['coarse: type'] = "Klu" - mueluParams['coarse: max size'] = 18 - #mueluParams['aggregation: min agg size'] = 5 - #mueluParams['aggregation: max selected neighbors'] = 1 - mueluParams['aggregation: export visualization data'] = True - exportdata = Teuchos.ParameterList() - exportdata['A'] = '{0,1}' - exportdata['P'] = '{0}' - exportdata['R'] = '{0}' - exportdata['Aggregates'] = '{0}' - mueluParams['export data'] = exportdata - solverList['mueluParams'] = mueluParams - - else: - norm = tbox.Vector3d(0, 1, 0) - cont = m.Contact(pbl, "conctact 1", "contact", norm) - cont.setInitialyOpen() - cont.setNoUpdate() - if test_case == 4 or test_case == 6: - cont.setSticking() - cont.setMaster(pbl, "conctact 2", norm) - - file_dir = os.path.dirname(__file__) - - if test_case == 3 or test_case == 4: - muelu_xml_in = file_dir + '/../../preconditioners/SIMPLE_gs_direct.xml.in' - - old_strings = ['$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_00_GS_damping', - '$SCHUR_omega', '$SimpleSmoother_damping'] - if test_case == 4: - new_strings = [ - '3', - '3', - '3', - '0.75', - '1', - '1' - ] - else: - new_strings = [ - '3', - '1', - '3', - '0.75', - '1', - '1' - ] - else: - muelu_xml_in = file_dir + '/../../preconditioners/SIMPLE_gs_direct_lvl.xml.in' - - old_strings = ['$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_00_GS_damping', - '$SCHUR_omega', '$SimpleSmoother_damping', "$N_LVLS", "$N_SIZES", "$EXPORT_DATA"] - if test_case == 6: - new_strings = [ - '3', - '3', - '3', - '0.75', - '1', - '1', - '2', - '18', - "true" - ] - else: - new_strings = [ - '3', - '1', - '3', - '0.75', - '1', - '1', - '2', - '18', - "true" - ] - u.replace_strings(muelu_xml_in, work_dir + '/SIMPLE_gs_direct.xml', - old_strings, new_strings) - solverList['MueLu xml file name'] = work_dir + '/SIMPLE_gs_direct.xml' - - solverList['convert MueLu xml file'] = True - solverList['Create Preconditioned Matrix'] = True - - solverList['Print Teuchos timers'] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = 'BlockGmres' - solverList['Maximum active set iteration'] = 1 - - solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - slv = m.IterativeSolver(pbl, args.k, solverList, 3, ensemble_size) - slv.start() - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - os.chdir('..') - - -def main(): - comm, rank, size = m.utilities.import_MPI() - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = gmsh.MeshLoader('beam.geo', file_dir).execute() - - for i in range(1, 7): - evaluate_beam_test(msh, comm, i) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/MG/post.py b/katoptron/CMAME/MG/post.py deleted file mode 100644 index 405eab92..00000000 --- a/katoptron/CMAME/MG/post.py +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - -from katoptron.eigenvalues import * -from katoptron.readers import * -import os -import fwk - -import vtk -import tboxVtk -import tboxVtk.reader as vtkR -import tboxVtk.cutter as vtkC - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - display = False - - input_file_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_MG_beam_12/' - - filename_A_1 = input_file_dir + '1/Applied_Matrix_mm.txt' - filename_A_2 = input_file_dir + '2/Applied_Matrix_mm.txt' - filename_A_3 = input_file_dir + '3/Applied_Matrix_mm.txt' - filename_A_4 = input_file_dir + '4/Applied_Matrix_mm.txt' - filename_A_5 = input_file_dir + '5/Applied_Matrix_mm.txt' - filename_A_6 = input_file_dir + '6/Applied_Matrix_mm.txt' - - filename_AQ_1 = input_file_dir + '1/Applied_Preconditioned_Matrix_mm.txt' - filename_AQ_2 = input_file_dir + '2/Applied_Preconditioned_Matrix_mm.txt' - filename_AQ_3 = input_file_dir + '3/Applied_Preconditioned_Matrix_mm.txt' - filename_AQ_4 = input_file_dir + '4/Applied_Preconditioned_Matrix_mm.txt' - filename_AQ_5 = input_file_dir + '5/Applied_Preconditioned_Matrix_mm.txt' - filename_AQ_6 = input_file_dir + '6/Applied_Preconditioned_Matrix_mm.txt' - - filename_Q_1 = input_file_dir + '1/Applied_Preconditioner_mm.txt' - filename_Q_2 = input_file_dir + '2/Applied_Preconditioner_mm.txt' - filename_Q_3 = input_file_dir + '3/Applied_Preconditioner_mm.txt' - filename_Q_4 = input_file_dir + '4/Applied_Preconditioner_mm.txt' - filename_Q_5 = input_file_dir + '5/Applied_Preconditioner_mm.txt' - filename_Q_6 = input_file_dir + '6/Applied_Preconditioner_mm.txt' - - filename_b = input_file_dir + '1/b_mm_after_bc.txt' - - b = read_mm(filename_b, is_sparse=False) - - Q_1 = read_mm(filename_Q_1, is_sparse=False) - Q_2 = read_mm(filename_Q_2, is_sparse=False) - Q_3 = read_mm(filename_Q_3, is_sparse=False) - Q_4 = read_mm(filename_Q_4, is_sparse=False) - Q_5 = read_mm(filename_Q_5, is_sparse=False) - Q_6 = read_mm(filename_Q_6, is_sparse=False) - - b_1 = np.zeros((Q_1.shape[0],)) - b_2 = np.zeros((Q_2.shape[0],)) - b_3 = np.zeros((Q_3.shape[0],)) - b_4 = np.zeros((Q_4.shape[0],)) - b_5 = np.zeros((Q_5.shape[0],)) - b_6 = np.zeros((Q_6.shape[0],)) - - b_1[0:len(b)] = b - b_2[0:len(b)] = b - b_3[0:len(b)] = b - b_4[0:len(b)] = b - b_5[0:len(b)] = b - b_6[0:len(b)] = b - - x_1 = np.zeros((len(b_1),)) - x_2 = np.zeros((len(b_2),)) - x_3 = np.zeros((len(b_3),)) - x_4 = np.zeros((len(b_4),)) - x_5 = np.zeros((len(b_5),)) - x_6 = np.zeros((len(b_6),)) - - A_1 = read_mm(filename_A_1, is_sparse=False) - A_2 = read_mm(filename_A_2, is_sparse=False) - A_3 = read_mm(filename_A_3, is_sparse=False) - A_4 = read_mm(filename_A_4, is_sparse=False) - A_5 = read_mm(filename_A_5, is_sparse=False) - A_6 = read_mm(filename_A_6, is_sparse=False) - - r_1 = A_1.dot(x_1) - b_1 - r_2 = A_2.dot(x_2) - b_2 - r_3 = A_3.dot(x_3) - b_3 - r_4 = A_4.dot(x_4) - b_4 - r_5 = A_5.dot(x_5) - b_5 - r_6 = A_6.dot(x_6) - b_6 - - AQ_1 = read_mm(filename_AQ_1, is_sparse=False) - AQ_2 = read_mm(filename_AQ_2, is_sparse=False) - AQ_3 = read_mm(filename_AQ_3, is_sparse=False) - AQ_4 = read_mm(filename_AQ_4, is_sparse=False) - AQ_5 = read_mm(filename_AQ_5, is_sparse=False) - AQ_6 = read_mm(filename_AQ_6, is_sparse=False) - - plt.figure() - plt.plot(Q_2.dot(r_2)) - plt.plot(Q_5.dot(r_5)) - plt.figure() - tmp = Q_5.dot(r_5) - tmp[0:len(r_2)] = tmp[0:len(r_2)] - Q_2.dot(r_2) - plt.plot(tmp) - # plt.plot(Q_2.dot(r_2)) - - # plt.plot(Q_4.dot(r_4)) - # plt.figure() - # plt.spy(A_1) - # plt.figure() - # plt.spy(A_3) - plt.figure() - plt.spy(Q_2, precision=1e-8) - plt.figure() - plt.spy(Q_5, precision=1e-8) - plt.figure() - tmp = Q_5 - tmp[0:252, 0:252] = tmp[0:252, 0:252] - Q_2 - plt.spy(tmp, precision=1e-8) - - plt.figure() - tmp = A_5 - tmp[0:252, 0:252] = tmp[0:252, 0:252] - A_2 - plt.spy(tmp, precision=1e-8) - - tmp = np.abs(A_1.flatten()) - print(np.min(tmp[tmp != 0.])) - tmp = np.abs(A_3.flatten()) - print(np.min(tmp[tmp != 0.])) - - plt.figure() - tmp = AQ_5 - tmp[0:252, 0:252] = tmp[0:252, 0:252] - AQ_2 - plt.spy(tmp, precision=1e-8) - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/__init__.py b/katoptron/CMAME/__init__.py deleted file mode 100644 index 0129f367..00000000 --- a/katoptron/CMAME/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8; -*- diff --git a/katoptron/CMAME/mesh/plate.geo b/katoptron/CMAME/mesh/plate.geo deleted file mode 100644 index d157a23f..00000000 --- a/katoptron/CMAME/mesh/plate.geo +++ /dev/null @@ -1,86 +0,0 @@ -SetFactory("OpenCASCADE"); -If(GMSH_MAJOR_VERSION<=3 && GMSH_MINOR_VERSION<=0 && GMSH_PATCH_VERSION<=6) - Printf("gmsh %g.%g.%g is not supported by this .geo",GMSH_MAJOR_VERSION,GMSH_MINOR_VERSION,GMSH_PATCH_VERSION); -Else - LX = 10; - LY = 10; - LZ = 1; - - CX = LX/2; - CY = LY/2; - - R = 2; - dR = 0; - - nT = 40; - nZ = 3; - ndR = 20; - - PI = Acos (-1.); - - lc = 1; - - Point(201) = { CX, CY, 0., lc}; - - Point(202) = { CX+(R+dR)*Cos(1*PI/4), CY+(R+dR)*Sin(1*PI/4), 0., lc}; - Point(203) = { CX+(R+dR)*Cos(3*PI/4), CY+(R+dR)*Sin(3*PI/4), 0., lc}; - Point(204) = { CX+(R+dR)*Cos(5*PI/4), CY+(R+dR)*Sin(5*PI/4), 0., lc}; - Point(205) = { CX+(R+dR)*Cos(7*PI/4), CY+(R+dR)*Sin(7*PI/4), 0., lc}; - - Point(206) = { LX, LY, 0., lc}; - Point(207) = { 0., LY, 0., lc}; - Point(208) = { 0., 0., 0., lc}; - Point(209) = { LX, 0., 0., lc}; - - Circle(2101) = {202, 201, 203}; - Circle(2102) = {203, 201, 204}; - Circle(2103) = {204, 201, 205}; - Circle(2104) = {205, 201, 202}; - - Line(2105) = {206, 207}; - Line(2106) = {207, 208}; - Line(2107) = {208, 209}; - Line(2108) = {209, 206}; - - Line(2201) = {202, 206}; - Line(2202) = {203, 207}; - Line(2203) = {204, 208}; - Line(2204) = {205, 209}; - - Transfinite Line {2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108} = nT Using Progression 1; - Transfinite Line {2201, 2202, 2203, 2204} = ndR Using Progression 1; - - Line Loop(201) = {2101, 2202, -2105, -2201}; - Plane Surface(201) = {201}; - Transfinite Surface {201}; - Recombine Surface {201}; - - Line Loop(202) = {2202, 2106, -2203, -2102}; - Plane Surface(202) = {202}; - Transfinite Surface {202}; - Recombine Surface {202}; - - Line Loop(203) = {2103, 2204, -2107, -2203}; - Plane Surface(203) = {203}; - Transfinite Surface {203}; - Recombine Surface {203}; - - Line Loop(204) = {2104, 2201, -2108, -2204}; - Plane Surface(204) = {204}; - Transfinite Surface {204}; - Recombine Surface {204}; - - Extrude {0, 0, LZ} - { - Surface{201,202,203,204}; Layers{nZ}; Recombine; - } - - Physical Volume("body") = {1,2,3,4}; - //+ - Physical Surface("outer part boundary") = {205,212,214,218}; - Physical Surface("load 1") = {207}; - Physical Surface("load 2") = {216}; - Physical Point("clamped xyz") = {214}; - Physical Point("clamped xy") = {208}; - Physical Point("clamped y") = {217}; -EndIf diff --git a/katoptron/CMAME/mesh/plate_1.geo b/katoptron/CMAME/mesh/plate_1.geo deleted file mode 100644 index 719e836d..00000000 --- a/katoptron/CMAME/mesh/plate_1.geo +++ /dev/null @@ -1,81 +0,0 @@ -SetFactory("OpenCASCADE"); -If(GMSH_MAJOR_VERSION<=3 && GMSH_MINOR_VERSION<=0 && GMSH_PATCH_VERSION<6) - Printf("gmsh %g.%g.%g is not supported by this .geo",GMSH_MAJOR_VERSION,GMSH_MINOR_VERSION,GMSH_PATCH_VERSION); -Else - LX = 10; - LY = 10; - LZ = 1; - - CX = LX/2; - CY = LY/2; - - R = 2; - dR = 1; - - nT = 30; - nZ = 5; - ndR = 10; - - PI = Acos (-1.); - - lc = 1; - - Point(1) = { CX, CY, 0., lc}; - Point(2) = { CX+R*Cos(1*PI/4), CY+R*Sin(1*PI/4), 0., lc}; - Point(3) = { CX+R*Cos(3*PI/4), CY+R*Sin(3*PI/4), 0., lc}; - Point(4) = { CX+R*Cos(5*PI/4), CY+R*Sin(5*PI/4), 0., lc}; - Point(5) = { CX+R*Cos(7*PI/4), CY+R*Sin(7*PI/4), 0., lc}; - - Point(6) = { CX+(R+dR)*Cos(1*PI/4), CY+(R+dR)*Sin(1*PI/4), 0., lc}; - Point(7) = { CX+(R+dR)*Cos(3*PI/4), CY+(R+dR)*Sin(3*PI/4), 0., lc}; - Point(8) = { CX+(R+dR)*Cos(5*PI/4), CY+(R+dR)*Sin(5*PI/4), 0., lc}; - Point(9) = { CX+(R+dR)*Cos(7*PI/4), CY+(R+dR)*Sin(7*PI/4), 0., lc}; - - Circle(101) = {2, 1, 3}; - Circle(102) = {3, 1, 4}; - Circle(103) = {4, 1, 5}; - Circle(104) = {5, 1, 2}; - - Circle(105) = {6, 1, 7}; - Circle(106) = {7, 1, 8}; - Circle(107) = {8, 1, 9}; - Circle(108) = {9, 1, 6}; - - Line(201) = {2, 6}; - Line(202) = {3, 7}; - Line(203) = {4, 8}; - Line(204) = {5, 9}; - - Transfinite Line {101, 102, 103, 104, 105, 106, 107, 108} = nT Using Progression 1; - Transfinite Line {201, 202, 203, 204} = ndR Using Progression 1; - - Line Loop(1) = {101, 202, -105, -201}; - Plane Surface(1) = {1}; - Transfinite Surface {1}; - Recombine Surface {1}; - - Line Loop(2) = {202, 106, -203, -102}; - Plane Surface(2) = {2}; - Transfinite Surface {2}; - Recombine Surface {2}; - - Line Loop(3) = {103, 204, -107, -203}; - Plane Surface(3) = {3}; - Transfinite Surface {3}; - Recombine Surface {3}; - - Line Loop(4) = {104, 201, -108, -204}; - Plane Surface(4) = {4}; - Transfinite Surface {4}; - Recombine Surface {4}; - - Extrude {0, 0, LZ} - { - Surface{1,2,3,4}; Layers{nZ}; Recombine; - } - Physical Volume("body") = {1,2,3,4}; - //+ - Physical Surface("inner part boundary") = {7,10,16,19}; - //+ - Physical Surface("inner boundary") = {12, 5, 18, 14}; -EndIf diff --git a/katoptron/CMAME/mesh/plate_2.geo b/katoptron/CMAME/mesh/plate_2.geo deleted file mode 100644 index 9b35b6d8..00000000 --- a/katoptron/CMAME/mesh/plate_2.geo +++ /dev/null @@ -1,86 +0,0 @@ -SetFactory("OpenCASCADE"); -If(GMSH_MAJOR_VERSION<=3 && GMSH_MINOR_VERSION<=0 && GMSH_PATCH_VERSION<6) - Printf("gmsh %g.%g.%g is not supported by this .geo",GMSH_MAJOR_VERSION,GMSH_MINOR_VERSION,GMSH_PATCH_VERSION); -Else - LX = 10; - LY = 10; - LZ = 1; - - CX = LX/2; - CY = LY/2; - - R = 2; - dR = 1; - - nT = 20; - nZ = 3; - ndR = 10; - - PI = Acos (-1.); - - lc = 1; - - Point(201) = { CX, CY, 0., lc}; - - Point(202) = { CX+(R+dR)*Cos(1*PI/4), CY+(R+dR)*Sin(1*PI/4), 0., lc}; - Point(203) = { CX+(R+dR)*Cos(3*PI/4), CY+(R+dR)*Sin(3*PI/4), 0., lc}; - Point(204) = { CX+(R+dR)*Cos(5*PI/4), CY+(R+dR)*Sin(5*PI/4), 0., lc}; - Point(205) = { CX+(R+dR)*Cos(7*PI/4), CY+(R+dR)*Sin(7*PI/4), 0., lc}; - - Point(206) = { LX, LY, 0., lc}; - Point(207) = { 0., LY, 0., lc}; - Point(208) = { 0., 0., 0., lc}; - Point(209) = { LX, 0., 0., lc}; - - Circle(2101) = {202, 201, 203}; - Circle(2102) = {203, 201, 204}; - Circle(2103) = {204, 201, 205}; - Circle(2104) = {205, 201, 202}; - - Line(2105) = {206, 207}; - Line(2106) = {207, 208}; - Line(2107) = {208, 209}; - Line(2108) = {209, 206}; - - Line(2201) = {202, 206}; - Line(2202) = {203, 207}; - Line(2203) = {204, 208}; - Line(2204) = {205, 209}; - - Transfinite Line {2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108} = nT Using Progression 1; - Transfinite Line {2201, 2202, 2203, 2204} = ndR Using Progression 1; - - Line Loop(201) = {2101, 2202, -2105, -2201}; - Plane Surface(201) = {201}; - Transfinite Surface {201}; - Recombine Surface {201}; - - Line Loop(202) = {2202, 2106, -2203, -2102}; - Plane Surface(202) = {202}; - Transfinite Surface {202}; - Recombine Surface {202}; - - Line Loop(203) = {2103, 2204, -2107, -2203}; - Plane Surface(203) = {203}; - Transfinite Surface {203}; - Recombine Surface {203}; - - Line Loop(204) = {2104, 2201, -2108, -2204}; - Plane Surface(204) = {204}; - Transfinite Surface {204}; - Recombine Surface {204}; - - Extrude {0, 0, LZ} - { - Surface{201,202,203,204}; Layers{nZ}; Recombine; - } - - Physical Volume("body") = {1,2,3,4}; - //+ - Physical Surface("outer part boundary") = {205,212,214,218}; - Physical Surface("load 1") = {207}; - Physical Surface("load 2") = {216}; - Physical Point("clamped xyz") = {214}; - Physical Point("clamped xy") = {208}; - Physical Point("clamped y") = {217}; -EndIf diff --git a/katoptron/CMAME/mesh/plate_2_extended.geo b/katoptron/CMAME/mesh/plate_2_extended.geo deleted file mode 100644 index 130383a3..00000000 --- a/katoptron/CMAME/mesh/plate_2_extended.geo +++ /dev/null @@ -1,174 +0,0 @@ -SetFactory("OpenCASCADE"); -If(GMSH_MAJOR_VERSION<=3 && GMSH_MINOR_VERSION<=0 && GMSH_PATCH_VERSION<6) - Printf("gmsh %g.%g.%g is not supported by this .geo",GMSH_MAJOR_VERSION,GMSH_MINOR_VERSION,GMSH_PATCH_VERSION); -Else - LX = 10; - LY = 10; - LZ = 1; - - NX = 4; - NY = 4; - - CX = LX/2; - CY = LY/2; - - R = 2; - dR = 1; - - nT = 20; - nZ = 3; - ndR = 10; - - PI = Acos (-1.); - - lc = 1; - - Point(201) = { CX, CY, 0., lc}; - - Point(202) = { CX+(R+dR)*Cos(1*PI/4), CY+(R+dR)*Sin(1*PI/4), 0., lc}; - Point(203) = { CX+(R+dR)*Cos(3*PI/4), CY+(R+dR)*Sin(3*PI/4), 0., lc}; - Point(204) = { CX+(R+dR)*Cos(5*PI/4), CY+(R+dR)*Sin(5*PI/4), 0., lc}; - Point(205) = { CX+(R+dR)*Cos(7*PI/4), CY+(R+dR)*Sin(7*PI/4), 0., lc}; - - Point(206) = { LX, LY, 0., lc}; - Point(207) = { 0., LY, 0., lc}; - Point(208) = { 0., 0., 0., lc}; - Point(209) = { LX, 0., 0., lc}; - - Circle(2101) = {202, 201, 203}; - Circle(2102) = {203, 201, 204}; - Circle(2103) = {204, 201, 205}; - Circle(2104) = {205, 201, 202}; - - Line(2105) = {206, 207}; - Line(2106) = {207, 208}; - Line(2107) = {208, 209}; - Line(2108) = {209, 206}; - - Line(2201) = {202, 206}; - Line(2202) = {203, 207}; - Line(2203) = {204, 208}; - Line(2204) = {205, 209}; - - Point(301) = { -NX*LX, NY*LY+LY, 0., lc}; - Point(302) = { 0, NY*LY+LY, 0., lc}; - Point(303) = { -NX*LX, LY, 0., lc}; - - Line(311) = {301, 302}; - Line(312) = {302, 207}; - Line(313) = {207, 303}; - Line(314) = {303, 301}; - - Point(501) = { LX, NY*LY+LY, 0., lc}; - Point(502) = { LX+NX*LX, NY*LY+LY, 0., lc}; - Point(503) = { LX+NX*LX, LY, 0., lc}; - - Line(511) = {501, 502}; - Line(512) = {502, 503}; - Line(513) = {503, 206}; - Line(514) = {206, 501}; - - Point(801) = { -NX*LX, 0, 0., lc}; - Point(802) = { 0, -NY*LY, 0., lc}; - Point(803) = { -NX*LX, -NY*LY, 0., lc}; - - Line(811) = {801, 208}; - Line(812) = {208, 802}; - Line(813) = {802, 803}; - Line(814) = {803, 801}; - - Point(1001) = { LX+NX*LX, 0, 0., lc}; - Point(1002) = { LX+NX*LX, -NY*LY, 0., lc}; - Point(1003) = { LX, -NY*LY, 0., lc}; - - Line(1011) = {209, 1001}; - Line(1012) = {1001, 1002}; - Line(1013) = {1002, 1003}; - Line(1014) = {1003, 209}; - - Line(411) = {302, 501}; - Line(611) = {801, 303}; - Line(711) = {503, 1001}; - Line(911) = {1003, 802}; - - Transfinite Line {2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 411, 611, 711, 911} = nT Using Progression 1; - Transfinite Line {2201, 2202, 2203, 2204} = ndR Using Progression 1; - Transfinite Line {311,511,313,513,811,1011,813,1013} = NX*nT Using Progression 1; - Transfinite Line {314,814,312,812,514,1014,512,1012} = NY*nT Using Progression 1; - - Line Loop(201) = {2101, 2202, -2105, -2201}; - Plane Surface(201) = {201}; - Transfinite Surface {201}; - Recombine Surface {201}; - - Line Loop(202) = {2202, 2106, -2203, -2102}; - Plane Surface(202) = {202}; - Transfinite Surface {202}; - Recombine Surface {202}; - - Line Loop(203) = {2103, 2204, -2107, -2203}; - Plane Surface(203) = {203}; - Transfinite Surface {203}; - Recombine Surface {203}; - - Line Loop(204) = {2104, 2201, -2108, -2204}; - Plane Surface(204) = {204}; - Transfinite Surface {204}; - Recombine Surface {204}; - - Line Loop(205) = {311, 312, 313, 314}; - Plane Surface(205) = {205}; - Transfinite Surface {205}; - Recombine Surface {205}; - - Line Loop(206) = {511, 512, 513, 514}; - Plane Surface(206) = {206}; - Transfinite Surface {206}; - Recombine Surface {206}; - - Line Loop(207) = {811, 812, 813, 814}; - Plane Surface(207) = {207}; - Transfinite Surface {207}; - Recombine Surface {207}; - - Line Loop(208) = {1011, 1012, 1013, 1014}; - Plane Surface(208) = {208}; - Transfinite Surface {208}; - Recombine Surface {208}; - - Line Loop(209) = {411, -514, 2105, -312}; - Plane Surface(209) = {209}; - Transfinite Surface {209}; - Recombine Surface {209}; - - Line Loop(210) = {-313, 2106, -811, 611}; - Plane Surface(210) = {210}; - Transfinite Surface {210}; - Recombine Surface {210}; - - Line Loop(1211) = {-513, 711, -1011, 2108}; - Plane Surface(1211) = {1211}; - Transfinite Surface {1211}; - Recombine Surface {1211}; - - Line Loop(2212) = {2107, -1014, 911, -812}; - Plane Surface(2212) = {2212}; - Transfinite Surface {2212}; - Recombine Surface {2212}; - - allSurfaces[] = Surface "*"; - Extrude {0, 0, LZ} - { - Surface{allSurfaces[]}; Layers{nZ}; Recombine; - } - - Physical Volume("body") = {1,2,3,4,5,6,7,8,9,10,11,12}; - //+ - Physical Surface("outer part boundary") = {2226,2213,2220,2222}; - Physical Surface("load 1") = {2229,2234,2249}; - Physical Surface("load 2") = {2241,2246,2255}; - Physical Point("clamped xyz") = {1020}; - Physical Point("clamped xy") = {803}; - Physical Point("clamped y") = {1022}; - -EndIf diff --git a/katoptron/CMAME/model.py b/katoptron/CMAME/model.py deleted file mode 100644 index e6d85a72..00000000 --- a/katoptron/CMAME/model.py +++ /dev/null @@ -1,369 +0,0 @@ -#!/usr/bin/env python3 - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - -defaut_params = { - 'Is exp': - True, - 'Is random': - True, - 'Correlation length X': - 20., - 'Correlation length Y': - 20., - 'Correlation length Z': - 0., - 'Number of KL Terms X': - 5, - 'Number of KL Terms Y': - 5, - 'Number of KL Terms Z': - 3, - 'Dispersion level': - 0.1, - 'gamma': - 4368992., - 'MueLu xml from current_dir': - True, - 'MueLu xml use template': - True, - 'MueLu xml file name': - '/SIMPLE_gs.xml', - 'MueLu xml template file name': - '/../preconditioners/SIMPLE_gs.xml.in', - 'MueLu xml params name': [ - '$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_11_GS_sweeps', '$BLOCK_00_GS_damping', - '$BLOCK_11_GS_damping', '$SCHUR_omega', '$SimpleSmoother_damping' - ], - 'MueLu xml params': ['3', '3', '10', '10', '1.6', '1.6', '0.5', '1.'], - 'Write matrix and vectors': - False, - 'Write txt files': - False, - 'inner clamped': - False -} - - -def get_parameters(case_id, first_sample_id): - """ - This function returns the python dictionary that includes - the parameters for a given test case - """ - p = defaut_params - - if case_id == 0: - p['Is random'] = False - elif case_id == 1: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.1 - elif case_id == 2: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.3 - elif case_id == 3: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - elif case_id == 4: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.3 - elif case_id == 5: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.1 - elif case_id == 6: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.3 - elif case_id == 7: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.01 - elif case_id == 8: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.01 - elif case_id == 9: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.01 - - if p['Is random'] == True: - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = first_sample_id * nuw**2 - p['Number Phi of previously drawn samples'] = first_sample_id * nuw**2 - - p['MueLu xml file name'] = '/SIMPLE_MG.xml' - p['MueLu xml template file name'] = '/../preconditioners/SIMPLE_gs_direct_lvl.xml.in' - p['MueLu xml params name'] = [ - '$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_00_GS_damping', '$SCHUR_omega', - '$SimpleSmoother_damping', "$N_LVLS", "$N_SIZES", "$EXPORT_DATA", - "$SimpleSmoother_sweeps" - ] - p['MueLu xml params'] = [ - '3', '3', '3', '0.8', '0.8', '1', '2', '18', "true", '1' - ] - - p['Is exp'] = False - p['gamma'] = 0. - p['Write vtk files'] = False - return p - - -def Compute_QoIs(filename): - import tboxVtk.reader as vtkR - import tboxVtk.lineExtractor as vtkC - - QoI = np.zeros((4, )) - reader = vtkR.Reader() - reader.open(filename) - cutter = vtkC.LineExtractor(reader.reader.GetOutputPort()) - c_output = cutter.cut(1, [ - 5., - 5., - 0.5, - ], [ - 10., - 5., - 0.5, - ], - tag_name='volume_id') - pts, tri, vals = cutter.extract(c_output, ['von Mises'], atPoint=False) - QoI[0] = vals['von Mises'][0] - - c_output = cutter.cut(1, [ - 5., - 5., - 0.5, - ], [ - 5., - 10., - 0.5, - ], - tag_name='volume_id') - pts, tri, vals = cutter.extract(c_output, ['von Mises'], atPoint=False) - QoI[1] = vals['von Mises'][0] - - c_output = cutter.cut(1, [ - 5., - 5., - 0.5, - ], [ - 0., - 5., - 0.5, - ], - tag_name='volume_id') - pts, tri, vals = cutter.extract(c_output, ['von Mises'], atPoint=False) - QoI[2] = vals['von Mises'][0] - - c_output = cutter.cut(1, [ - 5., - 5., - 0.5, - ], [ - 5., - 0., - 0.5, - ], - tag_name='volume_id') - pts, tri, vals = cutter.extract(c_output, ['von Mises'], atPoint=False) - QoI[3] = vals['von Mises'][0] - return QoI - - -class plate_model: - def __init__(self, - ensemble_size, - randomVariable, - msh, - comm, - file_dir, - current_dir, - p=defaut_params): - - if p['MueLu xml use template']: - old_strings = p['MueLu xml params name'] - new_strings = p['MueLu xml params'] - - muelu_xml_in = file_dir + p['MueLu xml template file name'] - u.replace_strings(muelu_xml_in, - current_dir + p['MueLu xml file name'], - old_strings, new_strings) - - pbl = m.Problem(msh, comm) - - # Units are in mm - E = 70000 * np.ones(ensemble_size) # 70e9 Pa = 70000 MPa - nu = 0.35 * np.ones(ensemble_size) - k = 0. - d = 0. - m.Medium(pbl, "body", "test", E, nu, k, d) - - m.Dirichlet(pbl, "clamped xyz", "Clamped", 1, 0., 1, 0., 1, 0., 0, 0., - ensemble_size) - m.Dirichlet(pbl, "clamped xy", "Clamped", 1, 0., 1, 0., 0, 0., 0, 0., - ensemble_size) - m.Dirichlet(pbl, "clamped y", "Clamped", 0, 0., 1, 0., 0, 0., 0, 0., - ensemble_size) - - if p['inner clamped']: - m.Dirichlet(pbl, "inner boundary", "Clamped", 1, 0., 1, 0., 1, 0., - 0, 0., ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, 'inner part boundary', 'contact', norm) - cont.setMeshTying() - cont.setMaster(pbl, 'outer part boundary', norm) - f = 700 * np.ones(ensemble_size) # 700e6 Pa = 700 MPa - zero = np.zeros(ensemble_size) - one = np.ones(ensemble_size) - - m.Neumann(pbl, 'load 1', 'load', 0, zero, 1, f, 0, zero, 0, one, - ensemble_size) - m.Neumann(pbl, 'load 2', 'load', 0, zero, 1, -f, 0, zero, 0, one, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Ensemble Convergence Tolerance'] = 1e-7 - solverList['Maximum Iterations'] = 500 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - if p['MueLu xml from current_dir']: - solverList['MueLu xml file name'] = current_dir + \ - p['MueLu xml file name'] - else: - solverList['MueLu xml file name'] = file_dir + \ - p['MueLu xml file name'] - solverList['convert MueLu xml file'] = True - solverList['Print Teuchos timers'] = True - - solverList['gamma'] = p['gamma'] - solverList['Use preconditioner'] = True - - solverList['type'] = 'BlockGmres' - solverList['Maximum active set iteration'] = 1 - - solverList['Write matrix and vectors'] = p['Write matrix and vectors'] - solverList['Write txt files'] = p['Write txt files'] - solverList['Write vtk files'] = p['Write vtk files'] - - if p["Is exp"]: - num_random_variables = randomVariable.shape[1] - else: - num_random_variables = 0 - - for i in range(0, num_random_variables): - rand = randomVariable[:, i] - pbl.add(m.RandomVariable(rand)) - - randomParams = Teuchos.ParameterList() - - randomParams['Is random'] = p['Is random'] - if randomParams['Is random']: - randomParams['Is exp'] = p['Is exp'] - if p["Is exp"]: - randomParams['Begin X'] = 0. - randomParams['Begin Y'] = 0. - randomParams['Begin Z'] = 0. - randomParams['End X'] = 10. - randomParams['End Y'] = 10. - randomParams['End Z'] = 1. - randomParams['Number random variables'] = num_random_variables - randomParams['Correlation length X'] = p[ - 'Correlation length X'] - randomParams['Correlation length Y'] = p[ - 'Correlation length Y'] - randomParams['Correlation length Z'] = p[ - 'Correlation length Z'] - randomParams['Number of KL Terms X'] = p[ - 'Number of KL Terms X'] - randomParams['Number of KL Terms Y'] = p[ - 'Number of KL Terms Y'] - randomParams['Number of KL Terms Z'] = p[ - 'Number of KL Terms Z'] - randomParams['Maximum Nonlinear Solver Iterations'] = 5000 - randomParams['Bound Perturbation Size'] = 1E-10 - else: - randomParams['Correlation length'] = p['Correlation length'] - randomParams['Wavenumber cutoff'] = p['Wavenumber cutoff'] - randomParams['Wavenumber discretization points'] = p[ - 'Wavenumber discretization points'] - randomParams['Number Z of previously drawn samples'] = p[ - 'Number Z of previously drawn samples'] - randomParams['Number Phi of previously drawn samples'] = p[ - 'Number Phi of previously drawn samples'] - - randomParams['Mean'] = E[0] / (2. * (1. + nu[0])) - randomParams['Dispersion level'] = p['Dispersion level'] - - solverList['randomParams'] = randomParams - - self.pbl = pbl - self.solverList = solverList - self.ensemble_size = ensemble_size - - def run(self): - self.slv = m.IterativeSolver(self.pbl, self.solverList, 3, - self.ensemble_size) - self.slv.start() - f = open('timers.txt', 'w') - print(self.slv.getTimers(), file=f) - f.closed - - -def main(): - comm, rank, size = m.utilities.import_MPI() - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.geo', 'plate_1_tmp', 'plate_2.geo', - 'plate_2_tmp', 'plate_fused', file_dir + '/mesh', - work_dir, comm, rank, size) - - np.random.seed(42) - N = 1 - num_random_variables = 20 - randomVariable = np.zeros((N, num_random_variables)) - - p = get_parameters(0, 0) - p['Write txt files'] = True - p['Write vtk files'] = True - - ensemble_size = 1 - - pm = plate_model(ensemble_size, randomVariable, msh, comm, file_dir, - work_dir, p) - - nThreads = u.Initialize_Kokkos() - pm.run() - u.Finalize_Kokkos() - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_slurm/blake_GS_omega.slurm.sh b/katoptron/CMAME/old_slurm/blake_GS_omega.slurm.sh deleted file mode 100644 index 1f044eaa..00000000 --- a/katoptron/CMAME/old_slurm/blake_GS_omega.slurm.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=omega_GS -#SBATCH --time=41:59:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/omega_GS.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -python run.py katoptron/CMAME/post_process/plate_mean_GS.py diff --git a/katoptron/CMAME/old_slurm/blake_MC_GS.slurm.sh b/katoptron/CMAME/old_slurm/blake_MC_GS.slurm.sh deleted file mode 100644 index 48a66683..00000000 --- a/katoptron/CMAME/old_slurm/blake_MC_GS.slurm.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=MC_G -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/MC_GS.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,2t -export KMP_AFFINITY=compact - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_MC_GS_all_cases.py diff --git a/katoptron/CMAME/old_slurm/blake_MC_GS_direct.slurm.sh b/katoptron/CMAME/old_slurm/blake_MC_GS_direct.slurm.sh deleted file mode 100644 index f3010479..00000000 --- a/katoptron/CMAME/old_slurm/blake_MC_GS_direct.slurm.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=GS_direct -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/MC_GS_direct.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=48 -export KMP_PLACE_THREADS=24c,2t -export KMP_AFFINITY=compact - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_MC_GS_direct_all_cases.py diff --git a/katoptron/CMAME/old_slurm/blake_MC_GS_fused.slurm.sh b/katoptron/CMAME/old_slurm/blake_MC_GS_fused.slurm.sh deleted file mode 100644 index 1014b6e9..00000000 --- a/katoptron/CMAME/old_slurm/blake_MC_GS_fused.slurm.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=MC_G -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/MC_GS.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,2t -export KMP_AFFINITY=compact - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/fused_plate_MC_GS_all_cases.py diff --git a/katoptron/CMAME/old_slurm/blake_MC_GS_fused_prec.slurm.sh b/katoptron/CMAME/old_slurm/blake_MC_GS_fused_prec.slurm.sh deleted file mode 100644 index c001d63b..00000000 --- a/katoptron/CMAME/old_slurm/blake_MC_GS_fused_prec.slurm.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=MC_G -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/MC_GS.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,2t -export KMP_AFFINITY=compact - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/fused_plate_mean_prec_GS.py diff --git a/katoptron/CMAME/old_slurm/blake_MC_MG.slurm.sh b/katoptron/CMAME/old_slurm/blake_MC_MG.slurm.sh deleted file mode 100644 index 4fa094a9..00000000 --- a/katoptron/CMAME/old_slurm/blake_MC_MG.slurm.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=MC_MG -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/MC_MG.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=48 -export KMP_PLACE_THREADS=24c,2t -export KMP_AFFINITY=compact - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_MC_MG_all_cases.py diff --git a/katoptron/CMAME/old_slurm/blake_MC_MG_2.slurm.sh b/katoptron/CMAME/old_slurm/blake_MC_MG_2.slurm.sh deleted file mode 100644 index a20dca60..00000000 --- a/katoptron/CMAME/old_slurm/blake_MC_MG_2.slurm.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=MC_MG -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/MC_MG.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=48 -export KMP_PLACE_THREADS=24c,2t -export KMP_AFFINITY=compact - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_MC_MG_all_cases_2.py diff --git a/katoptron/CMAME/old_slurm/blake_MC_direct.slurm.sh b/katoptron/CMAME/old_slurm/blake_MC_direct.slurm.sh deleted file mode 100644 index dd624883..00000000 --- a/katoptron/CMAME/old_slurm/blake_MC_direct.slurm.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=plate_UQ -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/MC_direct.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,2t -export KMP_AFFINITY=compact - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_MC_direct_case_1.py -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_MC_direct_case_2.py -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_MC_direct_case_3.py -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_MC_direct_case_4.py diff --git a/katoptron/CMAME/old_slurm/blake_NO_EP.slurm.sh b/katoptron/CMAME/old_slurm/blake_NO_EP.slurm.sh deleted file mode 100644 index 844b9c3c..00000000 --- a/katoptron/CMAME/old_slurm/blake_NO_EP.slurm.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=plate_UQ -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/plate_UQ.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -python run.py -k 24 katoptron/CMAME/tests/plate_MC_NO_EP_case_1.py -python run.py -k 24 katoptron/CMAME/tests/plate_MC_NO_EP_case_2.py -python run.py -k 24 katoptron/CMAME/tests/plate_MC_NO_EP_case_3.py -python run.py -k 24 katoptron/CMAME/tests/plate_MC_NO_EP_case_4.py diff --git a/katoptron/CMAME/old_slurm/blake_convergence_direct.slurm.sh b/katoptron/CMAME/old_slurm/blake_convergence_direct.slurm.sh deleted file mode 100644 index e9d6c2c2..00000000 --- a/katoptron/CMAME/old_slurm/blake_convergence_direct.slurm.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=conv_KLU -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/plate_convergence_direct.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -python run.py katoptron/CMAME/tests/plate_convergence_direct.py diff --git a/katoptron/CMAME/old_slurm/blake_correlation.slurm.sh b/katoptron/CMAME/old_slurm/blake_correlation.slurm.sh deleted file mode 100644 index 436291f1..00000000 --- a/katoptron/CMAME/old_slurm/blake_correlation.slurm.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=plate_corr -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/plate_corr.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,2t -export KMP_AFFINITY=compact - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_correlation.py diff --git a/katoptron/CMAME/old_slurm/blake_eigenvalues_direct.slurm.sh b/katoptron/CMAME/old_slurm/blake_eigenvalues_direct.slurm.sh deleted file mode 100644 index 5695e45b..00000000 --- a/katoptron/CMAME/old_slurm/blake_eigenvalues_direct.slurm.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=omegas_KLU -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/plate_deltas_omegas_direct.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -mpirun -np 8 python run.py katoptron/CMAME/tests/plate_deltas_omegas_direct.py diff --git a/katoptron/CMAME/old_slurm/blake_eigenvalues_gs.slurm.sh b/katoptron/CMAME/old_slurm/blake_eigenvalues_gs.slurm.sh deleted file mode 100644 index fb90109d..00000000 --- a/katoptron/CMAME/old_slurm/blake_eigenvalues_gs.slurm.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=omegas_GS -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 2 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/plate_deltas_omegas_GS.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -mpirun -np 16 python run.py katoptron/CMAME/tests/plate_deltas_omegas_GS.py diff --git a/katoptron/CMAME/old_slurm/blake_gamma.slurm.sh b/katoptron/CMAME/old_slurm/blake_gamma.slurm.sh deleted file mode 100644 index 5f70c54d..00000000 --- a/katoptron/CMAME/old_slurm/blake_gamma.slurm.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=plate_gamma -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/plate_gamma.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,2t -export KMP_AFFINITY=compact - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_mean_gamma.py diff --git a/katoptron/CMAME/old_slurm/blake_prec.slurm.sh b/katoptron/CMAME/old_slurm/blake_prec.slurm.sh deleted file mode 100644 index 79eba568..00000000 --- a/katoptron/CMAME/old_slurm/blake_prec.slurm.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=plate_prec -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/plate_prec.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,2t -export KMP_AFFINITY=compact - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_mean_prec.py diff --git a/katoptron/CMAME/old_slurm/blake_prec_GS_direct.slurm.sh b/katoptron/CMAME/old_slurm/blake_prec_GS_direct.slurm.sh deleted file mode 100644 index 10a5cadb..00000000 --- a/katoptron/CMAME/old_slurm/blake_prec_GS_direct.slurm.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=plate_prec -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/plate_prec.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,2t -export KMP_AFFINITY=compact - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_mean_prec_GS_direct.py diff --git a/katoptron/CMAME/old_slurm/blake_prec_GS_direct_lvl.slurm.sh b/katoptron/CMAME/old_slurm/blake_prec_GS_direct_lvl.slurm.sh deleted file mode 100644 index 5644e3fa..00000000 --- a/katoptron/CMAME/old_slurm/blake_prec_GS_direct_lvl.slurm.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=plate_prec -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/plate_prec.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,2t -export KMP_AFFINITY=compact - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_mean_prec_GS_direct_lvl.py diff --git a/katoptron/CMAME/old_slurm/bowman.slurm.sh b/katoptron/CMAME/old_slurm/bowman.slurm.sh deleted file mode 100644 index 27b82e58..00000000 --- a/katoptron/CMAME/old_slurm/bowman.slurm.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# Submission script for Bowman -#SBATCH --job-name=plate_UQ -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p knl-delta -# -#SBATCH --comment=test -#SBATCH --output=workspace/plate_UQ.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=256 - -export KMP_HW_SUBSET=64c,4t -export KMP_AFFINITY=balanced - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_MC.py diff --git a/katoptron/CMAME/old_tests/2_cubes_patch_GS.py b/katoptron/CMAME/old_tests/2_cubes_patch_GS.py deleted file mode 100644 index c589f510..00000000 --- a/katoptron/CMAME/old_tests/2_cubes_patch_GS.py +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -#import matplotlib.pyplot as plt - -from katoptron.eigenvalues import * -from katoptron.convergence import * - -import shlex -import subprocess -import os -import numpy as np - -from PyTrilinos import Teuchos - - -def evaluate_cubes(args, msh, comm, ensemble_size, _E, file_dir): - - pbl = m.Problem(msh, comm) - - #E = np.linspace(0.5,1.5,ensemble_size) - E = 10. * np.ones(ensemble_size) - nu = 0.4 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - m.Dirichlet(pbl, "Clamped", "Clamped", 1, 0., - 1, 0., 1, 0., 0, 0., ensemble_size) - #m.Dirichlet(pbl, "Clamped xy", "Clamped",1,0.,1,0.,1,0.,0,0.,ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Contact 2", "contact", norm) - cont.setMeshTying() - cont.setMaster(pbl, "Contact 1", norm) - - zero = np.zeros(ensemble_size) - p = -0.2 * np.ones(ensemble_size) - - m.Neumann(pbl, "Load", "Load 1", 0, zero, 0, - zero, 1, p, 0, zero, ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['gamma'] = 29.58164477018121 - - solverList["MueLu xml file name"] = file_dir + \ - '/../preconditioners/SIMPLE_gs.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - if ensemble_size == 1: - solverList['Create Preconditioned Matrix'] = True - - if ensemble_size > 1: - slv = m.IterativeSolver(pbl, args.k, solverList, - 3, True, ensemble_size) - else: - slv = m.IterativeSolver(pbl, args.k, solverList, - 3, ensemble_size) - - slv.start() - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - from fwk.wutils import parseargs - args = parseargs() - - geo_name = '../tests/2_cubes_patch.geo' - mesh_name = '2_cubes_patch.msh' - partitioned_mesh_name = '2_cubes_patch.msh' - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - gmsh.MeshLoader(geo_name, __file__).execute() - - if rank == 0: - command_line = 'gmsh -3 ' + work_dir + '/' + mesh_name + ' -o ' + \ - work_dir + '/' + partitioned_mesh_name + ' -part ' + str(siz) - print(command_line) - tmp = shlex.split(command_line) - fileout = open('gmsh.log', 'w') - p = subprocess.Popen(tmp, stdin=subprocess.PIPE, stdout=fileout, - stderr=fileout, env=os.environ, shell=False, close_fds=True) - retcode = p.wait() - for i in range(1, siz): - comm.send(1, dest=i, tag=11) - else: - data = comm.recv(source=0, tag=11) - - if siz == 1: - msh = gmsh.MeshLoader(mesh_name, work_dir).execute() - else: - msh = gmsh.MeshLoader(mesh_name, work_dir).myrank_execute(rank) - - N = 32 - - E = np.linspace(5., 15.0, num=N) - - ensemble_sizes = [1, 8, 16, 32] - - for e in range(0, len(ensemble_sizes)): - directory = str(ensemble_sizes[e]) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - for i in range(0, (N // ensemble_sizes[e])): - directory = str(i) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_cubes( - args, msh, comm, ensemble_sizes[e], E[i*ensemble_sizes[e]:(i+1)*ensemble_sizes[e]], file_dir) - os.chdir('..') - - os.chdir('..') - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/2_cubes_patch_GS_klu.py b/katoptron/CMAME/old_tests/2_cubes_patch_GS_klu.py deleted file mode 100644 index 324f0989..00000000 --- a/katoptron/CMAME/old_tests/2_cubes_patch_GS_klu.py +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -#import matplotlib.pyplot as plt - -from katoptron.eigenvalues import * -from katoptron.convergence import * - -import shlex -import subprocess -import os -import numpy as np - -from PyTrilinos import Teuchos - - -def evaluate_cubes(args, msh, comm, ensemble_size, _E, file_dir): - - pbl = m.Problem(msh, comm) - - #E = np.linspace(0.5,1.5,ensemble_size) - E = 10. * np.ones(ensemble_size) - nu = 0.4 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - m.Dirichlet(pbl, "Clamped", "Clamped", 1, 0., - 1, 0., 1, 0., 0, 0., ensemble_size) - #m.Dirichlet(pbl, "Clamped xy", "Clamped",1,0.,1,0.,1,0.,0,0.,ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Contact 2", "contact", norm) - cont.setMeshTying() - cont.setMaster(pbl, "Contact 1", norm) - - zero = np.zeros(ensemble_size) - p = -0.2 * np.ones(ensemble_size) - - m.Neumann(pbl, "Load", "Load 1", 0, zero, 0, - zero, 1, p, 0, zero, ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['gamma'] = 29.58164477018121 - - old_strings = ['$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_00_GS_damping', - '$SCHUR_omega', '$SimpleSmoother_damping'] - new_strings = ['3', '3', '100', '1.75', '0.05', '1.'] - - muelu_xml_in = file_dir + p['MueLu xml template file name'] - u.replace_strings(muelu_xml_in, current_dir + - p['MueLu xml file name'], old_strings, new_strings) - - p['MueLu xml template file name'] = '/../preconditioners/SIMPLE_gs.xml.in' - p['MueLu xml params name'] = ['$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_11_GS_sweeps', - '$BLOCK_00_GS_damping', '$BLOCK_11_GS_damping', - '$SCHUR_omega', '$SimpleSmoother_damping'] - p['MueLu xml params'] = ['3', '3', '100', '1.75', '0.05', '1.'] - - solverList["MueLu xml file name"] = file_dir + \ - '/../preconditioners/SIMPLE_gs.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - if ensemble_size == 1: - solverList['Create Preconditioned Matrix'] = True - - if ensemble_size > 1: - slv = m.IterativeSolver(pbl, args.k, solverList, - 3, True, ensemble_size) - else: - slv = m.IterativeSolver(pbl, args.k, solverList, - 3, ensemble_size) - - slv.start() - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - from fwk.wutils import parseargs - args = parseargs() - - geo_name = '../tests/2_cubes_patch.geo' - mesh_name = '2_cubes_patch.msh' - partitioned_mesh_name = '2_cubes_patch.msh' - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - gmsh.MeshLoader(geo_name, __file__).execute() - - if rank == 0: - command_line = 'gmsh -3 ' + work_dir + '/' + mesh_name + ' -o ' + \ - work_dir + '/' + partitioned_mesh_name + ' -part ' + str(siz) - print(command_line) - tmp = shlex.split(command_line) - fileout = open('gmsh.log', 'w') - p = subprocess.Popen(tmp, stdin=subprocess.PIPE, stdout=fileout, - stderr=fileout, env=os.environ, shell=False, close_fds=True) - retcode = p.wait() - for i in range(1, siz): - comm.send(1, dest=i, tag=11) - else: - data = comm.recv(source=0, tag=11) - - if siz == 1: - msh = gmsh.MeshLoader(mesh_name, work_dir).execute() - else: - msh = gmsh.MeshLoader(mesh_name, work_dir).myrank_execute(rank) - - N = 32 - - E = np.linspace(5., 15.0, num=N) - - ensemble_sizes = [1, 8, 16, 32] - - for e in range(0, len(ensemble_sizes)): - directory = str(ensemble_sizes[e]) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - for i in range(0, (N // ensemble_sizes[e])): - directory = str(i) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_cubes( - args, msh, comm, ensemble_sizes[e], E[i*ensemble_sizes[e]:(i+1)*ensemble_sizes[e]], file_dir) - os.chdir('..') - - os.chdir('..') - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/2_cubes_patch_direct.py b/katoptron/CMAME/old_tests/2_cubes_patch_direct.py deleted file mode 100644 index b3b82242..00000000 --- a/katoptron/CMAME/old_tests/2_cubes_patch_direct.py +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -#import matplotlib.pyplot as plt - -from katoptron.eigenvalues import * -from katoptron.convergence import * - -import shlex -import subprocess -import os -import numpy as np - -from PyTrilinos import Teuchos - - -def evaluate_cubes(args, msh, comm, ensemble_size, _E, file_dir): - - pbl = m.Problem(msh, comm) - - #E = np.linspace(0.5,1.5,ensemble_size) - E = 10. * np.ones(ensemble_size) - nu = 0.4 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - m.Dirichlet(pbl, "Clamped", "Clamped", 1, 0., - 1, 0., 1, 0., 0, 0., ensemble_size) - #m.Dirichlet(pbl, "Clamped xy", "Clamped",1,0.,1,0.,1,0.,0,0.,ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Contact 2", "contact", norm) - cont.setMeshTying() - cont.setMaster(pbl, "Contact 1", norm) - - zero = np.zeros(ensemble_size) - p = -0.2 * np.ones(ensemble_size) - - m.Neumann(pbl, "Load", "Load 1", 0, zero, 0, - zero, 1, p, 0, zero, ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['gamma'] = 29.58164477018121 - - solverList["MueLu xml file name"] = file_dir + \ - '/../preconditioners/SIMPLE_direct.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - if ensemble_size == 1: - solverList['Create Preconditioned Matrix'] = True - - if ensemble_size > 1: - slv = m.IterativeSolver(pbl, args.k, solverList, - 3, True, ensemble_size) - else: - slv = m.IterativeSolver(pbl, args.k, solverList, - 3, ensemble_size) - - slv.start() - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - from fwk.wutils import parseargs - args = parseargs() - - geo_name = '../tests/2_cubes_patch.geo' - mesh_name = '2_cubes_patch.msh' - partitioned_mesh_name = '2_cubes_patch.msh' - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - gmsh.MeshLoader(geo_name, __file__).execute() - - if rank == 0: - command_line = 'gmsh -3 ' + work_dir + '/' + mesh_name + ' -o ' + \ - work_dir + '/' + partitioned_mesh_name + ' -part ' + str(siz) - print(command_line) - tmp = shlex.split(command_line) - fileout = open('gmsh.log', 'w') - p = subprocess.Popen(tmp, stdin=subprocess.PIPE, stdout=fileout, - stderr=fileout, env=os.environ, shell=False, close_fds=True) - retcode = p.wait() - for i in range(1, siz): - comm.send(1, dest=i, tag=11) - else: - data = comm.recv(source=0, tag=11) - - if siz == 1: - msh = gmsh.MeshLoader(mesh_name, work_dir).execute() - else: - msh = gmsh.MeshLoader(mesh_name, work_dir).myrank_execute(rank) - - N = 32 - - E = np.linspace(5., 15.0, num=N) - - ensemble_sizes = [1, 8, 16, 32] - - for e in range(0, len(ensemble_sizes)): - directory = str(ensemble_sizes[e]) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - for i in range(0, (N // ensemble_sizes[e])): - directory = str(i) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_cubes( - args, msh, comm, ensemble_sizes[e], E[i*ensemble_sizes[e]:(i+1)*ensemble_sizes[e]], file_dir) - os.chdir('..') - - os.chdir('..') - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/clean_A_B.py b/katoptron/CMAME/old_tests/clean_A_B.py deleted file mode 100644 index 98b2e7b3..00000000 --- a/katoptron/CMAME/old_tests/clean_A_B.py +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -from katoptron.eigenvalues import * -import os -import fwk -from scipy import sparse - - -def write_mm(filename, matrix, drow=0, dcol=0): - f = open(filename, 'w') - print('%%MatrixMarket matrix', file=f) - print(str(int(matrix.shape[0])) + ' ' + str(int(matrix.shape[1])) + ' ' + str(int(matrix.count_nonzero())), file=f) - - row, col = matrix.nonzero() - for i in range(0, matrix.count_nonzero()): - print(str(int(row[i]+1+drow)) + ' ' + str(int(col[i]+1+dcol)) + ' ' + '{0:1.17e}'.format(matrix[row[i], col[i]]), file=f) - - f.closed - - -def write_vector_mm(filename, vec, n): - f = open(filename, 'w') - print('%%MatrixMarket matrix', file=f) - print(str(int(n)), file=f) - for i in range(0, n): - if i < vec.size: - print('{0:1.17e}'.format(vec[i]), file=f) - else: - print('{0:1.17e}'.format(0.), file=f) - - f.closed - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - input_file_dir = '/Users/kimliegeois/Desktop/workspace 5/katoptron_tests_beam' - - filename_Q = input_file_dir + '/ApCTC_mm.txt' - filename_GT = input_file_dir + '/B_mm.txt' - filename_f = input_file_dir + '/b_mm_after_bc.txt' - - Q = read_mm(filename_Q) - Q = get_symmetrical_part(Q) - GT = read_mm(filename_GT) - G = GT.transpose() - f = read_mm(filename_f, is_sparse=False) - - print(Q.shape) - print(Q.count_nonzero()) - - write_vector_mm('f_mm.txt', f, G.shape[0]+G.shape[1]) - - write_mm('Q_mm.txt', Q) - write_mm('G_mm.txt', G, dcol=Q.shape[0]) - write_mm('GT_mm.txt', GT, drow=Q.shape[0]) - - Afull = read_mm( - "/Users/kimliegeois/Desktop/workspace 7/katoptron_tests_beam/Applied_Matrix_mm.txt", is_sparse=False) - A = sparse.csr_matrix(Afull) - - print(A.count_nonzero()) - - write_mm('A_full_mm.txt', A) - write_mm('C_mm.txt', A[Q.shape[0]:A.shape[0], Q.shape[1]:A.shape[1]]) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/compare_GB.py b/katoptron/CMAME/old_tests/compare_GB.py deleted file mode 100644 index 640c83fa..00000000 --- a/katoptron/CMAME/old_tests/compare_GB.py +++ /dev/null @@ -1,181 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -from katoptron.eigenvalues import * -import os -import fwk -from scipy import sparse -import matplotlib.pyplot as plt - -def test1(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - input_file_dir = '/Users/kimliegeois/Desktop/gaston' - - filename_GT = input_file_dir + '/B_mm.txt' - - GT_gaston = read_mm(filename_GT) - - X = np.loadtxt(filename_GT, skiprows=2) - - row_gaston = X[:, 0].astype(int)-1 - col_gaston = X[:, 1].astype(int)-1 - data_gaston = X[:, 2] - - input_file_dir = '/Users/kimliegeois/Desktop/blake' - - filename_GT = input_file_dir + '/B_mm.txt' - - GT_blake = read_mm(filename_GT) - - X = np.loadtxt(filename_GT, skiprows=2) - - row_blake = X[:, 0].astype(int)-1 - col_blake = X[:, 1].astype(int)-1 - data_blake = X[:, 2] - - nNode = 341 - - plot_indices = np.arange(80,120,1,dtype=int) - - print(col_gaston[plot_indices]) - print(col_blake[plot_indices]) - - indT = np.argwhere(col_gaston <= nNode) - indMech = np.argwhere(col_gaston > nNode) - - - col_gaston_2 = np.copy(col_gaston) - - col_gaston_2[indT] = (col_gaston[indT]+1)*4-1 - - indexNodes = np.floor((col_gaston_2[indMech] - nNode)/3.) - rest = (col_gaston_2[indMech] - nNode) - 3*indexNodes - - plt.figure() - plt.plot(indexNodes[plot_indices],'*') - - plt.figure() - plt.plot(rest[plot_indices],'*') - - col_gaston_2[indMech] = indexNodes*4+rest - - #print(col_gaston[0:30]) - print(col_gaston_2[plot_indices]) - print(col_blake[plot_indices]) - - print(np.amax(np.abs(data_gaston-data_blake))) - print(np.amax(np.abs(col_gaston_2-col_blake))) - print(np.amax(np.abs(row_gaston-row_blake))) - - plt.figure() - plt.plot(col_gaston_2[plot_indices]-col_blake[plot_indices],'*') - #plt.show() - -def test2(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - input_file_dir = '/Users/kimliegeois/Desktop/gaston' - - filename_GT = input_file_dir + '/B_T_mm.txt' - - GT_gaston = read_mm(filename_GT) - - X = np.loadtxt(filename_GT, skiprows=2) - - row_gaston = X[:, 0].astype(int)-1 - col_gaston = X[:, 1].astype(int)-1 - data_gaston = X[:, 2] - - input_file_dir = '/Users/kimliegeois/Desktop/blake' - - filename_GT = input_file_dir + '/B_T_mm.txt' - - GT_blake = read_mm(filename_GT) - - X = np.loadtxt(filename_GT, skiprows=2) - - row_blake = X[:, 0].astype(int)-1 - col_blake = X[:, 1].astype(int)-1 - data_blake = X[:, 2] - - nNode = 341 - - indT = np.argwhere(row_gaston <= nNode) - indMech = np.argwhere(row_gaston > nNode) - - plot_indices = np.arange(80,120,1,dtype=int) - - row_gaston_2 = np.copy(row_gaston) - - row_gaston_2[indT] = (row_gaston[indT]+1)*4-1 - - indexNodes = np.floor((row_gaston_2[indMech] - nNode)/3.) - rest = (row_gaston_2[indMech] - nNode) - 3*indexNodes - - plt.figure() - plt.plot(indexNodes[plot_indices],'*') - - plt.figure() - plt.plot(rest[plot_indices],'*') - - row_gaston_2[indMech] = indexNodes*4+rest - - - - row_gaston_order = row_gaston_2*100+col_gaston - row_blake_order = row_blake*100+col_blake - - order_gaston = np.argsort(row_gaston_order) - order_blake = np.argsort(row_blake_order) - - print(row_gaston_2[plot_indices]) - print(row_blake[plot_indices]) - - print(np.amax(np.abs(data_gaston[order_gaston]-data_blake[order_blake]))) - print(np.amax(np.abs(row_gaston_2[order_gaston]-row_blake[order_blake]))) - print(np.amax(np.abs(col_gaston[order_gaston]-col_blake[order_blake]))) - - - #print(np.sum(row_gaston_2-row_blake)) - - plt.figure() - plt.plot(row_gaston_2[order_gaston]-row_blake[order_blake],'*') - #plt.show() - -def main(): - test2() - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/cube_deltas_omegas_GS.py b/katoptron/CMAME/old_tests/cube_deltas_omegas_GS.py deleted file mode 100644 index 23505af4..00000000 --- a/katoptron/CMAME/old_tests/cube_deltas_omegas_GS.py +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.eigenvalues import * -import os -import fwk - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - n_sweeps_Q = 10 - damp_Q = 1.6 - - n_sweeps_R = 10 - damp_R = 1.6 - - omega = 0.5 - - N = 32 - - input_file_dir = file_dir + \ - '/../../workspace/katoptron_CMAME_tests_2_cubes_patch_convergence/1/' - - sample_per_rank = np.ceil((N / siz)) - i_min = rank*sample_per_rank - i_max = i_min+sample_per_rank - - if i_min > N: - i_min = N - if i_max > N: - i_max = N - - i_min = int(i_min) - i_max = int(i_max) - - print('Rank ' + str(rank) + ' from sample ' + str(i_min) + ':' + str(i_max)) - - for i in range(i_min, i_max): - timers = fwk.Timers() - - filename_Q = input_file_dir + str(i) + '/ApCTC_mm.txt' - filename_GT = input_file_dir + str(i) + '/B_mm.txt' - filename_f = input_file_dir + str(i) + '/b_mm_after_bc.txt' - - timers['Read files'].start() - Q = read_mm(filename_Q) - Q = get_symmetrical_part(Q) - GT = read_mm(filename_GT) - G = GT.transpose() - f = read_mm(filename_f, is_sparse=False) - timers['Read files'].stop() - - timers['Compute R'].start() - R = approx_Schur_complement(Q, G, GT) - timers['Compute R'].stop() - - timers['Compute invR'].start() - invR = Gauss_Seidel(R, n=n_sweeps_R, damping=damp_R) - timers['Compute invR'].stop() - - print(timers) - - timers['Compute the inverse of Q'].start() - invQ = Gauss_Seidel(Q, n=n_sweeps_Q, damping=damp_Q) - timers['Compute the inverse of Q'].stop() - - print(timers) - - timers['Compute the preconditioned matrix'].start() - AinvP = SIMPLE_preconditioned_matrix( - Q, invQ, G, GT, R, invR, omega=omega) - timers['Compute the preconditioned matrix'].stop() - - print(timers) - - tmp = np.zeros(AinvP.shape) - for i in range(0, AinvP.shape[0]): - tmp[i, i] = 1 - tmp[:, i] = AinvP.dot(tmp[:, i]) - - print(AinvP.shape) - - w, v, cond = compute_eig_and_departure_from_orthogonality(tmp) - print(cond) - - return - timers['Compute the basis'].start() - - n = Q.shape[0]+R.shape[0] - b = np.zeros((n,)) - b[0:len(f)] = f - - N = 2 - m_max = 6000 - V, W = compute_VW(AinvP, b, m=m_max, N=N) - timers['Compute the basis'].stop() - - print(timers) - - timers['Compute the eigenvalues'].start() - deltas, omegas = compute_deltas_omegas(V, W, b) - timers['Compute the eigenvalues'].stop() - - print(timers) - - timers['Write the eigenvalues'].start() - write_eigenvalues(deltas, work_dir+'/deltas_GS_GS_' + str(i) + '.txt') - np.savetxt(work_dir+'/omegas_GS_GS_' + str(i) + '.txt', omegas) - timers['Write the eigenvalues'].stop() - - f = open('timers_' + str(i) + '.txt', 'w') - print(timers, file=f) - f.closed - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/fused_plate_MC_GS_all_cases.py b/katoptron/CMAME/old_tests/fused_plate_MC_GS_all_cases.py deleted file mode 100644 index 858bfe31..00000000 --- a/katoptron/CMAME/old_tests/fused_plate_MC_GS_all_cases.py +++ /dev/null @@ -1,273 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -"""@package docstring -This test runs the four different cases as defined in table 2 of the paper -with a SIMPLE-GS-GS preconditioner. -""" - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def get_parameters(case_id, first_sample_id): - """ - This function returns the python dictionary that includes - the parameters for a given test case - """ - p = model.defaut_params - - if case_id == 1: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.1 - elif case_id == 2: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.3 - elif case_id == 3: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - elif case_id == 4: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.3 - elif case_id == 5: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.1 - elif case_id == 6: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.3 - - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = first_sample_id * nuw**2 - p['Number Phi of previously drawn samples'] = first_sample_id * nuw**2 - - p['Is exp'] = False - return p - - -def evaluate_one_ensemble(ensemble_size, case_id, first_sample_id, msh, comm, - file_dir): - """ - This function evaluates one ensemble for a given test case - """ - work_dir = os.getcwd() - args = parseargs() - - p = get_parameters(case_id, first_sample_id) - - pbl = m.Problem(msh, comm) - - # Units are in mm - E = 70000 * np.ones(ensemble_size) # 70e9 Pa = 70000 MPa - nu = 0.35 * np.ones(ensemble_size) - k = 0. - d = 0. - m.Medium(pbl, "body", "test", E, nu, k, d) - - m.Dirichlet(pbl, "clamped xyz", "Clamped", 1, 0., 1, 0., 1, 0., 0, 0., - ensemble_size) - m.Dirichlet(pbl, "clamped xy", "Clamped", 1, 0., 1, 0., 0, 0., 0, 0., - ensemble_size) - m.Dirichlet(pbl, "clamped y", "Clamped", 0, 0., 1, 0., 0, 0., 0, 0., - ensemble_size) - - f = 700 * np.ones(ensemble_size) # 700e6 Pa = 700 MPa - zero = np.zeros(ensemble_size) - one = np.ones(ensemble_size) - m.Neumann(pbl, 'load 1', 'load', 0, zero, 1, f, 0, zero, 0, one, - ensemble_size) - m.Neumann(pbl, 'load 2', 'load', 0, zero, 1, -f, 0, zero, 0, one, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Ensemble Convergence Tolerance'] = 1e-6 - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - prec = 3 - - if prec == 1: - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 3 - mueluParams['max levels'] = 1 - mueluParams['coarse: type'] = "CHEBYSHEV" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['chebyshev: degree'] = 20 - - mueluParams['verbosity'] = "high" - - mueluParams['coarse: params'] = mueluParamsSub2 - elif prec == 2: - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 3 - mueluParams['max levels'] = 1 - mueluParams['coarse: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "MT Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 10 - mueluParamsSub2['relaxation: damping factor'] = 1.75 - - mueluParams['verbosity'] = "high" - - mueluParams['coarse: params'] = mueluParamsSub2 - elif prec == 3: - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 3 - mueluParams['max levels'] = 2 - mueluParams['smoother: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "MT Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 10 - mueluParamsSub2['relaxation: damping factor'] = 1.75 - - mueluParams['verbosity'] = "high" - - mueluParams['smoother: params'] = mueluParamsSub2 - - mueluParams['coarse: type'] = "Klu" - mueluParams['coarse: max size'] = 18 - - solverList['convert MueLu xml file'] = True - solverList['mueluParams'] = mueluParams - - solverList['Print Teuchos timers'] = True - - solverList['gamma'] = p['gamma'] - solverList['Use preconditioner'] = True - - solverList['type'] = 'BlockGmres' - solverList['Maximum active set iteration'] = 1 - - solverList['Write matrix and vectors'] = p['Write matrix and vectors'] - solverList['Write txt files'] = p['Write txt files'] - - if p["Is exp"]: - num_random_variables = randomVariable.shape[1] - else: - num_random_variables = 0 - - for i in range(0, num_random_variables): - rand = randomVariable[:, i] - pbl.add(m.RandomVariable(rand)) - - randomParams = Teuchos.ParameterList() - - randomParams['Is random'] = True - randomParams['Is exp'] = p['Is exp'] - if p["Is exp"]: - randomParams['Begin X'] = 0. - randomParams['Begin Y'] = 0. - randomParams['Begin Z'] = 0. - randomParams['End X'] = 10. - randomParams['End Y'] = 10. - randomParams['End Z'] = 1. - randomParams['Number random variables'] = num_random_variables - randomParams['Correlation length X'] = p['Correlation length X'] - randomParams['Correlation length Y'] = p['Correlation length Y'] - randomParams['Correlation length Z'] = p['Correlation length Z'] - randomParams['Number of KL Terms X'] = p['Number of KL Terms X'] - randomParams['Number of KL Terms Y'] = p['Number of KL Terms Y'] - randomParams['Number of KL Terms Z'] = p['Number of KL Terms Z'] - randomParams['Maximum Nonlinear Solver Iterations'] = 5000 - randomParams['Bound Perturbation Size'] = 1E-10 - else: - randomParams['Correlation length'] = p['Correlation length'] - randomParams['Wavenumber cutoff'] = p['Wavenumber cutoff'] - randomParams['Wavenumber discretization points'] = p[ - 'Wavenumber discretization points'] - randomParams['Number Z of previously drawn samples'] = p[ - 'Number Z of previously drawn samples'] - randomParams['Number Phi of previously drawn samples'] = p[ - 'Number Phi of previously drawn samples'] - - randomParams['Mean'] = E[0] / (2. * (1. + nu[0])) - randomParams['Dispersion level'] = p['Dispersion level'] - - solverList['randomParams'] = randomParams - - slv = m.IterativeSolver(pbl, args.k, solverList, 3, ensemble_size) - slv.start() - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - -def evaluate_all_ensembles(ensemble_sizes, case_ids, N, msh, comm, file_dir): - """ - This function loop over the test cases, the ensemble sizes, - and the ensembles - """ - for case_id in case_ids: - directory_case_id = 'case_' + str(case_id) - if not os.path.exists(directory_case_id): - os.makedirs(directory_case_id) - os.chdir(directory_case_id) - for ensemble_size in ensemble_sizes: - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - first_sample_id = ensemble_index * ensemble_size - - evaluate_one_ensemble(ensemble_size, case_id, first_sample_id, - msh, comm, file_dir) - os.chdir('..') - os.chdir('..') - os.chdir('..') - - -def main(): - """ - This loads the mesh and define the case ids and ensemble sizes - """ - comm, rank, size = m.utilities.import_MPI() - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = gmsh.MeshLoader('plate.geo', file_dir).execute() - - N = 32 - ensemble_sizes = [1, 8, 16, 32] - case_ids = [1, 2, 3, 4, 5, 6] - - evaluate_all_ensembles(ensemble_sizes, case_ids, N, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/fused_plate_mean_prec_GS.py b/katoptron/CMAME/old_tests/fused_plate_mean_prec_GS.py deleted file mode 100644 index 262ff4e3..00000000 --- a/katoptron/CMAME/old_tests/fused_plate_mean_prec_GS.py +++ /dev/null @@ -1,248 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_prec(msh, comm, file_dir, Ngs, omegags, ensemble_size=1): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - - N = ensemble_size - num_random_variables = 20 - randomVariable = np.zeros((N, num_random_variables)) - if ensemble_size is not 1: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = 0 - p['Number Phi of previously drawn samples'] = 0 - p['Is exp'] = False - - pbl = m.Problem(msh, comm) - - # Units are in mm - E = 70000 * np.ones(ensemble_size) # 70e9 Pa = 70000 MPa - nu = 0.35 * np.ones(ensemble_size) - k = 0. - d = 0. - m.Medium(pbl, "body", "test", E, nu, k, d) - - m.Dirichlet(pbl, "clamped xyz", "Clamped", 1, 0., - 1, 0., 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "clamped xy", "Clamped", 1, 0., - 1, 0., 0, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "clamped y", "Clamped", 0, 0., - 1, 0., 0, 0., 0, 0., ensemble_size) - - f = 700 * np.ones(ensemble_size) # 700e6 Pa = 700 MPa - zero = np.zeros(ensemble_size) - one = np.ones(ensemble_size) - m.Neumann(pbl, 'load 1', 'load', 0, zero, 1, - f, 0, zero, 0, one, ensemble_size) - m.Neumann(pbl, 'load 2', 'load', 0, zero, 1, - - f, 0, zero, 0, one, ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Ensemble Convergence Tolerance'] = 1e-6 - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 3 - mueluParams['max levels'] = 1 - mueluParams['coarse: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "MT Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = Ngs - mueluParamsSub2['relaxation: damping factor'] = omegags - - mueluParams['verbosity'] = "high" - - mueluParams['coarse: params'] = mueluParamsSub2 - - solverList['convert MueLu xml file'] = True - solverList['mueluParams'] = mueluParams - - solverList['Print Teuchos timers'] = True - - solverList['gamma'] = p['gamma'] - solverList['Use preconditioner'] = True - - solverList['type'] = 'BlockGmres' - solverList['Maximum active set iteration'] = 1 - - solverList['Write matrix and vectors'] = p['Write matrix and vectors'] - solverList['Write txt files'] = p['Write txt files'] - - if p["Is exp"]: - num_random_variables = randomVariable.shape[1] - else: - num_random_variables = 0 - - for i in range(0, num_random_variables): - rand = randomVariable[:, i] - pbl.add(m.RandomVariable(rand)) - - randomParams = Teuchos.ParameterList() - - randomParams['Is random'] = True - randomParams['Is exp'] = p['Is exp'] - if p["Is exp"]: - randomParams['Begin X'] = 0. - randomParams['Begin Y'] = 0. - randomParams['Begin Z'] = 0. - randomParams['End X'] = 10. - randomParams['End Y'] = 10. - randomParams['End Z'] = 1. - randomParams['Number random variables'] = num_random_variables - randomParams['Correlation length X'] = p['Correlation length X'] - randomParams['Correlation length Y'] = p['Correlation length Y'] - randomParams['Correlation length Z'] = p['Correlation length Z'] - randomParams['Number of KL Terms X'] = p['Number of KL Terms X'] - randomParams['Number of KL Terms Y'] = p['Number of KL Terms Y'] - randomParams['Number of KL Terms Z'] = p['Number of KL Terms Z'] - randomParams['Maximum Nonlinear Solver Iterations'] = 5000 - randomParams['Bound Perturbation Size'] = 1E-10 - else: - randomParams['Correlation length'] = p['Correlation length'] - randomParams['Wavenumber cutoff'] = p['Wavenumber cutoff'] - randomParams['Wavenumber discretization points'] = p['Wavenumber discretization points'] - randomParams['Number Z of previously drawn samples'] = p['Number Z of previously drawn samples'] - randomParams['Number Phi of previously drawn samples'] = p['Number Phi of previously drawn samples'] - - randomParams['Mean'] = E[0] / (2.*(1.+nu[0])) - randomParams['Dispersion level'] = p['Dispersion level'] - - solverList['randomParams'] = randomParams - - slv = m.IterativeSolver(pbl, args.k, solverList, 3, ensemble_size) - slv.start() - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - -def evaluate_all_prec(msh, comm, file_dir, prec_params): - - N = prec_params.shape[0] - - for i in range(0, N): - directory = str(i) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - current_dir = os.getcwd() - - Ngs = int(prec_params[i, 0]) - omegags = prec_params[i, 1] - - directory = 'mean_case' - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_prec(msh, comm, file_dir, Ngs, omegags) - os.chdir('..') - - for ensemble_size in [8]: - directory = 'ensemble_reduction_' + str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_prec(msh, - comm, - file_dir, - Ngs, omegags, - ensemble_size=ensemble_size) - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = gmsh.MeshLoader('plate.geo', file_dir).execute() - - GS_sweeps_00_min = 1 - GS_sweeps_00_max = 41 - delta_GS_sweeps_00 = 1 - - N_GS_sweeps_00 = int( - np.ceil( - ((GS_sweeps_00_max - GS_sweeps_00_min * 1.) / delta_GS_sweeps_00))) - - # Damping has to be between 0 and 2 - GS_damping_00_min = 0.001 - GS_damping_00_max = 1.999 - N_GS_damping_00 = 50 - - sweeps_00 = np.arange(GS_sweeps_00_min, GS_sweeps_00_max, - delta_GS_sweeps_00) - damping_00 = np.linspace(GS_damping_00_min, GS_damping_00_max, - N_GS_damping_00) - - N = N_GS_sweeps_00 * N_GS_damping_00 - - prec_params = np.zeros((N, 2)) - - i = 0 - - for i_0 in range(0, N_GS_sweeps_00): - for i_1 in range(0, N_GS_damping_00): - prec_params[i, :] = [ - sweeps_00[i_0], damping_00[i_1] - ] - i = i + 1 - - np.savetxt('prec_params.txt', prec_params) - - evaluate_all_prec(msh, comm, file_dir, prec_params) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/fused_plate_mean_prec_GS_2.py b/katoptron/CMAME/old_tests/fused_plate_mean_prec_GS_2.py deleted file mode 100644 index a0ec6175..00000000 --- a/katoptron/CMAME/old_tests/fused_plate_mean_prec_GS_2.py +++ /dev/null @@ -1,248 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_prec(msh, comm, file_dir, Ngs, omegags, ensemble_size=1): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - - N = ensemble_size - num_random_variables = 20 - randomVariable = np.zeros((N, num_random_variables)) - if ensemble_size is not 1: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = 0 - p['Number Phi of previously drawn samples'] = 0 - p['Is exp'] = False - - pbl = m.Problem(msh, comm) - - # Units are in mm - E = 70000 * np.ones(ensemble_size) # 70e9 Pa = 70000 MPa - nu = 0.35 * np.ones(ensemble_size) - k = 0. - d = 0. - m.Medium(pbl, "body", "test", E, nu, k, d) - - m.Dirichlet(pbl, "clamped xyz", "Clamped", 1, 0., - 1, 0., 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "clamped xy", "Clamped", 1, 0., - 1, 0., 0, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "clamped y", "Clamped", 0, 0., - 1, 0., 0, 0., 0, 0., ensemble_size) - - f = 700 * np.ones(ensemble_size) # 700e6 Pa = 700 MPa - zero = np.zeros(ensemble_size) - one = np.ones(ensemble_size) - m.Neumann(pbl, 'load 1', 'load', 0, zero, 1, - f, 0, zero, 0, one, ensemble_size) - m.Neumann(pbl, 'load 2', 'load', 0, zero, 1, - - f, 0, zero, 0, one, ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Ensemble Convergence Tolerance'] = 1e-6 - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 3 - mueluParams['max levels'] = 1 - mueluParams['coarse: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "MT Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = Ngs - mueluParamsSub2['relaxation: damping factor'] = omegags - - mueluParams['verbosity'] = "high" - - mueluParams['coarse: params'] = mueluParamsSub2 - - solverList['convert MueLu xml file'] = True - solverList['mueluParams'] = mueluParams - - solverList['Print Teuchos timers'] = True - - solverList['gamma'] = p['gamma'] - solverList['Use preconditioner'] = True - - solverList['type'] = 'BlockGmres' - solverList['Maximum active set iteration'] = 1 - - solverList['Write matrix and vectors'] = p['Write matrix and vectors'] - solverList['Write txt files'] = p['Write txt files'] - - if p["Is exp"]: - num_random_variables = randomVariable.shape[1] - else: - num_random_variables = 0 - - for i in range(0, num_random_variables): - rand = randomVariable[:, i] - pbl.add(m.RandomVariable(rand)) - - randomParams = Teuchos.ParameterList() - - randomParams['Is random'] = True - randomParams['Is exp'] = p['Is exp'] - if p["Is exp"]: - randomParams['Begin X'] = 0. - randomParams['Begin Y'] = 0. - randomParams['Begin Z'] = 0. - randomParams['End X'] = 10. - randomParams['End Y'] = 10. - randomParams['End Z'] = 1. - randomParams['Number random variables'] = num_random_variables - randomParams['Correlation length X'] = p['Correlation length X'] - randomParams['Correlation length Y'] = p['Correlation length Y'] - randomParams['Correlation length Z'] = p['Correlation length Z'] - randomParams['Number of KL Terms X'] = p['Number of KL Terms X'] - randomParams['Number of KL Terms Y'] = p['Number of KL Terms Y'] - randomParams['Number of KL Terms Z'] = p['Number of KL Terms Z'] - randomParams['Maximum Nonlinear Solver Iterations'] = 5000 - randomParams['Bound Perturbation Size'] = 1E-10 - else: - randomParams['Correlation length'] = p['Correlation length'] - randomParams['Wavenumber cutoff'] = p['Wavenumber cutoff'] - randomParams['Wavenumber discretization points'] = p['Wavenumber discretization points'] - randomParams['Number Z of previously drawn samples'] = p['Number Z of previously drawn samples'] - randomParams['Number Phi of previously drawn samples'] = p['Number Phi of previously drawn samples'] - - randomParams['Mean'] = E[0] / (2.*(1.+nu[0])) - randomParams['Dispersion level'] = p['Dispersion level'] - - solverList['randomParams'] = randomParams - - slv = m.IterativeSolver(pbl, args.k, solverList, 3, ensemble_size) - slv.start() - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - -def evaluate_all_prec(msh, comm, file_dir, prec_params): - - N = prec_params.shape[0] - - for i in range(500, 1000): - directory = str(i) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - current_dir = os.getcwd() - - Ngs = int(prec_params[i, 0]) - omegags = prec_params[i, 1] - - directory = 'mean_case' - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_prec(msh, comm, file_dir, Ngs, omegags) - os.chdir('..') - - for ensemble_size in [8]: - directory = 'ensemble_reduction_' + str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_prec(msh, - comm, - file_dir, - Ngs, omegags, - ensemble_size=ensemble_size) - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = gmsh.MeshLoader('plate.geo', file_dir).execute() - - GS_sweeps_00_min = 1 - GS_sweeps_00_max = 41 - delta_GS_sweeps_00 = 1 - - N_GS_sweeps_00 = int( - np.ceil( - ((GS_sweeps_00_max - GS_sweeps_00_min * 1.) / delta_GS_sweeps_00))) - - # Damping has to be between 0 and 2 - GS_damping_00_min = 0.001 - GS_damping_00_max = 1.999 - N_GS_damping_00 = 50 - - sweeps_00 = np.arange(GS_sweeps_00_min, GS_sweeps_00_max, - delta_GS_sweeps_00) - damping_00 = np.linspace(GS_damping_00_min, GS_damping_00_max, - N_GS_damping_00) - - N = N_GS_sweeps_00 * N_GS_damping_00 - - prec_params = np.zeros((N, 2)) - - i = 0 - - for i_0 in range(0, N_GS_sweeps_00): - for i_1 in range(0, N_GS_damping_00): - prec_params[i, :] = [ - sweeps_00[i_0], damping_00[i_1] - ] - i = i + 1 - - np.savetxt('prec_params.txt', prec_params) - - evaluate_all_prec(msh, comm, file_dir, prec_params) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/fused_plate_mean_prec_GS_3.py b/katoptron/CMAME/old_tests/fused_plate_mean_prec_GS_3.py deleted file mode 100644 index db9723d0..00000000 --- a/katoptron/CMAME/old_tests/fused_plate_mean_prec_GS_3.py +++ /dev/null @@ -1,248 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_prec(msh, comm, file_dir, Ngs, omegags, ensemble_size=1): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - - N = ensemble_size - num_random_variables = 20 - randomVariable = np.zeros((N, num_random_variables)) - if ensemble_size is not 1: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = 0 - p['Number Phi of previously drawn samples'] = 0 - p['Is exp'] = False - - pbl = m.Problem(msh, comm) - - # Units are in mm - E = 70000 * np.ones(ensemble_size) # 70e9 Pa = 70000 MPa - nu = 0.35 * np.ones(ensemble_size) - k = 0. - d = 0. - m.Medium(pbl, "body", "test", E, nu, k, d) - - m.Dirichlet(pbl, "clamped xyz", "Clamped", 1, 0., - 1, 0., 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "clamped xy", "Clamped", 1, 0., - 1, 0., 0, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "clamped y", "Clamped", 0, 0., - 1, 0., 0, 0., 0, 0., ensemble_size) - - f = 700 * np.ones(ensemble_size) # 700e6 Pa = 700 MPa - zero = np.zeros(ensemble_size) - one = np.ones(ensemble_size) - m.Neumann(pbl, 'load 1', 'load', 0, zero, 1, - f, 0, zero, 0, one, ensemble_size) - m.Neumann(pbl, 'load 2', 'load', 0, zero, 1, - - f, 0, zero, 0, one, ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Ensemble Convergence Tolerance'] = 1e-6 - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 3 - mueluParams['max levels'] = 1 - mueluParams['coarse: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "MT Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = Ngs - mueluParamsSub2['relaxation: damping factor'] = omegags - - mueluParams['verbosity'] = "high" - - mueluParams['coarse: params'] = mueluParamsSub2 - - solverList['convert MueLu xml file'] = True - solverList['mueluParams'] = mueluParams - - solverList['Print Teuchos timers'] = True - - solverList['gamma'] = p['gamma'] - solverList['Use preconditioner'] = True - - solverList['type'] = 'BlockGmres' - solverList['Maximum active set iteration'] = 1 - - solverList['Write matrix and vectors'] = p['Write matrix and vectors'] - solverList['Write txt files'] = p['Write txt files'] - - if p["Is exp"]: - num_random_variables = randomVariable.shape[1] - else: - num_random_variables = 0 - - for i in range(0, num_random_variables): - rand = randomVariable[:, i] - pbl.add(m.RandomVariable(rand)) - - randomParams = Teuchos.ParameterList() - - randomParams['Is random'] = True - randomParams['Is exp'] = p['Is exp'] - if p["Is exp"]: - randomParams['Begin X'] = 0. - randomParams['Begin Y'] = 0. - randomParams['Begin Z'] = 0. - randomParams['End X'] = 10. - randomParams['End Y'] = 10. - randomParams['End Z'] = 1. - randomParams['Number random variables'] = num_random_variables - randomParams['Correlation length X'] = p['Correlation length X'] - randomParams['Correlation length Y'] = p['Correlation length Y'] - randomParams['Correlation length Z'] = p['Correlation length Z'] - randomParams['Number of KL Terms X'] = p['Number of KL Terms X'] - randomParams['Number of KL Terms Y'] = p['Number of KL Terms Y'] - randomParams['Number of KL Terms Z'] = p['Number of KL Terms Z'] - randomParams['Maximum Nonlinear Solver Iterations'] = 5000 - randomParams['Bound Perturbation Size'] = 1E-10 - else: - randomParams['Correlation length'] = p['Correlation length'] - randomParams['Wavenumber cutoff'] = p['Wavenumber cutoff'] - randomParams['Wavenumber discretization points'] = p['Wavenumber discretization points'] - randomParams['Number Z of previously drawn samples'] = p['Number Z of previously drawn samples'] - randomParams['Number Phi of previously drawn samples'] = p['Number Phi of previously drawn samples'] - - randomParams['Mean'] = E[0] / (2.*(1.+nu[0])) - randomParams['Dispersion level'] = p['Dispersion level'] - - solverList['randomParams'] = randomParams - - slv = m.IterativeSolver(pbl, args.k, solverList, 3, ensemble_size) - slv.start() - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - -def evaluate_all_prec(msh, comm, file_dir, prec_params): - - N = prec_params.shape[0] - - for i in range(1000, 1500): - directory = str(i) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - current_dir = os.getcwd() - - Ngs = int(prec_params[i, 0]) - omegags = prec_params[i, 1] - - directory = 'mean_case' - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_prec(msh, comm, file_dir, Ngs, omegags) - os.chdir('..') - - for ensemble_size in [8]: - directory = 'ensemble_reduction_' + str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_prec(msh, - comm, - file_dir, - Ngs, omegags, - ensemble_size=ensemble_size) - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = gmsh.MeshLoader('plate.geo', file_dir).execute() - - GS_sweeps_00_min = 1 - GS_sweeps_00_max = 41 - delta_GS_sweeps_00 = 1 - - N_GS_sweeps_00 = int( - np.ceil( - ((GS_sweeps_00_max - GS_sweeps_00_min * 1.) / delta_GS_sweeps_00))) - - # Damping has to be between 0 and 2 - GS_damping_00_min = 0.001 - GS_damping_00_max = 1.999 - N_GS_damping_00 = 50 - - sweeps_00 = np.arange(GS_sweeps_00_min, GS_sweeps_00_max, - delta_GS_sweeps_00) - damping_00 = np.linspace(GS_damping_00_min, GS_damping_00_max, - N_GS_damping_00) - - N = N_GS_sweeps_00 * N_GS_damping_00 - - prec_params = np.zeros((N, 2)) - - i = 0 - - for i_0 in range(0, N_GS_sweeps_00): - for i_1 in range(0, N_GS_damping_00): - prec_params[i, :] = [ - sweeps_00[i_0], damping_00[i_1] - ] - i = i + 1 - - np.savetxt('prec_params.txt', prec_params) - - evaluate_all_prec(msh, comm, file_dir, prec_params) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/fused_plate_mean_prec_GS_4.py b/katoptron/CMAME/old_tests/fused_plate_mean_prec_GS_4.py deleted file mode 100644 index 714a034b..00000000 --- a/katoptron/CMAME/old_tests/fused_plate_mean_prec_GS_4.py +++ /dev/null @@ -1,248 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_prec(msh, comm, file_dir, Ngs, omegags, ensemble_size=1): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - - N = ensemble_size - num_random_variables = 20 - randomVariable = np.zeros((N, num_random_variables)) - if ensemble_size is not 1: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = 0 - p['Number Phi of previously drawn samples'] = 0 - p['Is exp'] = False - - pbl = m.Problem(msh, comm) - - # Units are in mm - E = 70000 * np.ones(ensemble_size) # 70e9 Pa = 70000 MPa - nu = 0.35 * np.ones(ensemble_size) - k = 0. - d = 0. - m.Medium(pbl, "body", "test", E, nu, k, d) - - m.Dirichlet(pbl, "clamped xyz", "Clamped", 1, 0., - 1, 0., 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "clamped xy", "Clamped", 1, 0., - 1, 0., 0, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "clamped y", "Clamped", 0, 0., - 1, 0., 0, 0., 0, 0., ensemble_size) - - f = 700 * np.ones(ensemble_size) # 700e6 Pa = 700 MPa - zero = np.zeros(ensemble_size) - one = np.ones(ensemble_size) - m.Neumann(pbl, 'load 1', 'load', 0, zero, 1, - f, 0, zero, 0, one, ensemble_size) - m.Neumann(pbl, 'load 2', 'load', 0, zero, 1, - - f, 0, zero, 0, one, ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Ensemble Convergence Tolerance'] = 1e-6 - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 3 - mueluParams['max levels'] = 1 - mueluParams['coarse: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "MT Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = Ngs - mueluParamsSub2['relaxation: damping factor'] = omegags - - mueluParams['verbosity'] = "high" - - mueluParams['coarse: params'] = mueluParamsSub2 - - solverList['convert MueLu xml file'] = True - solverList['mueluParams'] = mueluParams - - solverList['Print Teuchos timers'] = True - - solverList['gamma'] = p['gamma'] - solverList['Use preconditioner'] = True - - solverList['type'] = 'BlockGmres' - solverList['Maximum active set iteration'] = 1 - - solverList['Write matrix and vectors'] = p['Write matrix and vectors'] - solverList['Write txt files'] = p['Write txt files'] - - if p["Is exp"]: - num_random_variables = randomVariable.shape[1] - else: - num_random_variables = 0 - - for i in range(0, num_random_variables): - rand = randomVariable[:, i] - pbl.add(m.RandomVariable(rand)) - - randomParams = Teuchos.ParameterList() - - randomParams['Is random'] = True - randomParams['Is exp'] = p['Is exp'] - if p["Is exp"]: - randomParams['Begin X'] = 0. - randomParams['Begin Y'] = 0. - randomParams['Begin Z'] = 0. - randomParams['End X'] = 10. - randomParams['End Y'] = 10. - randomParams['End Z'] = 1. - randomParams['Number random variables'] = num_random_variables - randomParams['Correlation length X'] = p['Correlation length X'] - randomParams['Correlation length Y'] = p['Correlation length Y'] - randomParams['Correlation length Z'] = p['Correlation length Z'] - randomParams['Number of KL Terms X'] = p['Number of KL Terms X'] - randomParams['Number of KL Terms Y'] = p['Number of KL Terms Y'] - randomParams['Number of KL Terms Z'] = p['Number of KL Terms Z'] - randomParams['Maximum Nonlinear Solver Iterations'] = 5000 - randomParams['Bound Perturbation Size'] = 1E-10 - else: - randomParams['Correlation length'] = p['Correlation length'] - randomParams['Wavenumber cutoff'] = p['Wavenumber cutoff'] - randomParams['Wavenumber discretization points'] = p['Wavenumber discretization points'] - randomParams['Number Z of previously drawn samples'] = p['Number Z of previously drawn samples'] - randomParams['Number Phi of previously drawn samples'] = p['Number Phi of previously drawn samples'] - - randomParams['Mean'] = E[0] / (2.*(1.+nu[0])) - randomParams['Dispersion level'] = p['Dispersion level'] - - solverList['randomParams'] = randomParams - - slv = m.IterativeSolver(pbl, args.k, solverList, 3, ensemble_size) - slv.start() - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - -def evaluate_all_prec(msh, comm, file_dir, prec_params): - - N = prec_params.shape[0] - - for i in range(1500, N): - directory = str(i) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - current_dir = os.getcwd() - - Ngs = int(prec_params[i, 0]) - omegags = prec_params[i, 1] - - directory = 'mean_case' - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_prec(msh, comm, file_dir, Ngs, omegags) - os.chdir('..') - - for ensemble_size in [8]: - directory = 'ensemble_reduction_' + str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_prec(msh, - comm, - file_dir, - Ngs, omegags, - ensemble_size=ensemble_size) - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = gmsh.MeshLoader('plate.geo', file_dir).execute() - - GS_sweeps_00_min = 1 - GS_sweeps_00_max = 41 - delta_GS_sweeps_00 = 1 - - N_GS_sweeps_00 = int( - np.ceil( - ((GS_sweeps_00_max - GS_sweeps_00_min * 1.) / delta_GS_sweeps_00))) - - # Damping has to be between 0 and 2 - GS_damping_00_min = 0.001 - GS_damping_00_max = 1.999 - N_GS_damping_00 = 50 - - sweeps_00 = np.arange(GS_sweeps_00_min, GS_sweeps_00_max, - delta_GS_sweeps_00) - damping_00 = np.linspace(GS_damping_00_min, GS_damping_00_max, - N_GS_damping_00) - - N = N_GS_sweeps_00 * N_GS_damping_00 - - prec_params = np.zeros((N, 2)) - - i = 0 - - for i_0 in range(0, N_GS_sweeps_00): - for i_1 in range(0, N_GS_damping_00): - prec_params[i, :] = [ - sweeps_00[i_0], damping_00[i_1] - ] - i = i + 1 - - np.savetxt('prec_params.txt', prec_params) - - evaluate_all_prec(msh, comm, file_dir, prec_params) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate.py b/katoptron/CMAME/old_tests/plate.py deleted file mode 100644 index 01b9e96d..00000000 --- a/katoptron/CMAME/old_tests/plate.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def main(): - - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 1 - num_random_variables = 20 - #randomVariable = np.random.normal(0, 1, num_random_variables*N) - #randomVariable = np.resize(randomVariable,(N,num_random_variables)) - randomVariable = np.zeros((N, num_random_variables)) - - p = model.defaut_params - p['MueLu xml from current_dir'] = False - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/../tests/direct_solver.xml' - p['Write txt files'] = True - p['Write matrix and vectors'] = True - - ensemble_size = 1 - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_GS_all_cases.py b/katoptron/CMAME/old_tests/plate_MC_GS_all_cases.py deleted file mode 100644 index e54831da..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_GS_all_cases.py +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -"""@package docstring -This test runs the four different cases as defined in table 2 of the paper -with a SIMPLE-GS-GS preconditioner. -""" - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def get_parameters(case_id, first_sample_id): - """ - This function returns the python dictionary that includes - the parameters for a given test case - """ - p = model.defaut_params - - if case_id == 1: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.1 - elif case_id == 2: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.3 - elif case_id == 3: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - elif case_id == 4: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.3 - elif case_id == 5: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.1 - elif case_id == 6: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.3 - - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = first_sample_id * nuw**2 - p['Number Phi of previously drawn samples'] = first_sample_id * nuw**2 - - p['Is exp'] = False - return p - - -def evaluate_one_ensemble(ensemble_size, case_id, first_sample_id, msh, comm, - file_dir): - """ - This function evaluates one ensemble for a given test case - """ - work_dir = os.getcwd() - args = parseargs() - - p = get_parameters(case_id, first_sample_id) - - pm = model.plate_model(ensemble_size, np.array([0]), msh, comm, file_dir, - work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_sizes, case_ids, N, msh, comm, file_dir): - """ - This function loop over the test cases, the ensemble sizes, - and the ensembles - """ - for case_id in case_ids: - directory_case_id = 'case_' + str(case_id) - if not os.path.exists(directory_case_id): - os.makedirs(directory_case_id) - os.chdir(directory_case_id) - for ensemble_size in ensemble_sizes: - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - first_sample_id = ensemble_index * ensemble_size - - evaluate_one_ensemble(ensemble_size, case_id, first_sample_id, - msh, comm, file_dir) - os.chdir('..') - os.chdir('..') - os.chdir('..') - - -def main(): - """ - This loads the mesh and define the case ids and ensemble sizes - """ - comm, rank, size = m.utilities.import_MPI() - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.geo', 'plate_1_tmp', 'plate_2.geo', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - N = 960 - ensemble_sizes = [1, 8, 16, 32] - case_ids = [1, 2, 3, 4, 5, 6] - - evaluate_all_ensembles(ensemble_sizes, case_ids, N, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_GS_case_1.py b/katoptron/CMAME/old_tests/plate_MC_GS_case_1.py deleted file mode 100644 index 872bc1f4..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_GS_case_1.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 96 - num_random_variables = 20 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(8, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(16, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(32, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_GS_case_2.py b/katoptron/CMAME/old_tests/plate_MC_GS_case_2.py deleted file mode 100644 index b0ae7acf..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_GS_case_2.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['Dispersion level'] = 0.3 - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 96 - num_random_variables = 20 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(8, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(16, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(32, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_GS_case_3.py b/katoptron/CMAME/old_tests/plate_MC_GS_case_3.py deleted file mode 100644 index 5a370e81..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_GS_case_3.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['Correlation length X'] = 10. - p['Correlation length Y'] = 10. - p['Number of KL Terms X'] = 15 - p['Number of KL Terms Y'] = 15 - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 96 - num_random_variables = 70 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(8, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(16, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(32, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_GS_case_4.py b/katoptron/CMAME/old_tests/plate_MC_GS_case_4.py deleted file mode 100644 index 9dd999aa..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_GS_case_4.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['Correlation length X'] = 10. - p['Correlation length Y'] = 10. - p['Number of KL Terms X'] = 15 - p['Number of KL Terms Y'] = 15 - p['Dispersion level'] = 0.3 - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 96 - num_random_variables = 70 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(8, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(16, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(32, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_GS_direct_all_cases.py b/katoptron/CMAME/old_tests/plate_MC_GS_direct_all_cases.py deleted file mode 100644 index 7019bce9..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_GS_direct_all_cases.py +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -"""@package docstring -This test runs the four different cases as defined in table 2 of the paper -with a SIMPLE-GS-GS preconditioner. -""" -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def get_parameters(case_id, first_sample_id): - """ - This function returns the python dictionary that includes - the parameters for a given test case - """ - p = model.defaut_params - - if case_id == 1: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.1 - elif case_id == 2: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.3 - elif case_id == 3: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - elif case_id == 4: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.3 - elif case_id == 5: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.1 - elif case_id == 6: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.3 - - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = first_sample_id * nuw**2 - p['Number Phi of previously drawn samples'] = first_sample_id * nuw**2 - - p['MueLu xml file name'] = '/SIMPLE_GS_direct.xml' - p['MueLu xml template file name'] = '/../preconditioners/SIMPLE_gs_direct.xml.in' - p['MueLu xml params name'] = ['$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_00_GS_damping', - '$SCHUR_omega', '$SimpleSmoother_damping'] - p['MueLu xml params'] = [ - '3', '3', '16', '1.8', '1', '1' - ] - - p['Is exp'] = False - p['gamma'] = 0. - return p - - -def evaluate_one_ensemble(ensemble_size, case_id, first_sample_id, msh, comm, - file_dir): - """ - This function evaluates one ensemble for a given test case - """ - work_dir = os.getcwd() - args = parseargs() - - p = get_parameters(case_id, first_sample_id) - - pm = model.plate_model(ensemble_size, np.array([0]), msh, comm, file_dir, - work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_sizes, case_ids, N, msh, comm, file_dir): - """ - This function loop over the test cases, the ensemble sizes, - and the ensembles - """ - for case_id in case_ids: - directory_case_id = 'case_' + str(case_id) - if not os.path.exists(directory_case_id): - os.makedirs(directory_case_id) - os.chdir(directory_case_id) - for ensemble_size in ensemble_sizes: - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N_ensemble = (N // ensemble_size) - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - first_sample_id = ensemble_index * ensemble_size - - evaluate_one_ensemble(ensemble_size, case_id, first_sample_id, - msh, comm, file_dir) - os.chdir('..') - os.chdir('..') - os.chdir('..') - - -def main(): - """ - This loads the mesh and define the case ids and ensemble sizes - """ - comm, rank, size = m.utilities.import_MPI() - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.geo', 'plate_1_tmp', 'plate_2.geo', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - N = 96 - ensemble_sizes = [1, 8, 16, 32] - case_ids = [1, 2, 3, 4, 5, 6] - - evaluate_all_ensembles(ensemble_sizes, case_ids, N, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_MG_all_cases.py b/katoptron/CMAME/old_tests/plate_MC_MG_all_cases.py deleted file mode 100644 index b31f9c5d..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_MG_all_cases.py +++ /dev/null @@ -1,156 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -"""@package docstring -This test runs the four different cases as defined in table 2 of the paper -with a SIMPLE-GS-GS preconditioner. -""" - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def get_parameters(case_id, first_sample_id): - """ - This function returns the python dictionary that includes - the parameters for a given test case - """ - p = model.defaut_params - - if case_id == 0: - p['Is random'] = False - elif case_id == 1: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.1 - elif case_id == 2: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.3 - elif case_id == 3: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - elif case_id == 4: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.3 - elif case_id == 5: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.1 - elif case_id == 6: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.3 - - if p['Is random'] == True: - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = first_sample_id * nuw**2 - p['Number Phi of previously drawn samples'] = first_sample_id * nuw**2 - - p['MueLu xml file name'] = '/SIMPLE_MG.xml' - p['MueLu xml template file name'] = '/../preconditioners/SIMPLE_gs_direct_lvl.xml.in' - p['MueLu xml params name'] = ['$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_00_GS_damping', - '$SCHUR_omega', '$SimpleSmoother_damping', "$N_LVLS", "$N_SIZES", "$EXPORT_DATA", "$SimpleSmoother_sweeps"] - p['MueLu xml params'] = [ - '3', '3', '3', '0.8', '0.8', '1', '2', '18', "true", '1' - ] - - p['Is exp'] = False - p['gamma'] = 0. - return p - - -def evaluate_one_ensemble(ensemble_size, case_id, first_sample_id, msh, comm, - file_dir): - """ - This function evaluates one ensemble for a given test case - """ - work_dir = os.getcwd() - args = parseargs() - - p = get_parameters(case_id, first_sample_id) - - pm = model.plate_model(ensemble_size, np.array([0]), msh, comm, file_dir, - work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_sizes, case_ids, N, msh, comm, file_dir): - """ - This function loop over the test cases, the ensemble sizes, - and the ensembles - """ - for case_id in case_ids: - directory_case_id = 'case_' + str(case_id) - if not os.path.exists(directory_case_id): - os.makedirs(directory_case_id) - os.chdir(directory_case_id) - for ensemble_size in ensemble_sizes: - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N_ensemble = (N // ensemble_size) - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - first_sample_id = ensemble_index * ensemble_size - - evaluate_one_ensemble(ensemble_size, case_id, first_sample_id, - msh, comm, file_dir) - os.chdir('..') - os.chdir('..') - os.chdir('..') - - -def main(): - """ - This loads the mesh and define the case ids and ensemble sizes - """ - comm, rank, size = m.utilities.import_MPI() - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.geo', 'plate_1_tmp', 'plate_2.geo', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - deterministic = True - - if deterministic: - N = 1 - ensemble_sizes = [1] - case_ids = [0] - else: - N = 64 - ensemble_sizes = [1, 8, 16, 32] - case_ids = [1, 2, 3, 4, 5, 6] - - evaluate_all_ensembles(ensemble_sizes, case_ids, N, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_MG_all_cases_2.py b/katoptron/CMAME/old_tests/plate_MC_MG_all_cases_2.py deleted file mode 100644 index 7c90bac1..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_MG_all_cases_2.py +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -"""@package docstring -This test runs the four different cases as defined in table 2 of the paper -with a SIMPLE-GS-GS preconditioner. -""" - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def get_parameters(case_id, first_sample_id): - """ - This function returns the python dictionary that includes - the parameters for a given test case - """ - p = model.defaut_params - - if case_id == 0: - p['Is random'] = False - elif case_id == 1: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.1 - elif case_id == 2: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.3 - elif case_id == 3: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - elif case_id == 4: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.3 - elif case_id == 5: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.1 - elif case_id == 6: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.3 - - if p['Is random'] == True: - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = first_sample_id * nuw**2 - p['Number Phi of previously drawn samples'] = first_sample_id * nuw**2 - - p['MueLu xml file name'] = '/SIMPLE_MG.xml' - p['MueLu xml template file name'] = '/../../preconditioners/SIMPLE_gs_direct_lvl_MT.xml.in' - p['MueLu xml params name'] = [ - '$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_00_GS_damping', '$SCHUR_omega', - '$SimpleSmoother_damping', "$N_LVLS", "$N_SIZES", "$EXPORT_DATA", - "$SimpleSmoother_sweeps" - ] - p['MueLu xml params'] = [ - '3', '3', '3', '0.8', '0.8', '1', '2', '18', "true", '1' - ] - - p['Is exp'] = False - #p['gamma'] = 0. - return p - - -def evaluate_one_ensemble(ensemble_size, case_id, first_sample_id, msh, comm, - file_dir): - """ - This function evaluates one ensemble for a given test case - """ - work_dir = os.getcwd() - args = parseargs() - - p = get_parameters(case_id, first_sample_id) - - pm = model.plate_model(ensemble_size, np.array([0]), msh, comm, file_dir, - work_dir, p) - pm.run() - - -def evaluate_all_ensembles(ensemble_sizes, case_ids, N, msh, comm, file_dir): - """ - This function loop over the test cases, the ensemble sizes, - and the ensembles - """ - for case_id in case_ids: - directory_case_id = 'case_' + str(case_id) - if not os.path.exists(directory_case_id): - os.makedirs(directory_case_id) - os.chdir(directory_case_id) - for ensemble_size in ensemble_sizes: - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N_ensemble = (N // ensemble_size) - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - first_sample_id = ensemble_index * ensemble_size - - evaluate_one_ensemble(ensemble_size, case_id, first_sample_id, - msh, comm, file_dir) - os.chdir('..') - os.chdir('..') - os.chdir('..') - - -def main(): - """ - This loads the mesh and define the case ids and ensemble sizes - """ - comm, rank, size = m.utilities.import_MPI() - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.geo', 'plate_1_tmp', 'plate_2.geo', - 'plate_2_tmp', 'plate_fused', file_dir + '/../mesh', - work_dir, comm, rank, size) - - deterministic = False - - if deterministic: - N = 1 - ensemble_sizes = [1] - case_ids = [0] - else: - N = 64 - ensemble_sizes = [1, 8, 16, 32] - case_ids = [1, 2, 3, 4, 5, 6] - - nThreads = u.Initialize_Kokkos() - evaluate_all_ensembles(ensemble_sizes, case_ids, N, msh, comm, file_dir) - u.Finalize_Kokkos() - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_1.py b/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_1.py deleted file mode 100644 index b6cbaf52..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_1.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['MueLu xml from current_dir'] = False - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/../preconditioners/SIMPLE_direct.xml' - - p['Write txt files'] = True - p['Write matrix and vectors'] = True - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = (N // ensemble_size) - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 32 - num_random_variables = 20 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_1_sp.py b/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_1_sp.py deleted file mode 100644 index 17fbd571..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_1_sp.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, index, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - nuw = 128 - - p = model.defaut_params - p["Correlation length"] = 5. - p["Wavenumber cutoff"] = 8. - p["Wavenumber discretization points"] = nuw - - p["Number Z of previously drawn samples"] = index*nuw**2 - p["Number Phi of previously drawn samples"] = index*nuw**2 - - p["Is exp"] = False - - pm = model.plate_model( - ensemble_size, [0.], msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, N, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N_ensemble = (N // ensemble_size) - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble( - ensemble_size, ensemble_index, msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - N = 2 - - evaluate_all_ensembles(1, N, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_2.py b/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_2.py deleted file mode 100644 index d1b1b4a2..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_2.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['MueLu xml from current_dir'] = False - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/../preconditioners/SIMPLE_direct.xml' - - p['Dispersion level'] = 0.3 - - p['Write txt files'] = True - p['Write matrix and vectors'] = True - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = (N // ensemble_size) - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 32 - num_random_variables = 20 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_3.py b/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_3.py deleted file mode 100644 index 901fc84f..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_3.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['MueLu xml from current_dir'] = False - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/../preconditioners/SIMPLE_direct.xml' - - p['Correlation length X'] = 5. - p['Correlation length Y'] = 5. - p['Number of KL Terms X'] = 15 - p['Number of KL Terms Y'] = 15 - - p['Write txt files'] = True - p['Write matrix and vectors'] = True - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = (N // ensemble_size) - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 32 - num_random_variables = 105 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_4.py b/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_4.py deleted file mode 100644 index e35f3a2a..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_NO_EP_case_4.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['MueLu xml from current_dir'] = False - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/../preconditioners/SIMPLE_direct.xml' - - p['Correlation length X'] = 5. - p['Correlation length Y'] = 5. - p['Number of KL Terms X'] = 15 - p['Number of KL Terms Y'] = 15 - p['Dispersion level'] = 0.3 - - p['Write txt files'] = True - p['Write matrix and vectors'] = True - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = (N // ensemble_size) - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 32 - num_random_variables = 105 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_direct_case_1.py b/katoptron/CMAME/old_tests/plate_MC_direct_case_1.py deleted file mode 100644 index dc5cebe5..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_direct_case_1.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['MueLu xml from current_dir'] = False - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/../preconditioners/SIMPLE_direct.xml' - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 96 - num_random_variables = 20 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(8, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(16, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(32, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_direct_case_2.py b/katoptron/CMAME/old_tests/plate_MC_direct_case_2.py deleted file mode 100644 index e8f8366c..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_direct_case_2.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['MueLu xml from current_dir'] = False - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/../preconditioners/SIMPLE_direct.xml' - - p['Dispersion level'] = 0.3 - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 96 - num_random_variables = 20 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(8, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(16, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(32, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_direct_case_3.py b/katoptron/CMAME/old_tests/plate_MC_direct_case_3.py deleted file mode 100644 index 72d3dfd3..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_direct_case_3.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['MueLu xml from current_dir'] = False - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/../preconditioners/SIMPLE_direct.xml' - - p['Correlation length X'] = 10. - p['Correlation length Y'] = 10. - p['Number of KL Terms X'] = 15 - p['Number of KL Terms Y'] = 15 - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 96 - num_random_variables = 70 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(8, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(16, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(32, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_MC_direct_case_4.py b/katoptron/CMAME/old_tests/plate_MC_direct_case_4.py deleted file mode 100644 index b3c8cb6c..00000000 --- a/katoptron/CMAME/old_tests/plate_MC_direct_case_4.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['MueLu xml from current_dir'] = False - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/../preconditioners/SIMPLE_direct.xml' - - p['Correlation length X'] = 10. - p['Correlation length Y'] = 10. - p['Number of KL Terms X'] = 15 - p['Number of KL Terms Y'] = 15 - p['Dispersion level'] = 0.3 - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 96 - num_random_variables = 70 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(8, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(16, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(32, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_convergence_direct.py b/katoptron/CMAME/old_tests/plate_convergence_direct.py deleted file mode 100644 index e133243e..00000000 --- a/katoptron/CMAME/old_tests/plate_convergence_direct.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -from katoptron.eigenvalues import * -from katoptron.convergence import * -import os -import fwk - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - N = 32 - - k_max = 20 - - matrix_input_file_dir = file_dir + \ - '/../../workspace/katoptron_CMAME_tests_plate_MC_NO_EP/1/' - deltas_input_file_dir = file_dir + \ - '/../../workspace/katoptron_CMAME_tests_plate_deltas_omegas_direct/' - - for i in range(0, N): - timers = fwk.Timers() - - filename_Q = matrix_input_file_dir + str(i) + '/ApCTC_mm.txt' - filename_GT = matrix_input_file_dir + str(i) + '/B_mm.txt' - filename_f = matrix_input_file_dir + str(i) + '/b_mm_after_bc.txt' - - timers['Read files'].start() - Q = read_mm(filename_Q) - Q = get_symmetrical_part(Q) - GT = read_mm(filename_GT) - G = GT.transpose() - f = read_mm(filename_f, is_sparse=False) - A = create_block(Q, G, GT, None) - n = A.shape[0] - x0 = np.zeros((n,)) - b = np.zeros((n,)) - b[0:len(f)] = f - omegas = np.loadtxt(deltas_input_file_dir + - '/omegas_direct_direct_' + str(i) + '.txt') - n_omegas = len(omegas) - - tmp = np.loadtxt(deltas_input_file_dir + - '/deltas_direct_direct_' + str(i) + '.txt') - - deltas = np.zeros((n_omegas,), dtype=np.complex128) - deltas.real = tmp[:, 0] - deltas.imag = tmp[:, 1] - - timers['Read files'].stop() - print(timers) - - timers['Compute the convergence'].start() - convergence = compute_convergence( - k_max, n_omegas, omegas, deltas, A, b, x0, verbose=True) - timers['Compute the basconvergenceis'].stop() - print(timers) - - np.savetxt(work_dir+'/convergence_' + str(i) + '.txt', convergence) - - f = open('timers_' + str(i) + '.txt', 'w') - print(timers, file=f) - f.closed - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_correlation.py b/katoptron/CMAME/old_tests/plate_correlation.py deleted file mode 100644 index 8ddb22f9..00000000 --- a/katoptron/CMAME/old_tests/plate_correlation.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_correlation(correlation, msh, comm, file_dir, ensemble_size=1): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - - N = ensemble_size - num_random_variables = 20 - randomVariable = np.zeros((N, num_random_variables)) - - nuw = 128 - p['Correlation length'] = correlation - p['Dispersion level'] = 0.1 - - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = 0 - p['Number Phi of previously drawn samples'] = 0 - p['Is exp'] = False - - pm = model.plate_model(ensemble_size, randomVariable, msh, comm, file_dir, - work_dir, p) - pm.run(args.k) - - -def evaluate_all_correlation(correlations, msh, comm, file_dir): - - N = correlations.shape[0] - for i in range(0, N): - directory = str(i) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - for ensemble_size in [1, 8]: - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_correlation( - correlations[i], msh, comm, file_dir, ensemble_size) - os.chdir('..') - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - N = 200 - correlation_min_exp = -1 - correlation_max_exp = np.log10(2) - - correlations = np.logspace( - correlation_min_exp, correlation_max_exp, N, endpoint=True) - - np.savetxt('correlations.txt', correlations) - - evaluate_all_correlation(correlations, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_deltas_omegas_GS.py b/katoptron/CMAME/old_tests/plate_deltas_omegas_GS.py deleted file mode 100644 index 8ac06ecd..00000000 --- a/katoptron/CMAME/old_tests/plate_deltas_omegas_GS.py +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.eigenvalues import * -import os -import fwk - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - n_sweeps_Q = 10 - damp_Q = 1.6 - - n_sweeps_R = 10 - damp_R = 1.6 - - omega = 0.5 - - N = 32 - - input_file_dir = file_dir + '/../../workspace/katoptron_CMAME_tests_plate_MC_NO_EP/1/' - - sample_per_rank = np.ceil((N / siz)) - i_min = rank*sample_per_rank - i_max = i_min+sample_per_rank - - if i_min > N: - i_min = N - if i_max > N: - i_max = N - - i_min = int(i_min) - i_max = int(i_max) - - print('Rank ' + str(rank) + ' from sample ' + str(i_min) + ':' + str(i_max)) - - for i in range(i_min, i_max): - timers = fwk.Timers() - - filename_Q = input_file_dir + str(i) + '/ApCTC_mm.txt' - filename_GT = input_file_dir + str(i) + '/B_mm.txt' - filename_f = input_file_dir + str(i) + '/b_mm_after_bc.txt' - - timers['Read files'].start() - Q = read_mm(filename_Q) - Q = get_symmetrical_part(Q) - GT = read_mm(filename_GT) - G = GT.transpose() - f = read_mm(filename_f, is_sparse=False) - timers['Read files'].stop() - - timers['Compute R'].start() - R = approx_Schur_complement(Q, G, GT) - timers['Compute R'].stop() - - timers['Compute invR'].start() - invR = Gauss_Seidel(R, n=n_sweeps_R, damping=damp_R) - timers['Compute invR'].stop() - - print(timers) - - timers['Compute the inverse of Q'].start() - invQ = Gauss_Seidel(Q, n=n_sweeps_Q, damping=damp_Q) - timers['Compute the inverse of Q'].stop() - - print(timers) - - timers['Compute the preconditioned matrix'].start() - AinvP = SIMPLE_preconditioned_matrix( - Q, invQ, G, GT, R, invR, omega=omega) - timers['Compute the preconditioned matrix'].stop() - - print(timers) - - timers['Compute the basis'].start() - - n = Q.shape[0]+R.shape[0] - b = np.zeros((n,)) - b[0:len(f)] = f - - N = 2 - m_max = 6000 - V, W = compute_VW(AinvP, b, m=m_max, N=N) - timers['Compute the basis'].stop() - - print(timers) - - timers['Compute the eigenvalues'].start() - deltas, omegas = compute_deltas_omegas(V, W, b) - timers['Compute the eigenvalues'].stop() - - print(timers) - - timers['Write the eigenvalues'].start() - write_eigenvalues(deltas, work_dir+'/deltas_GS_GS_' + str(i) + '.txt') - np.savetxt(work_dir+'/omegas_GS_GS_' + str(i) + '.txt', omegas) - timers['Write the eigenvalues'].stop() - - f = open('timers_' + str(i) + '.txt', 'w') - print(timers, file=f) - f.closed - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_deltas_omegas_direct.py b/katoptron/CMAME/old_tests/plate_deltas_omegas_direct.py deleted file mode 100644 index 1172faee..00000000 --- a/katoptron/CMAME/old_tests/plate_deltas_omegas_direct.py +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.eigenvalues import * -import os -import fwk - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - N = 32 - - input_file_dir = file_dir + '/../../workspace/katoptron_CMAME_tests_plate_MC_NO_EP/1/' - - sample_per_rank = np.ceil((N / siz)) - i_min = rank*sample_per_rank - i_max = (rank+1)*sample_per_rank - - if i_min > N: - i_min = N - if i_max > N: - i_max = N - - i_min = int(i_min) - i_max = int(i_max) - - for i in range(i_min, i_max): - timers = fwk.Timers() - - filename_Q = input_file_dir + str(i) + '/ApCTC_mm.txt' - filename_GT = input_file_dir + str(i) + '/B_mm.txt' - filename_f = input_file_dir + str(i) + '/b_mm_after_bc.txt' - - timers['Read files'].start() - Q = read_mm(filename_Q) - Q = get_symmetrical_part(Q) - GT = read_mm(filename_GT) - G = GT.transpose() - f = read_mm(filename_f, is_sparse=False) - timers['Read files'].stop() - - timers['Compute R'].start() - R = approx_Schur_complement(Q, G, GT) - timers['Compute R'].stop() - - timers['Compute invR'].start() - invR = compute_inv(R) - timers['Compute invR'].stop() - - print(timers) - - timers['Compute the inverse of Q'].start() - invQG = compute_inv_on_image(Q, G) - timers['Compute the inverse of Q'].stop() - - print(timers) - - timers['Compute the preconditioned matrix'].start() - AinvP = SIMPLE_prec(Q, invQG, G, GT, R, invR, True) - timers['Compute the preconditioned matrix'].stop() - - print(timers) - - timers['Compute the basis'].start() - - n = Q.shape[0]+R.shape[0] - b = np.zeros((n,)) - b[0:len(f)] = f - - N = 1 - V = compute_V(AinvP, b, m=0, N=N) - W = compute_W(AinvP, b, V, N=N) - - timers['Compute the basis'].stop() - - print(timers) - - timers['Compute the eigenvalues'].start() - deltas, omegas = compute_deltas_omegas(V, W, b) - timers['Compute the eigenvalues'].stop() - - print(timers) - - timers['Write the eigenvalues'].start() - write_eigenvalues(deltas, work_dir + - '/deltas_direct_direct_' + str(i) + '.txt') - np.savetxt(work_dir+'/omegas_direct_direct_' + str(i) + '.txt', omegas) - timers['Write the eigenvalues'].stop() - - f = open('timers_' + str(i) + '.txt', 'w') - print(timers, file=f) - f.closed - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_eigenvalues.py b/katoptron/CMAME/old_tests/plate_eigenvalues.py deleted file mode 100644 index 7a05cca6..00000000 --- a/katoptron/CMAME/old_tests/plate_eigenvalues.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -from katoptron.eigenvalues import * -import os -import fwk - - -def main(): - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - N = 32 - - input_file_dir = file_dir + '/../../workspace/katoptron_CMAME_tests_plate_MC_NO_EP/1/' - - i_min = 0 - i_max = N - - for i in range(i_min, i_max): - timers = fwk.Timers() - - filename_Q = input_file_dir + str(i) + '/ApCTC_mm.txt' - filename_GT = input_file_dir + str(i) + '/B_mm.txt' - - timers['Read files'].start() - Q = read_mm(filename_Q) - GT = read_mm(filename_GT) - G = GT.transpose() - timers['Read files'].stop() - - timers['Compute R'].start() - R = approx_Schur_complement(Q, G, GT) - timers['Compute R'].stop() - - print(timers) - - timers['Compute the inverse of Q'].start() - invQG = compute_inv_on_image(Q, G) - timers['Compute the inverse of Q'].stop() - - print(timers) - - timers['Compute the eigenvalues'].start() - v = eigenvalues_SR(invQG, G, GT, R, True) - timers['Compute the eigenvalues'].stop() - - print(timers) - - timers['Write the eigenvalues'].start() - write_eigenvalues( - v, work_dir+'/eigenvalues_direct_direct_' + str(i) + '.txt') - timers['Write the eigenvalues'].stop() - - f = open('timers_' + str(i) + '.txt', 'w') - print(timers, file=f) - f.closed - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_eigenvalues_gamma.py b/katoptron/CMAME/old_tests/plate_eigenvalues_gamma.py deleted file mode 100644 index ff8a16ee..00000000 --- a/katoptron/CMAME/old_tests/plate_eigenvalues_gamma.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -from katoptron.eigenvalues import * -import os -import fwk - -from scipy.sparse import eye - - -def main(): - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - N = 200 - gamma_min_exp = -2 - gamma_max_exp = 10 - - gammas = np.logspace(gamma_min_exp, gamma_max_exp, N, endpoint=True) - - input_file_dir = file_dir + '/../../workspace/katoptron_CMAME_tests_plate_MC_NO_EP/1/' - - filename_K = input_file_dir + '0/A_mm_after_bc.txt' - filename_GT = input_file_dir + '0/B_mm.txt' - - K = read_mm(filename_K) - GT = read_mm(filename_GT) - G = GT.transpose() - - for i in range(0, N): - timers = fwk.Timers() - - Q = K + gammas[i] * G * GT - - timers['Compute R'].start() - R = approx_Schur_complement(Q, G, GT) - timers['Compute R'].stop() - - print(timers) - - timers['Compute the inverse of Q'].start() - invQG = compute_inv_on_image(Q, G) - timers['Compute the inverse of Q'].stop() - - print(timers) - - timers['Compute the eigenvalues'].start() - v = eigenvalues_SR(invQG, G, GT, R, True) - timers['Compute the eigenvalues'].stop() - - print(timers) - - timers['Write the eigenvalues'].start() - write_eigenvalues( - v, work_dir+'/eigenvalues_direct_direct_' + str(i) + '.txt') - timers['Write the eigenvalues'].stop() - - f = open('timers_' + str(i) + '.txt', 'w') - print(timers, file=f) - f.closed - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_extended.py b/katoptron/CMAME/old_tests/plate_extended.py deleted file mode 100644 index 13303831..00000000 --- a/katoptron/CMAME/old_tests/plate_extended.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def main(): - - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2_extended.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 1 - num_random_variables = 20 - #randomVariable = np.random.normal(0, 1, num_random_variables*N) - #randomVariable = np.resize(randomVariable,(N,num_random_variables)) - randomVariable = np.zeros((N, num_random_variables)) - - p = model.defaut_params - p['MueLu xml from current_dir'] = False - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/../preconditioners/SIMPLE_direct.xml' - - ensemble_size = 1 - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_mean_gamma.py b/katoptron/CMAME/old_tests/plate_mean_gamma.py deleted file mode 100644 index 5b4324bc..00000000 --- a/katoptron/CMAME/old_tests/plate_mean_gamma.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_gamma(gamma, msh, comm, file_dir, ensemble_size=1): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['gamma'] = gamma - - N = ensemble_size - num_random_variables = 20 - randomVariable = np.zeros((N, num_random_variables)) - if ensemble_size is not 1: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = 0 - p['Number Phi of previously drawn samples'] = 0 - p['Is exp'] = False - - pm = model.plate_model(ensemble_size, randomVariable, msh, comm, file_dir, - work_dir, p) - pm.run(args.k) - - -def evaluate_all_gamma(gammas, msh, comm, file_dir): - - N = gammas.shape[0] - for i in range(0, N): - directory = str(i) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - for ensemble_size in [1, 8]: - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_gamma(gammas[i], msh, comm, file_dir, ensemble_size) - os.chdir('..') - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - N = 200 - gamma_min_exp = -2 - gamma_max_exp = 10 - - gammas = np.logspace(gamma_min_exp, gamma_max_exp, N, endpoint=True) - - np.savetxt('gammas.txt', gammas) - - evaluate_all_gamma(gammas, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_mean_prec.py b/katoptron/CMAME/old_tests/plate_mean_prec.py deleted file mode 100644 index 69e0663e..00000000 --- a/katoptron/CMAME/old_tests/plate_mean_prec.py +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_prec(msh, comm, file_dir, muelu_xml): - - work_dir = os.getcwd() - - p = model.defaut_params - p['MueLu xml use template'] = False - - N = 1 - num_random_variables = 20 - randomVariable = np.zeros((N, num_random_variables)) - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_prec(msh, comm, file_dir, muelu_xml_in, prec_params): - - N = prec_params.shape[0] - - for i in range(0, N): - directory = str(i) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - current_dir = os.getcwd() - - old_strings = ['$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_11_GS_sweeps', - '$BLOCK_00_GS_damping', '$BLOCK_11_GS_damping', - '$SCHUR_omega', '$SimpleSmoother_damping'] - new_strings = ['3', '3', str(int(prec_params[i, 0])), str(int(prec_params[i, 1])), str( - prec_params[i, 2]), str(prec_params[i, 3]), str(prec_params[i, 4]), str(prec_params[i, 5])] - - u.replace_strings(muelu_xml_in, current_dir + - '/SIMPLE_gs.xml', old_strings, new_strings) - - evaluate_prec(msh, comm, file_dir, current_dir+'/SIMPLE_gs.xml') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - muelu_xml_in = file_dir + '/../preconditioners/SIMPLE_gs.xml.in' - - N_GS_sweeps_00 = 1 - N_GS_sweeps_11 = 1 - N_GS_damping_00 = 6 - N_GS_damping_11 = 6 - N_SS_omega = 6 - N_SS_damping = 6 - - GS_sweeps_00_min = 10 - GS_sweeps_00_max = 11 - - GS_sweeps_11_min = 10 - GS_sweeps_11_max = 11 - - GS_damping_00_min = 0.9 - GS_damping_00_max = 1.5 - - GS_damping_11_min = 0.9 - GS_damping_11_max = 1.5 - - SS_omega_min = 0.7 - SS_omega_max = 1.1 - - SS_damping_min = 0.8 - SS_damping_max = 1.2 - - sweeps_00 = np.arange(GS_sweeps_00_min, GS_sweeps_00_max, N_GS_sweeps_00) - sweeps_11 = np.arange(GS_sweeps_11_min, GS_sweeps_11_max, N_GS_sweeps_11) - damping_00_min = np.linspace( - GS_damping_00_min, GS_damping_00_max, N_GS_damping_00) - damping_11_min = np.linspace( - GS_damping_11_min, GS_damping_11_max, N_GS_damping_11) - SS_omega = np.linspace(SS_omega_min, SS_omega_max, N_SS_omega) - SS_damping = np.linspace(SS_damping_min, SS_damping_max, N_SS_damping) - - N = N_GS_sweeps_00 * N_GS_sweeps_11 * N_GS_damping_00 * \ - N_GS_damping_11 * N_SS_omega * N_SS_damping - - prec_params = np.zeros((N, 6)) - - i = 0 - - for i_0 in range(0, N_GS_sweeps_00): - for i_1 in range(0, N_GS_sweeps_11): - for i_2 in range(0, N_GS_damping_00): - for i_3 in range(0, N_GS_damping_11): - for i_4 in range(0, N_SS_omega): - for i_5 in range(0, N_SS_damping): - prec_params[i, :] = [sweeps_00[i_0], sweeps_11[i_1], damping_00_min[i_2], - damping_11_min[i_3], SS_omega[i_4], SS_damping[i_5]] - i = i + 1 - - np.savetxt('prec_params.txt', prec_params) - - evaluate_all_prec(msh, comm, file_dir, muelu_xml_in, prec_params) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_mean_prec_GS_direct.py b/katoptron/CMAME/old_tests/plate_mean_prec_GS_direct.py deleted file mode 100644 index 0e35fc87..00000000 --- a/katoptron/CMAME/old_tests/plate_mean_prec_GS_direct.py +++ /dev/null @@ -1,196 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_prec(msh, comm, file_dir, muelu_xml, ensemble_size=1): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['MueLu xml use template'] = False - p['MueLu xml from current_dir'] = True - p['MueLu xml file name'] = '/../SIMPLE_gs_direct.xml' - p['gamma'] = 0. - - N = ensemble_size - num_random_variables = 20 - randomVariable = np.zeros((N, num_random_variables)) - if ensemble_size is not 1: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = 0 - p['Number Phi of previously drawn samples'] = 0 - p['Is exp'] = False - - pm = model.plate_model(ensemble_size, randomVariable, msh, comm, file_dir, - work_dir, p) - pm.run(args.k) - - -def evaluate_all_prec(msh, comm, file_dir, muelu_xml_in, prec_params): - - N = prec_params.shape[0] - - for i in range(0, N): - directory = str(i) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - current_dir = os.getcwd() - - old_strings = ['$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_00_GS_damping', - '$SCHUR_omega', '$SimpleSmoother_damping'] - new_strings = [ - '3', '3', - str(int(prec_params[i, 0])), - str(prec_params[i, 1]), - str(prec_params[i, 2]), - str(prec_params[i, 3]) - ] - - print(muelu_xml_in) - u.replace_strings(muelu_xml_in, current_dir + '/SIMPLE_gs_direct.xml', - old_strings, new_strings) - print(current_dir + '/SIMPLE_gs_direct.xml') - - directory = 'mean_case' - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_prec(msh, comm, file_dir, - current_dir + '/SIMPLE_gs_direct.xml') - os.chdir('..') - - for ensemble_size in [8]: - directory = 'ensemble_reduction_' + str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_prec(msh, - comm, - file_dir, - current_dir + '/SIMPLE_gs_direct.xml', - ensemble_size=ensemble_size) - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - muelu_xml_in = file_dir + '/../preconditioners/SIMPLE_gs_direct.xml.in' - - GS_sweeps_00_min = 16 - GS_sweeps_00_max = 41 - delta_GS_sweeps_00 = 2 - - N_GS_sweeps_00 = int( - np.ceil( - ((GS_sweeps_00_max - GS_sweeps_00_min * 1.) / delta_GS_sweeps_00))) - - # Damping has to be between 0 and 2 - GS_damping_00_min = 0.001 - GS_damping_00_max = 1.999 - N_GS_damping_00 = 20 - - # Omega has to be between 0 and 1 - SS_omega_min = 1. - SS_omega_max = 1.2 - N_SS_omega = 1 - - SS_damping_min = 1. - SS_damping_max = 1.2 - N_SS_damping = 1 - - sweeps_00 = np.arange(GS_sweeps_00_min, GS_sweeps_00_max, - delta_GS_sweeps_00) - damping_00 = np.linspace(GS_damping_00_min, GS_damping_00_max, - N_GS_damping_00) - SS_omega = np.linspace(SS_omega_min, SS_omega_max, N_SS_omega) - SS_damping = np.linspace(SS_damping_min, SS_damping_max, N_SS_damping) - - N = N_GS_sweeps_00 * N_GS_damping_00 * N_SS_omega * N_SS_damping - ''' - N = 12 - - prec_params = np.array([[8, 1.75, 0.46363636363636374, 1.], - [10, 1.75, 0.3545454545454546, 1.], - [12, 1.75, 0.390909090909091, 1.], - [14, 1.8045454545454545, 0.42727272727272736, 1.], - [16, 1.8227272727272728, 0.42727272727272736, 1.], - [18, 1.8045454545454545, 0.3545454545454546, 1.], - [20, 1.8227272727272728, 0.390909090909091, 1.], - [22, 1.8227272727272728, 0.390909090909091, 1.], - [24, 1.8590909090909091, 0.390909090909091, 1.], - [26, 1.8590909090909091, 0.3545454545454546, 1.], - [28, 1.8590909090909091, 0.3545454545454546, 1.], - [30, 1.8772727272727272, 0.390909090909091, 1.]]) - - ''' - prec_params = np.zeros((N, 4)) - - i = 0 - - for i_0 in range(0, N_GS_sweeps_00): - for i_1 in range(0, N_GS_damping_00): - for i_2 in range(0, N_SS_omega): - for i_3 in range(0, N_SS_damping): - prec_params[i, :] = [ - sweeps_00[i_0], damping_00[i_1], SS_omega[i_2], - SS_damping[i_3] - ] - i = i + 1 - - np.savetxt('prec_params.txt', prec_params) - - evaluate_all_prec(msh, comm, file_dir, muelu_xml_in, prec_params) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_mean_prec_GS_direct_lvl.py b/katoptron/CMAME/old_tests/plate_mean_prec_GS_direct_lvl.py deleted file mode 100644 index 4b4b46e3..00000000 --- a/katoptron/CMAME/old_tests/plate_mean_prec_GS_direct_lvl.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_prec(msh, comm, file_dir, muelu_xml, ensemble_size=1): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['MueLu xml use template'] = False - p['MueLu xml from current_dir'] = True - p['MueLu xml file name'] = '/../SIMPLE_gs_direct.xml' - #p['gamma'] = 0. - - N = ensemble_size - num_random_variables = 20 - randomVariable = np.zeros((N, num_random_variables)) - if ensemble_size is not 1: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = 0 - p['Number Phi of previously drawn samples'] = 0 - p['Is exp'] = False - - pm = model.plate_model(ensemble_size, randomVariable, msh, comm, file_dir, - work_dir, p) - pm.run(args.k) - - -def evaluate_all_prec(msh, comm, file_dir, muelu_xml_in, prec_params): - - N = prec_params.shape[0] - - for i in range(0, N): - directory = str(i) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - current_dir = os.getcwd() - - old_strings = ['$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_00_GS_damping', - '$SCHUR_omega', '$SimpleSmoother_damping', "$N_LVLS"] - new_strings = [ - '3', '3', - str(int(prec_params[i, 0])), - str(prec_params[i, 1]), - str(prec_params[i, 2]), - str(prec_params[i, 3]), - '2' - ] - - print(muelu_xml_in) - u.replace_strings(muelu_xml_in, current_dir + '/SIMPLE_gs_direct.xml', - old_strings, new_strings) - print(current_dir + '/SIMPLE_gs_direct.xml') - - directory = 'mean_case' - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_prec(msh, comm, file_dir, - current_dir + '/SIMPLE_gs_direct.xml') - os.chdir('..') - - for ensemble_size in [8]: - directory = 'ensemble_reduction_' + str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_prec(msh, - comm, - file_dir, - current_dir + '/SIMPLE_gs_direct.xml', - ensemble_size=ensemble_size) - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - muelu_xml_in = file_dir + '/../preconditioners/SIMPLE_gs_direct_lvl.xml.in' - - GS_sweeps_00_min = 6 - GS_sweeps_00_max = 7 - delta_GS_sweeps_00 = 1 - - N_GS_sweeps_00 = int( - np.ceil( - ((GS_sweeps_00_max - GS_sweeps_00_min * 1.) / delta_GS_sweeps_00))) - - # Damping has to be between 0 and 2 - GS_damping_00_min = 0.01 - GS_damping_00_max = 1.99 - N_GS_damping_00 = 8 - - # Omega has to be between 0 and 1 - SS_omega_min = 0.5 - SS_omega_max = 1. - N_SS_omega = 8 - - SS_damping_min = 1. - SS_damping_max = 1. - N_SS_damping = 1 - - sweeps_00 = np.arange(GS_sweeps_00_min, GS_sweeps_00_max, - delta_GS_sweeps_00) - damping_00 = np.linspace(GS_damping_00_min, GS_damping_00_max, - N_GS_damping_00) - SS_omega = np.linspace(SS_omega_min, SS_omega_max, N_SS_omega) - SS_damping = np.linspace(SS_damping_min, SS_damping_max, N_SS_damping) - - N = N_GS_sweeps_00 * N_GS_damping_00 * N_SS_omega * N_SS_damping - ''' - N = 12 - - prec_params = np.array([[8, 1.75, 0.46363636363636374, 1.], - [10, 1.75, 0.3545454545454546, 1.], - [12, 1.75, 0.390909090909091, 1.], - [14, 1.8045454545454545, 0.42727272727272736, 1.], - [16, 1.8227272727272728, 0.42727272727272736, 1.], - [18, 1.8045454545454545, 0.3545454545454546, 1.], - [20, 1.8227272727272728, 0.390909090909091, 1.], - [22, 1.8227272727272728, 0.390909090909091, 1.], - [24, 1.8590909090909091, 0.390909090909091, 1.], - [26, 1.8590909090909091, 0.3545454545454546, 1.], - [28, 1.8590909090909091, 0.3545454545454546, 1.], - [30, 1.8772727272727272, 0.390909090909091, 1.]]) - - ''' - prec_params = np.zeros((N, 4)) - - i = 0 - - for i_0 in range(0, N_GS_sweeps_00): - for i_1 in range(0, N_GS_damping_00): - for i_2 in range(0, N_SS_omega): - for i_3 in range(0, N_SS_damping): - prec_params[i, :] = [ - sweeps_00[i_0], damping_00[i_1], SS_omega[i_2], - SS_damping[i_3] - ] - i = i + 1 - - np.savetxt('prec_params.txt', prec_params) - - evaluate_all_prec(msh, comm, file_dir, muelu_xml_in, prec_params) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_mean_prec_GS_direct_opti.py b/katoptron/CMAME/old_tests/plate_mean_prec_GS_direct_opti.py deleted file mode 100644 index b48d802e..00000000 --- a/katoptron/CMAME/old_tests/plate_mean_prec_GS_direct_opti.py +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u -from katoptron.readers import * - - -def f(x): - import sys - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - orig_stdout = sys.stdout - sys.stdout = open('file', 'w') - file_dir = os.path.dirname(__file__) - muelu_xml_in = file_dir + '/../preconditioners/SIMPLE_gs_direct.xml.in' - - directory = 'tmp' - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - N = 8 - - current_dir = os.getcwd() - - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, current_dir) - - old_strings = ['$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_00_GS_damping', - '$SCHUR_omega', '$SimpleSmoother_damping'] - new_strings = ['3', '3', str(N), str(x[0]), str(x[1]), '0'] - - u.replace_strings(muelu_xml_in, current_dir + - '/SIMPLE_gs_direct.xml', old_strings, new_strings) - - evaluate_prec(msh, comm, file_dir, current_dir+'/SIMPLE_gs_direct.xml') - - iter_indices, residuals = read_Belos(current_dir+'/belos_out.txt', 1) - os.chdir('..') - sys.stdout.close() - sys.stdout = orig_stdout - return iter_indices[-1] - - -def fp(x): - epsi = 1e-5 - jaco = np.zeros((2, 1)) - jaco[0] = ((f(x+epsi*np.array([1, 0])) - - f(x-epsi*np.array([1, 0]))) / (2*epsi)) - jaco[1] = ((f(x+epsi*np.array([0, 1])) - - f(x-epsi*np.array([0, 1]))) / (2*epsi)) - return jaco - - -def evaluate_prec(msh, comm, file_dir, muelu_xml, ensemble_size=1): - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/SIMPLE_gs_direct.xml' - - N = ensemble_size - num_random_variables = 20 - randomVariable = np.zeros((N, num_random_variables)) - if ensemble_size is not 1: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = 0 - p['Number Phi of previously drawn samples'] = 0 - p['Is exp'] = False - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def main(): - from scipy import optimize - import numpy as np - - x0 = np.array([1.7, 0.5]) - bnds = ((1., 2.), (0., 1.)) - xopt = optimize.minimize(f, x0, jac=fp, bounds=bnds, options={ - 'maxiter': 200, 'disp': 1}) - - print(xopt) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_vd_Direct_200.py b/katoptron/CMAME/old_tests/plate_vd_Direct_200.py deleted file mode 100644 index 5af82db3..00000000 --- a/katoptron/CMAME/old_tests/plate_vd_Direct_200.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - - - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['MueLu xml from current_dir'] = False - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/../preconditioners/SIMPLE_direct.xml' - p['Dispersion level'] = 0.1 - p['gamma'] = 0. - p['inner clamped'] = True - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.geo', 'plate_1_tmp', 'plate_2.geo', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 8 - num_random_variables = 200 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(8, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_vd_Direct_3.py b/katoptron/CMAME/old_tests/plate_vd_Direct_3.py deleted file mode 100644 index 27ca8e1e..00000000 --- a/katoptron/CMAME/old_tests/plate_vd_Direct_3.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - - - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['MueLu xml from current_dir'] = False - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/../preconditioners/SIMPLE_direct.xml' - p['Dispersion level'] = 0.1 - p['gamma'] = 0. - p['inner clamped'] = True - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.geo', 'plate_1_tmp', 'plate_2.geo', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 8 - num_random_variables = 3 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(8, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_vd_GS_200.py b/katoptron/CMAME/old_tests/plate_vd_GS_200.py deleted file mode 100644 index eee345c8..00000000 --- a/katoptron/CMAME/old_tests/plate_vd_GS_200.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - - - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['Dispersion level'] = 0.1 - p['gamma'] = 0. - p['inner clamped'] = True - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.geo', 'plate_1_tmp', 'plate_2.geo', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 8 - num_random_variables = 200 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - pert = 1e-2 - randomVariable = np.zeros((N, num_random_variables)) - randomVariable[0, :] = np.random.normal(0, 1, num_random_variables) - for i in range(1, N): - randomVariable[i, :] = randomVariable[0, :] + pert * \ - np.random.uniform(-1, 1, num_random_variables) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(8, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_vd_GS_200_with_gamma.py b/katoptron/CMAME/old_tests/plate_vd_GS_200_with_gamma.py deleted file mode 100644 index d38b5905..00000000 --- a/katoptron/CMAME/old_tests/plate_vd_GS_200_with_gamma.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - - - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['Dispersion level'] = 0.1 - p['inner clamped'] = True - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.geo', 'plate_1_tmp', 'plate_2.geo', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 8 - num_random_variables = 200 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - pert = 1e-2 - randomVariable = np.zeros((N, num_random_variables)) - randomVariable[0, :] = np.random.normal(0, 1, num_random_variables) - for i in range(1, N): - randomVariable[i, :] = randomVariable[0, :] + pert * \ - np.random.uniform(-1, 1, num_random_variables) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(8, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_vd_GS_3.py b/katoptron/CMAME/old_tests/plate_vd_GS_3.py deleted file mode 100644 index a52659a9..00000000 --- a/katoptron/CMAME/old_tests/plate_vd_GS_3.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - - - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['Dispersion level'] = 0.1 - #p['gamma'] = '{4663653.515942637,5000307.969231523,5125491.581727843,4650754.5340228975,4802461.555172057,4330669.2615991,4289095.323914186,4521634.142120181}' - p['MueLu xml template file name'] = '/../preconditioners/SIMPLE_gs_direct.xml.in' - p['MueLu xml params name'] = ['$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_00_GS_damping', - '$SCHUR_omega', '$SimpleSmoother_damping'] - p['MueLu xml params'] = ['3', '3', '100', '1.75', '0.05', '1.'] - - #p['inner clamped'] = True - - #p['Write txt files'] = True - #p['Write matrix and vectors'] = True - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.geo', 'plate_1_tmp', 'plate_2.geo', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 8 - num_random_variables = 3 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(8, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_vd_GS_3_with_gamma.py b/katoptron/CMAME/old_tests/plate_vd_GS_3_with_gamma.py deleted file mode 100644 index ed1538f6..00000000 --- a/katoptron/CMAME/old_tests/plate_vd_GS_3_with_gamma.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - - - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, randomVariable, msh, comm, file_dir): - - work_dir = os.getcwd() - args = parseargs() - - p = model.defaut_params - p['Dispersion level'] = 0.1 - p['inner clamped'] = True - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - -def evaluate_all_ensembles(ensemble_size, randomVariable, msh, comm, file_dir): - - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = randomVariable.shape[0] - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - evaluate_one_ensemble(ensemble_size, randomVariable[ensemble_index:( - ensemble_index+ensemble_size), :], msh, comm, file_dir) - - os.chdir('..') - - os.chdir('..') - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.geo', 'plate_1_tmp', 'plate_2.geo', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - np.random.seed(42) - N = 8 - num_random_variables = 3 - randomVariable = np.random.normal(0, 1, num_random_variables*N) - randomVariable = np.resize(randomVariable, (N, num_random_variables)) - - np.savetxt('randomVariable.txt', randomVariable) - - evaluate_all_ensembles(1, randomVariable, msh, comm, file_dir) - evaluate_all_ensembles(8, randomVariable, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/old_tests/plate_vd_conf.py b/katoptron/CMAME/old_tests/plate_vd_conf.py deleted file mode 100644 index 90d65d7a..00000000 --- a/katoptron/CMAME/old_tests/plate_vd_conf.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def main(): - - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.msh', 'plate_1_tmp', 'plate_2.msh', - 'plate_2_tmp', 'plate_fused', file_dir, work_dir) - - directory = str(1) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - np.random.seed(42) - N = 1 - num_random_variables = 20 - #randomVariable = np.random.normal(0, 1, num_random_variables*N) - #randomVariable = np.resize(randomVariable,(N,num_random_variables)) - randomVariable = np.zeros((N, num_random_variables)) - - p = model.defaut_params - p['MueLu xml from current_dir'] = False - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/../preconditioners/SIMPLE_direct.xml' - p['Write txt files'] = True - p['Write matrix and vectors'] = True - p['gamma'] = 100. - - ensemble_size = 1 - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - os.chdir('..') - - directory = str(2) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - np.random.seed(42) - N = 1 - num_random_variables = 20 - #randomVariable = np.random.normal(0, 1, num_random_variables*N) - #randomVariable = np.resize(randomVariable,(N,num_random_variables)) - randomVariable = np.zeros((N, num_random_variables)) - - p = model.defaut_params - p['MueLu xml from current_dir'] = False - p['MueLu xml use template'] = False - p['MueLu xml file name'] = '/../preconditioners/SIMPLE_direct.xml' - p['Write txt files'] = True - p['Write matrix and vectors'] = True - p['gamma'] = 4368992. - - ensemble_size = 1 - - pm = model.plate_model(ensemble_size, randomVariable, - msh, comm, file_dir, work_dir, p) - pm.run(args.k) - - os.chdir('..') - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/plate_SPD/blake.slurm.sh b/katoptron/CMAME/plate_SPD/blake.slurm.sh deleted file mode 100644 index 122ec86a..00000000 --- a/katoptron/CMAME/plate_SPD/blake.slurm.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=plate -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/plate.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,2t -export KMP_AFFINITY=compact - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_SPD/plate.py diff --git a/katoptron/CMAME/plate_SPD/plate.geo b/katoptron/CMAME/plate_SPD/plate.geo deleted file mode 100644 index 4e9dedd0..00000000 --- a/katoptron/CMAME/plate_SPD/plate.geo +++ /dev/null @@ -1,43 +0,0 @@ -SetFactory("OpenCASCADE"); -If(GMSH_MAJOR_VERSION!=3 || GMSH_MINOR_VERSION!=0 || GMSH_PATCH_VERSION!=6) - Printf("gmsh %g.%g.%g is not supported by this .geo",GMSH_MAJOR_VERSION,GMSH_MINOR_VERSION,GMSH_PATCH_VERSION); -Else - LX = 10; - LY = 10; - LZ = 1; - - nX = 15; - nY = 15; - nZ = 1; - - Point(1) = { 0., 0., 0., lc}; - Point(2) = { 0., LY, 0., lc}; - Point(3) = { LX, LY, 0., lc}; - Point(4) = { LX, 0., 0., lc}; - - Line(1) = {1, 2}; - Line(2) = {2, 3}; - Line(3) = {3, 4}; - Line(4) = {4, 1}; - - Transfinite Line {1, 3} = nY Using Progression 1; - Transfinite Line {2, 4} = nX Using Progression 1; - - Line Loop(5) = {1, 2, 3, 4}; - Plane Surface(5) = {5}; - Transfinite Surface {5}; - Recombine Surface {5}; - - Extrude {0, 0, LZ} - { - Surface{5}; Layers{nZ}; Recombine; - } - - Physical Volume("body") = {1}; - - Physical Surface("load 1") = {7}; - Physical Surface("load 2") = {9}; - Physical Point("clamped xyz") = {1}; - Physical Point("clamped xy") = {5}; - Physical Point("clamped y") = {4}; -EndIf diff --git a/katoptron/CMAME/plate_SPD/plate.py b/katoptron/CMAME/plate_SPD/plate.py deleted file mode 100644 index 24508e88..00000000 --- a/katoptron/CMAME/plate_SPD/plate.py +++ /dev/null @@ -1,288 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -"""@package docstring -This test runs the four different cases as defined in table 2 of the paper -with a SIMPLE-GS-GS preconditioner. -""" - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def get_parameters(case_id, first_sample_id): - """ - This function returns the python dictionary that includes - the parameters for a given test case - """ - p = model.defaut_params - - if case_id == 1: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.1 - elif case_id == 2: - nuw = 128 - p['Correlation length'] = 20. - p['Dispersion level'] = 0.3 - elif case_id == 3: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.1 - elif case_id == 4: - nuw = 128 - p['Correlation length'] = 5. - p['Dispersion level'] = 0.3 - elif case_id == 5: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.1 - elif case_id == 6: - nuw = 128 - p['Correlation length'] = 2. - p['Dispersion level'] = 0.3 - - p['Wavenumber cutoff'] = 8. - p['Wavenumber discretization points'] = nuw - p['Number Z of previously drawn samples'] = first_sample_id * nuw**2 - p['Number Phi of previously drawn samples'] = first_sample_id * nuw**2 - p['Write matrix and vectors'] = False - p['Write txt files'] = False - - p['Is exp'] = False - return p - - -def evaluate_one_ensemble(ensemble_size, case_id, first_sample_id, msh, comm, - file_dir, max_iter): - """ - This function evaluates one ensemble for a given test case - """ - work_dir = os.getcwd() - args = parseargs() - - p = get_parameters(case_id, first_sample_id) - - pbl = m.Problem(msh, comm) - - # Units are in mm - E = 70000 * np.ones(ensemble_size) # 70e9 Pa = 70000 MPa - nu = 0.35 * np.ones(ensemble_size) - k = 0. - d = 0. - m.Medium(pbl, "body", "test", E, nu, k, d) - - m.Dirichlet(pbl, "clamped xyz", "Clamped", 1, 0., 1, 0., 1, 0., 0, 0., - ensemble_size) - m.Dirichlet(pbl, "clamped xy", "Clamped", 1, 0., 1, 0., 0, 0., 0, 0., - ensemble_size) - m.Dirichlet(pbl, "clamped y", "Clamped", 0, 0., 1, 0., 0, 0., 0, 0., - ensemble_size) - - f = 700 * np.ones(ensemble_size) # 700e6 Pa = 700 MPa - zero = np.zeros(ensemble_size) - one = np.ones(ensemble_size) - m.Neumann(pbl, 'load 1', 'load', 0, zero, 1, f, 0, zero, 0, one, - ensemble_size) - m.Neumann(pbl, 'load 2', 'load', 0, zero, 1, -f, 0, zero, 0, one, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Ensemble Convergence Tolerance'] = 1e-8 - solverList['Maximum Iterations'] = max_iter - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - prec = 2 - - if prec == 1: - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 3 - mueluParams['max levels'] = 1 - mueluParams['coarse: type'] = "CHEBYSHEV" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['chebyshev: degree'] = 20 - - mueluParams['verbosity'] = "high" - - mueluParams['coarse: params'] = mueluParamsSub2 - elif prec == 2: - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 3 - mueluParams['max levels'] = 1 - mueluParams['coarse: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "MT Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 3 - mueluParamsSub2['relaxation: damping factor'] = 1.75 - - mueluParams['verbosity'] = "high" - - mueluParams['coarse: params'] = mueluParamsSub2 - elif prec == 3: - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 3 - mueluParams['max levels'] = 2 - mueluParams['smoother: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "MT Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 10 - mueluParamsSub2['relaxation: damping factor'] = 1.75 - - mueluParams['verbosity'] = "high" - - mueluParams['smoother: params'] = mueluParamsSub2 - - mueluParams['coarse: type'] = "Klu" - mueluParams['coarse: max size'] = 18 - - solverList['convert MueLu xml file'] = True - solverList['mueluParams'] = mueluParams - - solverList['Print Teuchos timers'] = True - - solverList['gamma'] = p['gamma'] - solverList['Use preconditioner'] = True - - solverList['type'] = 'BlockGmres' - solverList['Maximum active set iteration'] = 1 - - solverList['Write matrix and vectors'] = p['Write matrix and vectors'] - solverList['Write txt files'] = p['Write txt files'] - - if p["Is exp"]: - num_random_variables = randomVariable.shape[1] - else: - num_random_variables = 0 - - for i in range(0, num_random_variables): - rand = randomVariable[:, i] - pbl.add(m.RandomVariable(rand)) - - randomParams = Teuchos.ParameterList() - - randomParams['Is random'] = True - randomParams['Is exp'] = p['Is exp'] - if p["Is exp"]: - randomParams['Begin X'] = 0. - randomParams['Begin Y'] = 0. - randomParams['Begin Z'] = 0. - randomParams['End X'] = 10. - randomParams['End Y'] = 10. - randomParams['End Z'] = 1. - randomParams['Number random variables'] = num_random_variables - randomParams['Correlation length X'] = p['Correlation length X'] - randomParams['Correlation length Y'] = p['Correlation length Y'] - randomParams['Correlation length Z'] = p['Correlation length Z'] - randomParams['Number of KL Terms X'] = p['Number of KL Terms X'] - randomParams['Number of KL Terms Y'] = p['Number of KL Terms Y'] - randomParams['Number of KL Terms Z'] = p['Number of KL Terms Z'] - randomParams['Maximum Nonlinear Solver Iterations'] = 5000 - randomParams['Bound Perturbation Size'] = 1E-10 - else: - randomParams['Correlation length'] = p['Correlation length'] - randomParams['Wavenumber cutoff'] = p['Wavenumber cutoff'] - randomParams['Wavenumber discretization points'] = p[ - 'Wavenumber discretization points'] - randomParams['Number Z of previously drawn samples'] = p[ - 'Number Z of previously drawn samples'] - randomParams['Number Phi of previously drawn samples'] = p[ - 'Number Phi of previously drawn samples'] - - randomParams['Mean'] = (E[0] / (2. * (1. + nu[0]))) - randomParams['Dispersion level'] = p['Dispersion level'] - - solverList['randomParams'] = randomParams - - slv = m.IterativeSolver(pbl, args.k, solverList, 3, ensemble_size) - slv.start() - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - -def evaluate_all_ensembles(ensemble_sizes, case_ids, N, msh, comm, file_dir): - """ - This function loop over the test cases, the ensemble sizes, - and the ensembles - """ - for case_id in case_ids: - directory_case_id = 'case_' + str(case_id) - if not os.path.exists(directory_case_id): - os.makedirs(directory_case_id) - os.chdir(directory_case_id) - for ensemble_size in ensemble_sizes: - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - first_sample_id = ensemble_index * ensemble_size - - n_iter = np.arange(1, 105) - n_it = len(n_iter) - #n_it = 6 - # np.linspace(10,200,n_it,dtype=int) - - for i_it in range(0, n_it): - max_iter = n_iter[i_it] - directory = str(max_iter) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - evaluate_one_ensemble(ensemble_size, case_id, first_sample_id, - msh, comm, file_dir, max_iter) - os.chdir('..') - - os.chdir('..') - os.chdir('..') - os.chdir('..') - - -def main(): - """ - This loads the mesh and define the case ids and ensemble sizes - """ - comm, rank, size = m.utilities.import_MPI() - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = gmsh.MeshLoader('plate.geo', file_dir).execute() - - N = 8 - ensemble_sizes = [1, 8] - case_ids = [1] - - evaluate_all_ensembles(ensemble_sizes, case_ids, N, msh, comm, file_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/plate_SPD/plate_convergence.py b/katoptron/CMAME/plate_SPD/plate_convergence.py deleted file mode 100644 index d05f89e9..00000000 --- a/katoptron/CMAME/plate_SPD/plate_convergence.py +++ /dev/null @@ -1,345 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -from katoptron.eigenvalues import * -import os -import fwk -"""@package docstring -This file is used to loop over cases and samples and plot their mechanical properties and solution fields. -""" - -import vtk -import tboxVtk -import tboxVtk.reader as vtkR -import tboxVtk.cutter as vtkC - -from katoptron.CMAME.model import Compute_QoIs - - -def plot_2D_mesh(pts, quad, ax): - """ - This function plots a 2D quad mesh on a given matplotlib axis - """ - import matplotlib.pyplot as plt - for i in range(0, quad.shape[0]): - x = np.zeros((quad.shape[1] + 1, )) - y = np.zeros((quad.shape[1] + 1, )) - for j in range(0, quad.shape[1]): - x[j] = pts[quad[i, j], 0] - y[j] = pts[quad[i, j], 1] - x[-1] = pts[quad[i, 0], 0] - y[-1] = pts[quad[i, 0], 1] - ax.plot(x, y, '--k', linewidth=0.5) - - -def cut_of_one_case(case_id, - ensemble_size, - n_samples, - iters, - file_MC_base_dir): - """ - This function loops over the samples of a given test case and plot them - """ - import matplotlib.pyplot as plt - - base_directory = 'case_' + str(case_id) - if not os.path.exists(base_directory): - os.makedirs(base_directory) - os.makedirs(base_directory + '/sample') - os.makedirs(base_directory + '/sample_ER_dif') - base_directory_sample = base_directory + '/sample' - base_directory_sample_ER_dif = base_directory + '/sample_ER_dif' - for i in range(0, n_samples): - - input_MC_file_dir = file_MC_base_dir + \ - str(case_id) + '/1/' + str(i) + '/104/' - mshName_sample_no_EP = input_MC_file_dir + 'plate_ast1_s0_0' - pts, tri, vals = cut_plate(mshName_sample_no_EP, False) - pts_2, quad = extract_quad_msh(mshName_sample_no_EP) - - x = pts[:, 0] - y = pts[:, 1] - - plot_one_sampel(x, y, tri, vals, pts_2, quad, False) - plt.savefig(base_directory_sample + '/' + str(i) + '.png', dpi=400) - - for i_it in range(0, len(iters)): - - i_ensemble = (i // ensemble_size) - i_sample = np.mod(i, ensemble_size) - - #input_MC_file_dir = file_MC_base_dir + str(case_id) + '/1/' + str(i) + '/' + str(iters[i_it]) + '/' - - input_MC_file_dir = file_MC_base_dir + str(case_id) + '/' + str( - ensemble_size) + '/' + str(i_ensemble) + '/' + str(iters[i_it]) + '/' - mshName_sample_EP = input_MC_file_dir + 'plate_ast1_s' + str( - i_sample) + '_0' - - pts_EP, tri_EP, vals_EP = cut_plate(mshName_sample_EP, False) - - plot_one_sampel(x, y, tri, vals_EP, pts_2, quad, False) - plt.savefig(base_directory_sample + '/' + str(i) + '_' + - str(iters[i_it]) + '_e_' + str(ensemble_size) + '.png', dpi=400) - - plot_diff_abs(x, y, tri, vals, vals_EP, pts_2, quad, False) - plt.savefig(base_directory_sample_ER_dif + '/' + str(i) + '_' + - str(iters[i_it]) + '_e_' + str(ensemble_size) + '.png', dpi=400) - - input_MC_file_dir = file_MC_base_dir + \ - str(case_id) + '/1/' + str(i) + '/' + str(iters[i_it]) + '/' - mshName_sample_EP = input_MC_file_dir + 'plate_ast1_s0_0' - - pts_EP, tri_EP, vals_EP = cut_plate(mshName_sample_EP, False) - - plot_one_sampel(x, y, tri, vals_EP, pts_2, quad, False) - plt.savefig(base_directory_sample + '/' + str(i) + - '_' + str(iters[i_it]) + '_e_1.png', dpi=400) - - plot_diff_abs(x, y, tri, vals, vals_EP, pts_2, quad, False) - plt.savefig(base_directory_sample_ER_dif + '/' + - str(i) + '_' + str(iters[i_it]) + '_e_1.png', dpi=400) - - plt.close('all') - - -def extract_quad_msh(mshName): - """ - This function extracts the 2D quad mesh out of a hexahedron mesh - """ - reader = vtkR.Reader() - reader.open(mshName) - rdata = reader.reader.GetOutput() - - _pts = rdata.GetPoints() - pts = np.zeros((_pts.GetNumberOfPoints(), 2)) - pts_indices = np.zeros((_pts.GetNumberOfPoints(), ), dtype=int) - for i in range(0, pts.shape[0]): - if _pts.GetPoint(i)[2] <= 0.01: - for j in range(0, 2): - pts[i][j] = _pts.GetPoint(i)[j] - pts_indices[i] = 1 - n_elems = rdata.GetNumberOfCells() - quad = [] - for i in range(0, n_elems): - elem = rdata.GetCell(i) - for j in range(0, 6): - face = elem.GetFace(j) - points_id = np.zeros((4, ), dtype=int) - good_face = True - for k in range(0, 4): - points_id[k] = face.GetPointId(k) - if pts_indices[points_id[k]] != 1: - good_face = False - break - if good_face: - if len(quad) == 0: - quad = points_id.reshape((1, 4)) - else: - quad = np.append(quad, points_id.reshape((1, 4)), axis=0) - return pts, quad - - -def cut_plate(mshName, at_point=False): - """ - This function cuts the vtk files in the middle and extracts both point - and element data. - """ - reader = vtkR.Reader() - reader.open(mshName) - cutter = vtkC.Cutter(reader.reader.GetOutputPort()) - c_output = cutter.cut(1, [0., 0., 0.5], [0., 0., 1.], tag_name='volume_id') - if at_point: - pts, tri, vals = cutter.extract(c_output, - 3, - ['u', 'x', 'y', 'z', 'G', 'von Mises'], - atPoint=True) - else: - pts, tri, vals = cutter.extract(c_output, - 3, ['u', 'x', 'y', 'z'], - atPoint=True) - pts_2, tri_2, vals_2 = cutter.extract(c_output, - 3, ['G', 'von Mises'], - atPoint=False) - vals.update(vals_2) - - return pts, tri, vals - - -def plot_2D_cut_values_at_node(x, y, tri, value, n_levels=16): - """ - This function plots data at node. - """ - import matplotlib.pyplot as plt - value = value.reshape((len(x), )) - if max(value) - min(value) > 0: - levels = np.linspace(min(value), max(value), n_levels) - plt.set_cmap('coolwarm') - plt.tricontour(x, - y, - tri, - value, - levels, - linestyles='-', - colors='black', - linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, value, levels) - else: - axtri = plt.tricontourf(x, y, tri, value) - plt.gca().set_aspect('equal') - return axtri - - -def plot_2D_cut_values_at_elem(x, - y, - tri_1, - value, - v_min=0, - v_max=0, - n_levels=16, - shading=False): - """ - This function plots data at element. - """ - import matplotlib.pyplot as plt - - value = value.reshape((tri_1.shape[0], )) - if v_min == v_max: - v_min = min(value) - v_max = max(value) - - levels = np.linspace(v_min, v_max, n_levels) - plt.set_cmap('coolwarm') - if shading: - axtri = plt.tripcolor(x, y, tri_1, value, shading='gouraud') - else: - axtri = plt.tripcolor(x, y, tri_1, value, levels) - plt.gca().set_aspect('equal') - return axtri - - -def plot_one_sampel(x, y, tri, vals_s, pts_2, quad, at_point=False): - """ - This function plots data of a given sample. - """ - import matplotlib.pyplot as plt - - fig = plt.figure(figsize=(15, 4)) - - ax = plt.subplot(131) - if not at_point: - tmp = plot_2D_cut_values_at_elem(x, y, tri, vals_s['G']) - plot_2D_mesh(pts_2, quad, ax) - else: - tmp = plot_2D_cut_values_at_node(x, y, tri, vals_s['G']) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal') - plt.title('G') - - plt.subplot(132) - tmp = plot_2D_cut_values_at_node(x, y, tri, vals_s['y']) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal', format='%.0e') - plt.title('y') - - ax = plt.subplot(133) - if not at_point: - tmp = plot_2D_cut_values_at_elem(x, y, tri, vals_s['von Mises']) - plot_2D_mesh(pts_2, quad, ax) - else: - tmp = plot_2D_cut_values_at_node(x, y, tri, vals_s['von Mises']) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal') - plt.title('von Mises') - - -def plot_diff_abs(x, y, tri, vals, vals_s, pts_2, quad, at_point=False): - """ - This function plots the difference between data of a given sample and the mean sample. - """ - import matplotlib.pyplot as plt - - fig = plt.figure(figsize=(15, 4)) - - plt.subplot(131) - tmp = plot_2D_cut_values_at_node(x, y, tri, vals_s['x'] - vals['x']) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal', format='%.0e') - plt.title('delta x') - - plt.subplot(132) - tmp = plot_2D_cut_values_at_node(x, y, tri, vals_s['y'] - vals['y']) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal', format='%.0e') - plt.title('delta y') - - plt.subplot(133) - tmp = plot_2D_cut_values_at_node(x, y, tri, vals_s['z'] - vals['z']) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal', format='%.0e') - plt.title('delta z') - - -def plot_diff_rel(x, - y, - tri, - vals, - vals_s, - pts_2, - quad, - v_min=-10, - v_max=10, - at_point=False): - """ - This function plots the relative difference between data of a given sample and the mean sample. - """ - import matplotlib.pyplot as plt - - fig = plt.figure(figsize=(15, 4)) - - diff_G = vals_s['G'] - vals['G'] - diff_G_rel = (100 * diff_G / vals['G']) - - plt.subplot(121) - if not at_point: - tmp = plot_2D_cut_values_at_elem(x, - y, - tri, - diff_G_rel, - v_min=v_min, - v_max=v_max) - plot_2D_mesh(pts_2, quad, plt.gca()) - else: - tmp = plot_2D_cut_values_at_node(x, y, tri, diff_G_rel) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal') - plt.clim(v_min, v_max) - plt.title('delta G relative') - - diff_vM = vals_s['von Mises'] - vals['von Mises'] - diff_vM_rel = (100 * diff_vM / vals['von Mises']) - - plt.subplot(122) - if not at_point: - tmp = plot_2D_cut_values_at_elem(x, - y, - tri, - diff_vM_rel, - v_min=v_min, - v_max=v_max) - plot_2D_mesh(pts_2, quad, plt.gca()) - else: - tmp = plot_2D_cut_values_at_node(x, y, tri, diff_vM_rel) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal') - plt.clim(v_min, v_max) - plt.title('delta von Mises relative') - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/fused/katoptron_CMAME_tests_plate_SPD_plate_MG/case_' - - n_it = 6 - iters = np.arange(1, 60) # np.linspace(10,200,n_it,dtype=int) - - n_samples = 8 - cut_of_one_case(1, 8, n_samples, iters, file_MC_base_dir) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/2_cube.py b/katoptron/CMAME/post_process/2_cube.py deleted file mode 100644 index 2fc5d440..00000000 --- a/katoptron/CMAME/post_process/2_cube.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.eigenvalues import * -from katoptron.readers import * -import os -import fwk - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - display = False - - input_file_dir = '/Users/kimliegeois/Desktop/katoptron/katoptron_tests_2_cubes_patch/' - - filename_Q = input_file_dir + 'A_mm_after_bc.txt' - filename_GT = input_file_dir + 'B_mm.txt' - - Q = read_mm(filename_Q) - Q = get_symmetrical_part(Q) - GT = read_mm(filename_GT) - - norm_Q = sparse_matrix_2_norm(Q) - norm_GT = sparse_matrix_2_norm(GT) - - print(norm_Q) - print(norm_GT) - print((norm_Q / norm_GT)) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/grouping.py b/katoptron/CMAME/post_process/grouping.py deleted file mode 100644 index bb53ff5b..00000000 --- a/katoptron/CMAME/post_process/grouping.py +++ /dev/null @@ -1,73 +0,0 @@ - - -# require a git clone https://github.com/kliegeois/Same-Size-K-Means.git - - - - -from clustering.equal_groups import EqualGroupsKMeans -import numpy as np -import matplotlib.pyplot as plt -from sklearn.decomposition import PCA -from mpl_toolkits.mplot3d import Axes3D - - -def compute_the_groups(N, ensemble_size, num_random_variables): - - np.random.seed(42) - - n_clusters = int(N // ensemble_size) - - randomVariable = np.random.normal(0, 1, num_random_variables*N) - X = np.resize(randomVariable, (N, num_random_variables)) - - clf = EqualGroupsKMeans(n_clusters=n_clusters) - - clf.fit(X) - - Z = clf.predict(X) - Z = Z.astype(int) - - for i in range(0, n_clusters): - l_s = len(np.argwhere(Z == i)) - if l_s != ensemble_size: - print('Ensemble ' + str(i) + ' has ' + str(l_s) + - ' samples instead of ' + str(ensemble_size)) - - np.savetxt('Groupe_id_s_'+str(ensemble_size) + - '_'+str(N)+'.txt', Z, fmt='%i') - - indices = np.argsort(Z) - - np.savetxt('Reordering_s_'+str(ensemble_size) + - '_'+str(N)+'.txt', indices, fmt='%i') - - ''' - reduced_data = PCA(n_components=3).fit_transform(X) - - fig = plt.figure() - ax = fig.add_subplot(111, projection='3d') - - x_min, x_max = reduced_data[:, 0].min() - 1, reduced_data[:, 0].max() + 1 - y_min, y_max = reduced_data[:, 1].min() - 1, reduced_data[:, 1].max() + 1 - z_min, z_max = reduced_data[:, 2].min() - 1, reduced_data[:, 2].max() + 1 - ax.scatter(reduced_data[:, 0], reduced_data[:, 1],reduced_data[:, 2], s = 20, c=Z) - ax.set_xlim(x_min, x_max) - ax.set_ylim(y_min, y_max) - ax.set_zlim(z_min, z_max) - plt.show() - ''' - - -def main(): - - N = 960 - num_random_variables = 20 - - compute_the_groups(N, 8, num_random_variables) - compute_the_groups(N, 16, num_random_variables) - compute_the_groups(N, 32, num_random_variables) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/juelich_speedup.py b/katoptron/CMAME/post_process/juelich_speedup.py deleted file mode 100644 index f09084b7..00000000 --- a/katoptron/CMAME/post_process/juelich_speedup.py +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.speedup import * - - -def speedup_of_one_case(n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration): - import matplotlib.pyplot as plt - - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_Juelich_tests_M1_assembly_fused_MC_ER_2/' - # try: - speedup = compute_speedup(n_samples, ensemble_sizes, file_MC_base_dir, - querylines, per_iteration, quantiles, - use_waves_timers, use_teuchos_timers, True) - - plot_speedup(speedup, ensemble_sizes, np.arange(0, len(querylines)), - 'case_', querylines, per_iteration) - plt.savefig('case_.png', dpi=400) - - save_speedup(speedup, ensemble_sizes, querylines, 'case_') - - R = compute_R(n_samples, ensemble_sizes, file_MC_base_dir, quantiles, - True) - save_R(R, 'case_') - # except: - # print '/Volumes/HD_SONY/CMAME/Plate/katoptron_CMAME_tests_plate_MC_case_' + case_id + ' has not all the files' - - -def main(): - import matplotlib.pyplot as plt - - n_samples = 64 - ensemble_sizes = [1, 8, 16, 32] - quantiles = [0, 0.33, 0.5, 0.66, 1.] - - querylines = [ - 'computeMatrices', 'Belos: Operation Op*x', 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: DGKS[2]: Ortho (Inner Product)', - 'Belos: DGKS[2]: Ortho (Norm)', 'Belos: DGKS[2]: Ortho (Update)', - 'total', 'write results', 'MueLu: Hierarchy: Solve (level=0)', - 'MueLu: Hierarchy: Solve (level=1)', - 'MueLu: Hierarchy: Solve : smoothing (level=0)', - 'MueLu: Hierarchy: Solve : prolongation (level=0)', - 'MueLu: Hierarchy: Solve : residual calculation (level=0)', - 'MueLu: Hierarchy: Solve : restriction (level=0)', - 'MueLu: SimpleSmoother: Apply: total (total)', - 'MueLu: SimpleSmoother: Correction step: Compute rhs (total)', - 'MueLu: SimpleSmoother: Correction step: Solve block 11 (total)', - 'MueLu: SimpleSmoother: Prediction step: Compute rhs (total)', - 'MueLu: SimpleSmoother: Prediction step: Solve block 00 (total)' - ] - use_waves_timers = np.array([0, 7, 8], dtype=int) - use_teuchos_timers = np.array( - [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], dtype=int) - per_iteration = [ - False, True, True, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True - ] - - speedup_of_one_case(n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_G.py b/katoptron/CMAME/post_process/plate_G.py deleted file mode 100644 index f250efcd..00000000 --- a/katoptron/CMAME/post_process/plate_G.py +++ /dev/null @@ -1,212 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.eigenvalues import * -from katoptron.readers import * -import os -import fwk - -import vtk -import tboxVtk -import tboxVtk.reader as vtkR -import tboxVtk.cutter as vtkC - - -def Kirsch_equations(x, y, center_x, center_y, a, sigma_inf): - - centered_x = x-center_x - centered_y = y-center_y - - r = np.abs(centered_x+centered_y*1.0j) - theta = np.angle(centered_x+centered_y*1.0j) - (np.pi / 2) - - half_sigma_inf = ((sigma_inf / 2)) - - ar = (a / r) - ar_p_2 = np.power(ar, 2) - ar_p_4 = np.power(ar, 4) - - cos2theta = np.cos(2*theta) - sin2theta = np.sin(2*theta) - - sigma_rr = half_sigma_inf*(1-ar_p_2)+half_sigma_inf * \ - (1-4*ar_p_2+3*ar_p_4)*cos2theta - sigma_thetatheta = half_sigma_inf * \ - (1+ar_p_2)-half_sigma_inf*(1+3*ar_p_4)*cos2theta - tau_rtheta = -half_sigma_inf*(1+2*ar_p_2-3*ar_p_4)*sin2theta - - VM = np.sqrt(np.square(sigma_rr)+np.square(sigma_thetatheta) - - sigma_rr*sigma_thetatheta+3*np.square(tau_rtheta)) - - return VM - - -def cut_plate(mshName): - reader = vtkR.Reader() - reader.open(mshName) - cutter = vtkC.Cutter(reader.reader.GetOutputPort()) - c_output = cutter.cut(1, [0., 0., 0.5], [0., 0., 1.], tag_name='volume_id') - pts, tri, vals = cutter.extract( - c_output, 3, ['u', 'x', 'y', 'z', 'G_point'], atPoint=True) - pts_2, tri_2, vals_2 = cutter.extract( - c_output, 3, ['G', 'von Mises'], atPoint=False) - vals.update(vals_2) - - return pts, tri, vals - - -def extract_quad_msh(mshName): - reader = vtkR.Reader() - reader.open(mshName) - rdata = reader.reader.GetOutput() - - _pts = rdata.GetPoints() - pts = np.zeros((_pts.GetNumberOfPoints(), 2)) - pts_indices = np.zeros((_pts.GetNumberOfPoints(),), dtype=int) - for i in range(0, pts.shape[0]): - if _pts.GetPoint(i)[2] <= 0.01: - for j in range(0, 2): - pts[i][j] = _pts.GetPoint(i)[j] - pts_indices[i] = 1 - n_elems = rdata.GetNumberOfCells() - quad = [] - for i in range(0, n_elems): - elem = rdata.GetCell(i) - for j in range(0, 6): - face = elem.GetFace(j) - points_id = np.zeros((4,), dtype=int) - good_face = True - for k in range(0, 4): - points_id[k] = face.GetPointId(k) - if pts_indices[points_id[k]] != 1: - good_face = False - break - if good_face: - if len(quad) == 0: - quad = points_id.reshape((1, 4)) - else: - quad = np.append(quad, points_id.reshape((1, 4)), axis=0) - return pts, quad - - -def plot_2D_cut_values_at_node(x, y, tri, value, v_min, v_max, n_levels=16): - import matplotlib.pyplot as plt - value = value.reshape((len(x),)) - levels = np.linspace(v_min, v_max, n_levels) - #print levels - - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - plt.tricontour(x, y, tri, value, levels, linestyles='-', - colors='black', linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, value, levels) - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, - hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - - -def plot_2D_cut_values_at_elem(x, y, tri_1, value, v_min, v_max, n_levels=16, shading=False): - import matplotlib.pyplot as plt - - value = value.reshape((tri_1.shape[0],)) - - levels = np.linspace(v_min, v_max, n_levels) - #print levels - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - if shading: - plt.tripcolor(x, y, tri_1, value, shading='gouraud') - else: - plt.tripcolor(x, y, tri_1, value, levels) - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, - hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - - -def plot_2D_mesh(pts, quad): - import matplotlib.pyplot as plt - fig = plt.figure(figsize=(8, 8)) - f = open('mesh_2.tex', 'w') - print('\begin{tikzpicture}', file=f) - for i in range(0, quad.shape[0]): - x = np.zeros((quad.shape[1]+1,)) - y = np.zeros((quad.shape[1]+1,)) - for j in range(0, quad.shape[1]): - x[j] = pts[quad[i, j], 0] - y[j] = pts[quad[i, j], 1] - x[-1] = pts[quad[i, 0], 0] - y[-1] = pts[quad[i, 0], 1] - string_1 = '\draw[thick] ' - for j in range(0, quad.shape[1]+1): - string_1 = string_1 + '(' + str(x[j]) + ',' + str(y[j]) + ')' - if j == quad.shape[1]: - string_1 = string_1 + ';' - else: - string_1 = string_1 + '--' - - print(string_1, file=f) - plt.plot(x, y, 'black') - plt.gca().set_aspect('equal') - - print('\end{tikzpicture}', file=f) - f.closed - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - display = False - - n_samples = 8 - n_cases = 6 - - for i in range(0, n_cases): - min_G = 1e9 - max_G = 0 - for j in range(0, n_samples): - input_file_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_2/case_' + \ - str(i+1)+'/8/0/' - - mshName = input_file_dir+'plate_fused_ast1_s'+str(j)+'_0' - - pts, tri, vals = cut_plate(mshName) - - if max_G <= np.amax(vals['G_point']): - max_G = np.amax(vals['G_point']) - if min_G >= np.amin(vals['G_point']): - min_G = np.amin(vals['G_point']) - - print('Case ' + str(i)) - print(min_G) - print(max_G) - - for j in range(0, n_samples): - input_file_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_2/case_' + \ - str(i+1)+'/8/0/' - - mshName = input_file_dir+'plate_fused_ast1_s'+str(j)+'_0' - - pts, tri, vals = cut_plate(mshName) - - x = pts[:, 0] - y = pts[:, 1] - - plot_2D_cut_values_at_node( - x, y, tri, vals['G_point'], min_G, max_G) - plt.savefig("G_"+str(i)+"_"+str(j)+".pdf", - transparent=True, bbox_inches='tight', pad_inches=-0.05) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_GS_direct.py b/katoptron/CMAME/post_process/plate_GS_direct.py deleted file mode 100644 index bde36488..00000000 --- a/katoptron/CMAME/post_process/plate_GS_direct.py +++ /dev/null @@ -1,318 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -from katoptron.eigenvalues import * -from katoptron.readers import * -from katoptron.readers import * -import os -import fwk -"""@package docstring -This file is used to investigate the choice of prec parameters. -""" - - -def read_timer_all(n_cases, sub_cases, file_MC_base_dir): - querylines = ['Belos: Operation Op*x', - 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: DGKS[2]: Ortho (Inner Product)', - 'Belos: DGKS[2]: Ortho (Norm)', - 'Belos: DGKS[2]: Ortho (Update)', - 'Belos: PseudoBlockGmresSolMgr total solve time'] - timer = np.zeros((n_cases, len(sub_cases), len(querylines))) - for i in range(0, n_cases): - file_MC_base_dir_2 = file_MC_base_dir + '/' + str(i)+'/' - for j in range(0, len(sub_cases)): - input_MC_file_dir = file_MC_base_dir_2 + str(sub_cases[j])+'/' - timer[i, j, :] = read_teuchos_timers( - input_MC_file_dir+'teuchos_timers.txt', querylines) - return timer - - -def read_iter_all(n_cases, sub_cases, file_MC_base_dir): - iter = np.zeros((n_cases, len(sub_cases))) - for i in range(0, n_cases): - file_MC_base_dir_2 = file_MC_base_dir + '/' + str(i)+'/' - for j in range(0, len(sub_cases)): - input_MC_file_dir = file_MC_base_dir_2 + str(sub_cases[j])+'/' - iter_indices, residuals = read_Belos( - input_MC_file_dir + 'belos_out.txt', 1) - iter[i][j] = iter_indices[-1] - return iter - - -def read_timer_tensor(n_cases, sub_cases, file_MC_base_dir, sizes): - import numpy as np - timer = read_timer_all(n_cases, sub_cases, file_MC_base_dir) - - n_0 = sizes[0] - n_1 = sizes[1] - n_2 = sizes[2] - n_3 = sizes[3] - - timer_tensor = np.zeros( - (n_0, n_1, n_2, n_3, len(sub_cases), timer.shape[2])) - - i = 0 - - for i_0 in range(0, n_0): - for i_1 in range(0, n_1): - for i_2 in range(0, n_2): - for i_3 in range(0, n_3): - if i < timer.shape[0]: - timer_tensor[i_0, i_1, i_2, i_3, :, :] = timer[i, :, :] - i = i + 1 - else: - return timer_tensor - - return timer_tensor - - -def read_iter_tensor(n_cases, sub_cases, file_MC_base_dir, sizes): - import numpy as np - iter = read_iter_all(n_cases, sub_cases, file_MC_base_dir) - - n_0 = sizes[0] - n_1 = sizes[1] - n_2 = sizes[2] - n_3 = sizes[3] - - iter_tensor = np.zeros((n_0, n_1, n_2, n_3, len(sub_cases))) - - i = 0 - - for i_0 in range(0, n_0): - for i_1 in range(0, n_1): - for i_2 in range(0, n_2): - for i_3 in range(0, n_3): - if i < iter.shape[0]: - iter_tensor[i_0, i_1, i_2, i_3, :] = iter[i, :] - i = i + 1 - else: - return iter_tensor - - return iter_tensor - - -def main(): - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - test = 1 - EP = True - if test == 1: - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/gaussian/katoptron_CMAME_tests_plate_mean_prec_GS_direct/' - #file_dir + '/../../../workspace/katoptron_CMAME_tests_plate_mean_prec_GS_direct/' - sub_cases = ['mean_case', 'ensemble_reduction_8'] - - GS_sweeps_00_min = 16 - GS_sweeps_00_max = 41 - delta_GS_sweeps_00 = 2 - - N_GS_sweeps_00 = int( - np.ceil( - ((GS_sweeps_00_max - GS_sweeps_00_min * 1.) / delta_GS_sweeps_00))) - - # Damping has to be between 0 and 2 - GS_damping_00_min = 1.75 - GS_damping_00_max = 1.9 - N_GS_damping_00 = 8 - - # Omega has to be between 0 and 1 - SS_omega_min = 0.001 - SS_omega_max = 0.5 - N_SS_omega = 12 - - SS_damping_min = 1. - SS_damping_max = 1.2 - N_SS_damping = 1 - - n_cases = 1248 - elif test == 2: - file_MC_base_dir = file_dir + \ - '/../../../workspace/katoptron_CMAME_tests_plate_mean_prec_GS_direct_alphabeta_1/' - sub_cases = ['mean_case', 'ensemble_reduction_8'] - - GS_sweeps_00_min = 16 - GS_sweeps_00_max = 41 - delta_GS_sweeps_00 = 2 - - N_GS_sweeps_00 = int( - np.ceil( - ((GS_sweeps_00_max - GS_sweeps_00_min * 1.) / delta_GS_sweeps_00))) - - # Damping has to be between 0 and 2 - GS_damping_00_min = 0.001 - GS_damping_00_max = 1.999 - N_GS_damping_00 = 20 - - # Omega has to be between 0 and 1 - SS_omega_min = 1. - SS_omega_max = 1.2 - N_SS_omega = 1 - - SS_damping_min = 1. - SS_damping_max = 1.2 - N_SS_damping = 1 - - n_cases = 260 - - elif test == 3: - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/katoptron_CMAME_tests_plate_mean_prec_GS_direct_lvl/' - sub_cases = ['mean_case'] - - GS_sweeps_00_min = 16 - GS_sweeps_00_max = 17 - delta_GS_sweeps_00 = 1 - - N_GS_sweeps_00 = int( - np.ceil( - ((GS_sweeps_00_max - GS_sweeps_00_min * 1.) / delta_GS_sweeps_00))) - - # Damping has to be between 0 and 2 - GS_damping_00_min = 0.001 - GS_damping_00_max = 0.8 - N_GS_damping_00 = 50 - - # Omega has to be between 0 and 1 - SS_omega_min = 0.75 - SS_omega_max = 1.1 - N_SS_omega = 5 - - SS_damping_min = 1. - SS_damping_max = 1. - N_SS_damping = 1 - - n_cases = 181 - EP = False - - iter = read_iter_tensor(n_cases, sub_cases, file_MC_base_dir, [ - N_GS_sweeps_00, N_GS_damping_00, N_SS_omega, N_SS_damping]) - timer = read_timer_tensor(n_cases, sub_cases, file_MC_base_dir, [ - N_GS_sweeps_00, N_GS_damping_00, N_SS_omega, N_SS_damping]) - - sweeps_00 = np.arange( - GS_sweeps_00_min, GS_sweeps_00_max, delta_GS_sweeps_00) - damping_00 = np.linspace( - GS_damping_00_min, GS_damping_00_max, N_GS_damping_00) - SS_omega = np.linspace(SS_omega_min, SS_omega_max, N_SS_omega) - SS_damping = np.linspace(SS_damping_min, SS_damping_max, N_SS_damping) - - from mpl_toolkits.mplot3d import Axes3D - import matplotlib.pyplot as plt - from matplotlib import cm - - opti = np.zeros((N_GS_sweeps_00, 3), dtype=int) - opti_2 = np.zeros((N_GS_sweeps_00, 3), dtype=int) - opti_iter = np.zeros((N_GS_sweeps_00, 1), dtype=int) - opti_iter_2 = np.zeros((N_GS_sweeps_00, 1), dtype=int) - opti_iter_2_one = np.zeros((N_GS_sweeps_00, 1), dtype=int) - R = np.zeros((N_GS_sweeps_00, 1)) - opti_time = np.zeros((N_GS_sweeps_00, 7)) - opti_time_2 = np.zeros((N_GS_sweeps_00, 7)) - opti_time_per_iter = np.zeros((N_GS_sweeps_00, 7)) - - #opti_iter_8 = np.array([500,469,382,338,280,255,254,239,218,213,204,197],dtype=int) - - for i in range(0, N_GS_sweeps_00): - tmp = iter[i, :, :, :, 0] - tmp[tmp == 0] = 1000 - opti[i, :] = np.unravel_index(np.argmin(tmp, axis=None), tmp.shape) - print(str(sweeps_00[i]) + ' ' + str(damping_00[opti[i, 0]] - ) + ' ' + str(SS_omega[opti[i, 1]])) - opti_iter[i] = iter[i, opti[i, 0], opti[i, 1], 0, 0] - opti_time[i, :] = timer[i, opti[i, 0], opti[i, 1], 0, 0, :] - if EP: - tmp2 = iter[i, :, :, :, 1] - opti_2[i, :] = np.unravel_index( - np.argmin(tmp2, axis=None), tmp.shape) - print(str(sweeps_00[i]) + ' ' + str(damping_00[opti_2[i, 0]] - ) + ' ' + str(SS_omega[opti_2[i, 1]])) - opti_iter_2[i] = iter[i, opti_2[i, 0], opti_2[i, 1], 0, 1] - opti_iter_2_one[i] = iter[i, opti_2[i, 0], opti_2[i, 1], 0, 0] - opti_time_2[i, :] = timer[i, opti_2[i, 0], opti_2[i, 1], 0, 1, :] - if opti_iter_2[i] == 1000: - R[i] = 10. - else: - R[i] = opti_iter_2[i]*1. / opti_iter[i] - for j in range(0, 7): - opti_time_per_iter[i, j] = ( - opti_time[i, j] / opti_iter[i]) - #R[i] = opti_iter_8[i]*1. / opti_iter[i] - - tmp = np.zeros((N_GS_sweeps_00, 2)) - tmp[:, 0] = sweeps_00[:] - tmp[:, 1] = np.reshape(opti_iter, (N_GS_sweeps_00,)) - np.savetxt('opti_iter.txt', tmp) - if EP: - tmp[:, 1] = np.reshape(opti_iter_2, (N_GS_sweeps_00,)) - np.savetxt('opti_iter_2.txt', tmp) - tmp[:, 1] = np.reshape(opti_iter_2_one, (N_GS_sweeps_00,)) - np.savetxt('opti_iter_2_one.txt', tmp) - - plt.subplot(511) - plt.plot(sweeps_00, opti_iter) - plt.grid() - plt.subplot(512) - plt.plot(sweeps_00, opti_iter) - if EP: - plt.plot(sweeps_00, opti_iter_2) - plt.plot(sweeps_00, opti_iter_2_one) - plt.grid() - plt.subplot(513) - if EP: - plt.plot(sweeps_00, R) - plt.grid() - plt.subplot(514) - plt.plot(sweeps_00, damping_00[opti[:, 0]]) - if EP: - plt.plot(sweeps_00, damping_00[opti_2[:, 0]]) - plt.grid() - plt.subplot(515) - plt.plot(sweeps_00, SS_omega[opti[:, 1]]) - if EP: - plt.plot(sweeps_00, SS_omega[opti_2[:, 1]]) - plt.grid() - print(np.argmin(opti_time[:, 6])) - print(opti) - plt.figure() - for i in range(0, N_GS_sweeps_00): - plt.subplot(2, N_GS_sweeps_00, 1+i) - plt.plot(damping_00, iter[i, :, opti[i, 1], 0, 0]) - plt.scatter(damping_00[opti[i, 0]], opti_iter[i], c='red') - plt.subplot(2, N_GS_sweeps_00, 1+i+N_GS_sweeps_00) - plt.plot(SS_omega, iter[i, opti[i, 0], :, 0, 0]) - plt.scatter(SS_omega[opti[i, 1]], opti_iter[i], c='red') - ''' - plt.figure() - plt.plot(sweeps_00,damping_00[opti[:,0]]) - - plt.figure() - plt.plot(sweeps_00,SS_omega[opti[:,1]]) - - plt.figure() - for i in range(0,8): - plt.plot(damping_00,iter[0,:,i,0,0]) - - plt.figure() - for i in range(0,8): - plt.plot(SS_omega,iter[0,i,:,0,0]) - - plt.figure() - for i in range(0,6): - plt.plot(SS_omega,iter[i,5,:,0,0]) - - for i in range(0,N_GS_sweeps_00): - fig = plt.figure() - ax = fig.add_subplot(111, projection='3d') - X, Y = np.meshgrid(SS_omega,damping_00) - ax.plot_surface(X, Y, iter[i,:,:,0,0], cmap=cm.coolwarm, - linewidth=0, alpha=0.8) - ax.set_zlim(0, 400) - ax.scatter(SS_omega[opti[i,1]],damping_00[opti[i,0]],opti_iter[i], c='red') - ''' - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_GS_direct_fused.py b/katoptron/CMAME/post_process/plate_GS_direct_fused.py deleted file mode 100644 index ea15b899..00000000 --- a/katoptron/CMAME/post_process/plate_GS_direct_fused.py +++ /dev/null @@ -1,278 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -from katoptron.eigenvalues import * -from katoptron.readers import * -from katoptron.readers import * -import os -import fwk -"""@package docstring -This file is used to investigate the choice of prec parameters. -""" - - -def read_timer_all(n_cases, sub_cases, file_MC_base_dir): - querylines = ['Belos: Operation Op*x', - 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: DGKS[2]: Ortho (Inner Product)', - 'Belos: DGKS[2]: Ortho (Norm)', - 'Belos: DGKS[2]: Ortho (Update)', - 'Belos: PseudoBlockGmresSolMgr total solve time'] - timer = np.zeros((n_cases, len(sub_cases), len(querylines))) - for i in range(0, n_cases): - file_MC_base_dir_2 = file_MC_base_dir + '/' + str(i)+'/' - for j in range(0, len(sub_cases)): - input_MC_file_dir = file_MC_base_dir_2 + str(sub_cases[j])+'/' - timer[i, j, :] = read_teuchos_timers( - input_MC_file_dir+'teuchos_timers.txt', querylines) - return timer - - -def read_iter_all(n_cases, sub_cases, file_MC_base_dir): - iter = np.zeros((n_cases, len(sub_cases))) - for i in range(0, n_cases): - file_MC_base_dir_2 = file_MC_base_dir + '/' + str(i)+'/' - for j in range(0, len(sub_cases)): - input_MC_file_dir = file_MC_base_dir_2 + str(sub_cases[j])+'/' - iter_indices, residuals = read_Belos( - input_MC_file_dir + 'belos_out.txt', 1) - iter[i][j] = iter_indices[-1] - return iter - - -def read_timer_tensor(n_cases, sub_cases, file_MC_base_dir, sizes): - import numpy as np - timer = read_timer_all(n_cases, sub_cases, file_MC_base_dir) - - n_0 = sizes[0] - n_1 = sizes[1] - n_2 = sizes[2] - n_3 = sizes[3] - - timer_tensor = np.zeros( - (n_0, n_1, n_2, n_3, len(sub_cases), timer.shape[2])) - - i = 0 - - for i_0 in range(0, n_0): - for i_1 in range(0, n_1): - for i_2 in range(0, n_2): - for i_3 in range(0, n_3): - if i < timer.shape[0]: - timer_tensor[i_0, i_1, i_2, i_3, :, :] = timer[i, :, :] - i = i + 1 - else: - return timer_tensor - - return timer_tensor - - -def read_iter_tensor(n_cases, sub_cases, file_MC_base_dir, sizes): - import numpy as np - iter = read_iter_all(n_cases, sub_cases, file_MC_base_dir) - - n_0 = sizes[0] - n_1 = sizes[1] - n_2 = sizes[2] - n_3 = sizes[3] - - iter_tensor = np.zeros((n_0, n_1, n_2, n_3, len(sub_cases))) - - i = 0 - - for i_0 in range(0, n_0): - for i_1 in range(0, n_1): - for i_2 in range(0, n_2): - for i_3 in range(0, n_3): - if i < iter.shape[0]: - iter_tensor[i_0, i_1, i_2, i_3, :] = iter[i, :] - i = i + 1 - else: - return iter_tensor - - return iter_tensor - - -def main(): - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - test = 2 - if test == 1: - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/gaussian/katoptron_CMAME_tests_plate_mean_prec_GS_direct/' - #file_dir + '/../../../workspace/katoptron_CMAME_tests_plate_mean_prec_GS_direct/' - sub_cases = ['mean_case', 'ensemble_reduction_8'] - - GS_sweeps_00_min = 16 - GS_sweeps_00_max = 41 - delta_GS_sweeps_00 = 2 - - N_GS_sweeps_00 = int( - np.ceil( - ((GS_sweeps_00_max - GS_sweeps_00_min * 1.) / delta_GS_sweeps_00))) - - # Damping has to be between 0 and 2 - GS_damping_00_min = 1.75 - GS_damping_00_max = 1.9 - N_GS_damping_00 = 8 - - # Omega has to be between 0 and 1 - SS_omega_min = 0.001 - SS_omega_max = 0.5 - N_SS_omega = 12 - - SS_damping_min = 1. - SS_damping_max = 1.2 - N_SS_damping = 1 - - n_cases = 1248 - elif test == 2: - file_MC_base_dir = file_dir + \ - '/../../../workspace/katoptron_CMAME_tests_fused_plate_mean_prec_GS/' - sub_cases = ['mean_case', 'ensemble_reduction_8'] - - GS_sweeps_00_min = 1 - GS_sweeps_00_max = 41 - delta_GS_sweeps_00 = 1 - - N_GS_sweeps_00 = int( - np.ceil( - ((GS_sweeps_00_max - GS_sweeps_00_min * 1.) / delta_GS_sweeps_00))) - - # Damping has to be between 0 and 2 - GS_damping_00_min = 0.001 - GS_damping_00_max = 1.999 - N_GS_damping_00 = 50 - - # Omega has to be between 0 and 1 - SS_omega_min = 1. - SS_omega_max = 1.2 - N_SS_omega = 1 - - SS_damping_min = 1. - SS_damping_max = 1.2 - N_SS_damping = 1 - - n_cases = 2000 - - iter = read_iter_tensor(n_cases, sub_cases, file_MC_base_dir, [ - N_GS_sweeps_00, N_GS_damping_00, N_SS_omega, N_SS_damping]) - timer = read_timer_tensor(n_cases, sub_cases, file_MC_base_dir, [ - N_GS_sweeps_00, N_GS_damping_00, N_SS_omega, N_SS_damping]) - - sweeps_00 = np.arange( - GS_sweeps_00_min, GS_sweeps_00_max, delta_GS_sweeps_00) - damping_00 = np.linspace( - GS_damping_00_min, GS_damping_00_max, N_GS_damping_00) - SS_omega = np.linspace(SS_omega_min, SS_omega_max, N_SS_omega) - SS_damping = np.linspace(SS_damping_min, SS_damping_max, N_SS_damping) - - from mpl_toolkits.mplot3d import Axes3D - import matplotlib.pyplot as plt - from matplotlib import cm - - opti = np.zeros((N_GS_sweeps_00, 3), dtype=int) - opti_2 = np.zeros((N_GS_sweeps_00, 3), dtype=int) - opti_iter = np.zeros((N_GS_sweeps_00, 1), dtype=int) - opti_iter_2 = np.zeros((N_GS_sweeps_00, 1), dtype=int) - opti_iter_2_one = np.zeros((N_GS_sweeps_00, 1), dtype=int) - R = np.zeros((N_GS_sweeps_00, 1)) - opti_time = np.zeros((N_GS_sweeps_00, 7)) - opti_time_2 = np.zeros((N_GS_sweeps_00, 7)) - opti_time_per_iter = np.zeros((N_GS_sweeps_00, 7)) - - #opti_iter_8 = np.array([500,469,382,338,280,255,254,239,218,213,204,197],dtype=int) - - for i in range(0, N_GS_sweeps_00): - tmp = iter[i, :, :, :, 0] - tmp2 = iter[i, :, :, :, 1] - tmp3 = np.copy(tmp) - tmp3[tmp3 >= 1000] = 1 - opti[i, :] = np.unravel_index(np.argmin(tmp, axis=None), tmp.shape) - opti_2[i, :] = np.unravel_index(np.argmin(tmp2, axis=None), tmp.shape) - print(str(sweeps_00[i]) + ' ' + str(damping_00[opti[i, 0]] - ) + ' ' + str(SS_omega[opti[i, 1]])) - print(str(sweeps_00[i]) + ' ' + str(damping_00[opti_2[i, 0]] - ) + ' ' + str(SS_omega[opti_2[i, 1]])) - opti_iter[i] = iter[i, opti[i, 0], opti[i, 1], 0, 0] - opti_iter_2[i] = iter[i, opti_2[i, 0], opti_2[i, 1], 0, 1] - opti_iter_2_one[i] = iter[i, opti_2[i, 0], opti_2[i, 1], 0, 0] - opti_time[i, :] = timer[i, opti[i, 0], opti[i, 1], 0, 0, :] - opti_time_2[i, :] = timer[i, opti_2[i, 0], opti_2[i, 1], 0, 1, :] - if opti_iter_2[i] == 1000: - R[i] = 10. - else: - R[i] = opti_iter_2[i]*1. / opti_iter[i] - for j in range(0, 7): - opti_time_per_iter[i, j] = (opti_time[i, j] / opti_iter[i]) - #R[i] = opti_iter_8[i]*1. / opti_iter[i] - - plt.subplot(411) - plt.plot(sweeps_00, opti_iter) - plt.grid() - plt.subplot(412) - plt.plot(sweeps_00, opti_iter) - plt.plot(sweeps_00, opti_iter_2) - plt.plot(sweeps_00, opti_iter_2_one) - plt.grid() - plt.subplot(413) - plt.plot(sweeps_00, R) - plt.grid() - plt.subplot(414) - plt.plot(sweeps_00, damping_00[opti[:, 0]]) - plt.plot(sweeps_00, damping_00[opti_2[:, 0]]) - plt.grid() - #print np.argmin(opti_time[:,6]) - #print opti - - tmp = np.zeros((N_GS_sweeps_00, 2)) - tmp[:, 0] = sweeps_00[:] - tmp[:, 1] = np.reshape(opti_iter, (N_GS_sweeps_00,)) - np.savetxt('opti_iter.txt', tmp) - tmp[:, 1] = np.reshape(opti_iter_2, (N_GS_sweeps_00,)) - np.savetxt('opti_iter_2.txt', tmp) - tmp[:, 1] = np.reshape(opti_iter_2_one, (N_GS_sweeps_00,)) - np.savetxt('opti_iter_2_one.txt', tmp) - ''' - plt.figure() - for i in range(0,N_GS_sweeps_00): - plt.subplot(2,N_GS_sweeps_00,1+i) - plt.plot(damping_00,iter[i,:,opti[i,1],0,0]) - plt.scatter(damping_00[opti[i,0]],opti_iter[i], c='red') - plt.subplot(2,N_GS_sweeps_00,1+i+N_GS_sweeps_00) - plt.plot(SS_omega,iter[i,opti[i,0],:,0,0]) - plt.scatter(SS_omega[opti[i,1]],opti_iter[i], c='red') - - plt.figure() - plt.plot(sweeps_00,damping_00[opti[:,0]]) - - plt.figure() - plt.plot(sweeps_00,SS_omega[opti[:,1]]) - - plt.figure() - for i in range(0,8): - plt.plot(damping_00,iter[0,:,i,0,0]) - - plt.figure() - for i in range(0,8): - plt.plot(SS_omega,iter[0,i,:,0,0]) - - plt.figure() - for i in range(0,6): - plt.plot(SS_omega,iter[i,5,:,0,0]) - - for i in range(0,N_GS_sweeps_00): - fig = plt.figure() - ax = fig.add_subplot(111, projection='3d') - X, Y = np.meshgrid(SS_omega,damping_00) - ax.plot_surface(X, Y, iter[i,:,:,0,0], cmap=cm.coolwarm, - linewidth=0, alpha=0.8) - ax.set_zlim(0, 400) - ax.scatter(SS_omega[opti[i,1]],damping_00[opti[i,0]],opti_iter[i], c='red') - ''' - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_MC.py b/katoptron/CMAME/post_process/plate_MC.py deleted file mode 100644 index e30d1341..00000000 --- a/katoptron/CMAME/post_process/plate_MC.py +++ /dev/null @@ -1,357 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -from katoptron.eigenvalues import * -import os -import fwk -"""@package docstring -This file is used to loop over cases and samples and plot their mechanical properties and solution fields. -""" - -import vtk -import tboxVtk -import tboxVtk.reader as vtkR -import tboxVtk.cutter as vtkC - -from katoptron.CMAME.model import Compute_QoIs - - -def plot_2D_mesh(pts, quad, ax): - """ - This function plots a 2D quad mesh on a given matplotlib axis - """ - import matplotlib.pyplot as plt - for i in range(0, quad.shape[0]): - x = np.zeros((quad.shape[1] + 1, )) - y = np.zeros((quad.shape[1] + 1, )) - for j in range(0, quad.shape[1]): - x[j] = pts[quad[i, j], 0] - y[j] = pts[quad[i, j], 1] - x[-1] = pts[quad[i, 0], 0] - y[-1] = pts[quad[i, 0], 1] - ax.plot(x, y, '--k', linewidth=0.5) - - -def cut_of_one_case(case_id, - ensemble_size, - n_samples, - v_min, - v_max, - file_MC_mean, - file_MC_base_dir, - at_point=False): - """ - This function loops over the samples of a given test case and plot them - """ - import matplotlib.pyplot as plt - - pts, tri, vals = cut_plate(file_MC_mean, at_point) - pts_2, quad = extract_quad_msh(file_MC_mean) - - x = pts[:, 0] - y = pts[:, 1] - - QoIs = np.zeros((4, n_samples)) - - plot_one_sampel(x, y, tri, vals, pts_2, quad, at_point) - plt.savefig('mean_case.png', dpi=400) - - file_MC_base_dir_tmp = file_MC_base_dir + str(case_id) + '/' + str( - ensemble_size) + '/' - - directory = 'case_' + str(case_id) - if not os.path.exists(directory): - os.makedirs(directory) - os.makedirs(directory + '/sample') - os.makedirs(directory + '/abs') - os.makedirs(directory + '/rel') - - for i in range(0, n_samples): - i_ensemble = (i // ensemble_size) - i_sample = np.mod(i, ensemble_size) - input_MC_file_dir = file_MC_base_dir_tmp + str(i_ensemble) + '/' - mshName_sample = input_MC_file_dir + 'plate_fused_ast1_s' + str( - i_sample) + '_0' - - QoIs[:, i] = Compute_QoIs(mshName_sample) - - pts_s, tri_s, vals_s = cut_plate(mshName_sample, at_point) - - plot_one_sampel(x, y, tri, vals_s, pts_2, quad, at_point) - plt.savefig(directory + '/sample/' + str(i) + '.png', dpi=400) - plot_diff_rel(x, - y, - tri, - vals, - vals_s, - pts_2, - quad, - v_min=v_min, - v_max=v_max, - at_point=at_point) - plt.savefig(directory + '/rel/' + str(i) + '.png', dpi=400) - plot_diff_abs(x, y, tri, vals, vals_s, pts_2, quad, at_point) - plt.savefig(directory + '/abs/' + str(i) + '.png', dpi=400) - plt.close('all') - for i in range(0, 4): - plt.figure() - plt.hist(QoIs[i, :], bins=80, density=True) - plt.xlabel('[MPa]') - plt.savefig('QoI_' + str(i) + '_case_' + str(case_id) + '.png', - dpi=400) - - plt.close('all') - - -def extract_quad_msh(mshName): - """ - This function extracts the 2D quad mesh out of a hexahedron mesh - """ - reader = vtkR.Reader() - reader.open(mshName) - rdata = reader.reader.GetOutput() - - _pts = rdata.GetPoints() - pts = np.zeros((_pts.GetNumberOfPoints(), 2)) - pts_indices = np.zeros((_pts.GetNumberOfPoints(), ), dtype=int) - for i in range(0, pts.shape[0]): - if _pts.GetPoint(i)[2] <= 0.01: - for j in range(0, 2): - pts[i][j] = _pts.GetPoint(i)[j] - pts_indices[i] = 1 - n_elems = rdata.GetNumberOfCells() - quad = [] - for i in range(0, n_elems): - elem = rdata.GetCell(i) - for j in range(0, 6): - face = elem.GetFace(j) - points_id = np.zeros((4, ), dtype=int) - good_face = True - for k in range(0, 4): - points_id[k] = face.GetPointId(k) - if pts_indices[points_id[k]] != 1: - good_face = False - break - if good_face: - if len(quad) == 0: - quad = points_id.reshape((1, 4)) - else: - quad = np.append(quad, points_id.reshape((1, 4)), axis=0) - return pts, quad - - -def cut_plate(mshName, at_point=False): - """ - This function cuts the vtk files in the middle and extracts both point - and element data. - """ - reader = vtkR.Reader() - reader.open(mshName) - cutter = vtkC.Cutter(reader.reader.GetOutputPort()) - c_output = cutter.cut(1, [0., 0., 0.5], [0., 0., 1.], tag_name='volume_id') - if at_point: - pts, tri, vals = cutter.extract(c_output, - 3, - ['u', 'x', 'y', 'z', 'G', 'von Mises'], - atPoint=True) - else: - pts, tri, vals = cutter.extract(c_output, - 3, ['u', 'x', 'y', 'z'], - atPoint=True) - pts_2, tri_2, vals_2 = cutter.extract(c_output, - 3, ['G', 'von Mises'], - atPoint=False) - vals.update(vals_2) - - return pts, tri, vals - - -def plot_2D_cut_values_at_node(x, y, tri, value, n_levels=16): - """ - This function plots data at node. - """ - import matplotlib.pyplot as plt - value = value.reshape((len(x), )) - if max(value) - min(value) > 0: - levels = np.linspace(min(value), max(value), n_levels) - plt.set_cmap('coolwarm') - plt.tricontour(x, - y, - tri, - value, - levels, - linestyles='-', - colors='black', - linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, value, levels) - else: - axtri = plt.tricontourf(x, y, tri, value) - plt.gca().set_aspect('equal') - return axtri - - -def plot_2D_cut_values_at_elem(x, - y, - tri_1, - value, - v_min=0, - v_max=0, - n_levels=16, - shading=False): - """ - This function plots data at element. - """ - import matplotlib.pyplot as plt - - value = value.reshape((tri_1.shape[0], )) - if v_min == v_max: - v_min = min(value) - v_max = max(value) - - levels = np.linspace(v_min, v_max, n_levels) - plt.set_cmap('coolwarm') - if shading: - axtri = plt.tripcolor(x, y, tri_1, value, shading='gouraud') - else: - axtri = plt.tripcolor(x, y, tri_1, value, levels) - plt.gca().set_aspect('equal') - return axtri - - -def plot_one_sampel(x, y, tri, vals_s, pts_2, quad, at_point=False): - """ - This function plots data of a given sample. - """ - import matplotlib.pyplot as plt - - fig = plt.figure(figsize=(15, 4)) - - ax = plt.subplot(131) - if not at_point: - tmp = plot_2D_cut_values_at_elem(x, y, tri, vals_s['G']) - plot_2D_mesh(pts_2, quad, ax) - else: - tmp = plot_2D_cut_values_at_node(x, y, tri, vals_s['G']) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal') - plt.title('G') - - plt.subplot(132) - tmp = plot_2D_cut_values_at_node(x, y, tri, vals_s['y']) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal', format='%.0e') - plt.title('y') - - ax = plt.subplot(133) - if not at_point: - tmp = plot_2D_cut_values_at_elem(x, y, tri, vals_s['von Mises']) - plot_2D_mesh(pts_2, quad, ax) - else: - tmp = plot_2D_cut_values_at_node(x, y, tri, vals_s['von Mises']) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal') - plt.title('von Mises') - - -def plot_diff_abs(x, y, tri, vals, vals_s, pts_2, quad, at_point=False): - """ - This function plots the difference between data of a given sample and the mean sample. - """ - import matplotlib.pyplot as plt - - fig = plt.figure(figsize=(15, 4)) - - plt.subplot(131) - if not at_point: - tmp = plot_2D_cut_values_at_elem(x, y, tri, vals_s['G'] - vals['G']) - plot_2D_mesh(pts_2, quad, plt.gca()) - else: - tmp = plot_2D_cut_values_at_node(x, y, tri, vals_s['G'] - vals['G']) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal') - plt.title('delta G') - - plt.subplot(132) - tmp = plot_2D_cut_values_at_node(x, y, tri, vals_s['y'] - vals['y']) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal', format='%.0e') - plt.title('delta y') - - plt.subplot(133) - if not at_point: - tmp = plot_2D_cut_values_at_elem( - x, y, tri, vals_s['von Mises'] - vals['von Mises']) - plot_2D_mesh(pts_2, quad, plt.gca()) - else: - tmp = plot_2D_cut_values_at_node( - x, y, tri, vals_s['von Mises'] - vals['von Mises']) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal') - plt.title('delta von Mises') - - -def plot_diff_rel(x, - y, - tri, - vals, - vals_s, - pts_2, - quad, - v_min=-10, - v_max=10, - at_point=False): - """ - This function plots the relative difference between data of a given sample and the mean sample. - """ - import matplotlib.pyplot as plt - - fig = plt.figure(figsize=(15, 4)) - - diff_G = vals_s['G'] - vals['G'] - diff_G_rel = (100 * diff_G / vals['G']) - - plt.subplot(121) - if not at_point: - tmp = plot_2D_cut_values_at_elem(x, - y, - tri, - diff_G_rel, - v_min=v_min, - v_max=v_max) - plot_2D_mesh(pts_2, quad, plt.gca()) - else: - tmp = plot_2D_cut_values_at_node(x, y, tri, diff_G_rel) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal') - plt.clim(v_min, v_max) - plt.title('delta G relative') - - diff_vM = vals_s['von Mises'] - vals['von Mises'] - diff_vM_rel = (100 * diff_vM / vals['von Mises']) - - plt.subplot(122) - if not at_point: - tmp = plot_2D_cut_values_at_elem(x, - y, - tri, - diff_vM_rel, - v_min=v_min, - v_max=v_max) - plot_2D_mesh(pts_2, quad, plt.gca()) - else: - tmp = plot_2D_cut_values_at_node(x, y, tri, diff_vM_rel) - fig.colorbar(tmp, ax=plt.gca(), orientation='horizontal') - plt.clim(v_min, v_max) - plt.title('delta von Mises relative') - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - - file_MC_mean = file_dir + \ - '/../../../workspace/katoptron_CMAME_tests_plate/plate_fused_ast1_s0_0' - - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/gaussian/katoptron_CMAME_tests_plate_MC_GS_all_cases/case_' - n_samples = 96 - for i in range(1, 7): - cut_of_one_case(i, 32, n_samples, -10, 10, file_MC_mean, - file_MC_base_dir, False) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_MC_MG_speedup.py b/katoptron/CMAME/post_process/plate_MC_MG_speedup.py deleted file mode 100644 index f7a178a3..00000000 --- a/katoptron/CMAME/post_process/plate_MC_MG_speedup.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - -from katoptron.speedup import * - - -def speedup_of_one_case(case_id, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration): - import matplotlib.pyplot as plt - - case_id = str(case_id) - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_4_NER/case_' + case_id - #'/Volumes/HD_SONY/CMAME/Plate/MG/all/katoptron_CMAME_tests_plate_MC_MG_all_cases 2/case_' + case_id - # try: - speedup = compute_speedup(n_samples, ensemble_sizes, file_MC_base_dir, - querylines, per_iteration, quantiles, - use_waves_timers, use_teuchos_timers, False) - - plot_speedup(speedup, ensemble_sizes, np.arange(0, len(querylines)), - 'case_' + case_id, querylines, per_iteration) - plt.savefig('case_' + case_id + '.png', dpi=400) - - save_speedup(speedup, ensemble_sizes, querylines, 'case_' + case_id) - - R = compute_R(n_samples, ensemble_sizes, file_MC_base_dir, quantiles, - False) - save_R(R, 'case_' + case_id) - # except: - # print '/Volumes/HD_SONY/CMAME/Plate/katoptron_CMAME_tests_plate_MC_case_' + case_id + ' has not all the files' - - -def main(): - import matplotlib.pyplot as plt - - n_samples = 64 - ensemble_sizes = [1, 8, 16, 32] - quantiles = [0, 0.33, 0.5, 0.66, 1.] - - querylines = [ - 'computeMatrices', 'Belos: Operation Op*x', 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: DGKS[2]: Ortho (Inner Product)', - 'Belos: DGKS[2]: Ortho (Norm)', 'Belos: DGKS[2]: Ortho (Update)', - 'total', 'write results', 'MueLu: Hierarchy: Solve (level=0)', - 'MueLu: Hierarchy: Solve (level=1)', - 'MueLu: Hierarchy: Solve : smoothing (level=0)', - 'MueLu: Hierarchy: Solve : prolongation (level=0)', - 'MueLu: Hierarchy: Solve : residual calculation (level=0)', - 'MueLu: Hierarchy: Solve : restriction (level=0)', - 'MueLu: SIMPLE: Apply: Update step - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Solve block 00 - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Compute RHS - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Solve block 11 - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Compute RHS - level 0' - ] - use_waves_timers = np.array([0, 7, 8], dtype=int) - use_teuchos_timers = np.array( - [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], dtype=int) - per_iteration = [ - False, True, True, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True - ] - - for i in range(1, 7): - speedup_of_one_case(i, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_MC_MG_speedup_200_ER.py b/katoptron/CMAME/post_process/plate_MC_MG_speedup_200_ER.py deleted file mode 100644 index fd58d82a..00000000 --- a/katoptron/CMAME/post_process/plate_MC_MG_speedup_200_ER.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - -from katoptron.speedup import * - - -def speedup_of_one_case(case_id, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration): - import matplotlib.pyplot as plt - - case_id = str(case_id) - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Final_MT/katoptron_CMAME_tests_plate_MC_MG_all_cases_200/case_' + case_id - #'/Volumes/HD_SONY/CMAME/Plate/MG/all/katoptron_CMAME_tests_plate_MC_MG_all_cases 2/case_' + case_id - # try: - speedup = compute_speedup(n_samples, ensemble_sizes, file_MC_base_dir, - querylines, per_iteration, quantiles, - use_waves_timers, use_teuchos_timers, True) - - plot_speedup(speedup, ensemble_sizes, np.arange(0, len(querylines)), - 'case_' + case_id, querylines, per_iteration) - plt.savefig('case_' + case_id + '.png', dpi=400) - - save_speedup(speedup, ensemble_sizes, querylines, 'case_' + case_id) - - R = compute_R(n_samples, ensemble_sizes, file_MC_base_dir, quantiles, True) - save_R(R, 'case_' + case_id) - # except: - # print '/Volumes/HD_SONY/CMAME/Plate/katoptron_CMAME_tests_plate_MC_case_' + case_id + ' has not all the files' - - -def main(): - import matplotlib.pyplot as plt - - n_samples = 32 - ensemble_sizes = [1, 8, 16, 32] - quantiles = [0, 0.33, 0.5, 0.66, 1.] - - querylines = [ - 'computeMatrices', 'Belos: Operation Op*x', 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: DGKS[2]: Ortho (Inner Product)', - 'Belos: DGKS[2]: Ortho (Norm)', 'Belos: DGKS[2]: Ortho (Update)', - 'total', 'write results', 'MueLu: Hierarchy: Solve (level=0)', - 'MueLu: Hierarchy: Solve (level=1)', - 'MueLu: Hierarchy: Solve : smoothing (level=0)', - 'MueLu: Hierarchy: Solve : prolongation (level=0)', - 'MueLu: Hierarchy: Solve : residual calculation (level=0)', - 'MueLu: Hierarchy: Solve : restriction (level=0)', - 'MueLu: SIMPLE: Apply: Update step - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Solve block 00 - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Compute RHS - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Solve block 11 - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Compute RHS - level 0' - ] - use_waves_timers = np.array([0, 7, 8], dtype=int) - use_teuchos_timers = np.array( - [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], - dtype=int) - per_iteration = [ - False, True, True, False, False, False, False, False, False, True, - True, True, True, True, True, True, True, True, True, True - ] - - for i in range(1, 2): - speedup_of_one_case(i, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_MC_MG_speedup_ER.py b/katoptron/CMAME/post_process/plate_MC_MG_speedup_ER.py deleted file mode 100644 index 5356e91a..00000000 --- a/katoptron/CMAME/post_process/plate_MC_MG_speedup_ER.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - -from katoptron.speedup import * - - -def speedup_of_one_case(case_id, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration): - import matplotlib.pyplot as plt - - case_id = str(case_id) - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Final_MT/katoptron_CMAME_tests_plate_MC_MG_all_cases_2_ER_2/case_' + case_id - #'/Volumes/HD_SONY/CMAME/Plate/MG/all/katoptron_CMAME_tests_plate_MC_MG_all_cases 2/case_' + case_id - # try: - speedup = compute_speedup(n_samples, ensemble_sizes, file_MC_base_dir, - querylines, per_iteration, quantiles, - use_waves_timers, use_teuchos_timers, True) - - plot_speedup(speedup, ensemble_sizes, np.arange(0, len(querylines)), - 'case_' + case_id, querylines, per_iteration) - plt.savefig('case_' + case_id + '.png', dpi=400) - - save_speedup(speedup, ensemble_sizes, querylines, 'case_' + case_id) - - R = compute_R(n_samples, ensemble_sizes, file_MC_base_dir, quantiles, True) - save_R(R, 'case_' + case_id) - # except: - # print '/Volumes/HD_SONY/CMAME/Plate/katoptron_CMAME_tests_plate_MC_case_' + case_id + ' has not all the files' - - -def main(): - import matplotlib.pyplot as plt - - n_samples = 64 - ensemble_sizes = [1, 8, 16, 32] - quantiles = [0, 0.33, 0.5, 0.66, 1.] - - querylines = [ - 'computeMatrices', 'Belos: Operation Op*x', 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: DGKS[2]: Ortho (Inner Product)', - 'Belos: DGKS[2]: Ortho (Norm)', 'Belos: DGKS[2]: Ortho (Update)', - 'total', 'write results', 'MueLu: Hierarchy: Solve (level=0)', - 'MueLu: Hierarchy: Solve (level=1)', - 'MueLu: Hierarchy: Solve : smoothing (level=0)', - 'MueLu: Hierarchy: Solve : prolongation (level=0)', - 'MueLu: Hierarchy: Solve : residual calculation (level=0)', - 'MueLu: Hierarchy: Solve : restriction (level=0)', - 'MueLu: SIMPLE: Apply: Update step - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Solve block 00 - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Compute RHS - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Solve block 11 - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Compute RHS - level 0' - ] - use_waves_timers = np.array([0, 7, 8], dtype=int) - use_teuchos_timers = np.array( - [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], - dtype=int) - per_iteration = [ - False, True, True, False, False, False, False, False, False, True, - True, True, True, True, True, True, True, True, True, True - ] - - for i in range(1, 7): - speedup_of_one_case(i, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_MC_MG_speedup_NER.py b/katoptron/CMAME/post_process/plate_MC_MG_speedup_NER.py deleted file mode 100644 index b96fb608..00000000 --- a/katoptron/CMAME/post_process/plate_MC_MG_speedup_NER.py +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - -from katoptron.speedup import * - - -def speedup_of_one_case(case_id, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration): - import matplotlib.pyplot as plt - - case_id = str(case_id) - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Final_MT/katoptron_CMAME_tests_plate_MC_MG_all_cases_2_NER_2/case_' + case_id - #'/Volumes/HD_SONY/CMAME/Plate/MG/all/katoptron_CMAME_tests_plate_MC_MG_all_cases 2/case_' + case_id - # try: - speedup = compute_speedup(n_samples, ensemble_sizes, file_MC_base_dir, - querylines, per_iteration, quantiles, - use_waves_timers, use_teuchos_timers, False) - - plot_speedup(speedup, ensemble_sizes, np.arange(0, len(querylines)), - 'case_' + case_id, querylines, per_iteration) - plt.savefig('case_' + case_id + '.png', dpi=400) - - save_speedup(speedup, ensemble_sizes, querylines, 'case_' + case_id) - - R = compute_R(n_samples, ensemble_sizes, file_MC_base_dir, quantiles, - False) - save_R(R, 'case_' + case_id) - # except: - # print '/Volumes/HD_SONY/CMAME/Plate/katoptron_CMAME_tests_plate_MC_case_' + case_id + ' has not all the files' - - -def main(): - import matplotlib.pyplot as plt - - n_samples = 64 - ensemble_sizes = [1, 8, 16, 32] - quantiles = [0, 0.33, 0.5, 0.66, 1.] - - querylines = [ - 'computeMatrices', 'Belos: Operation Op*x', 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: DGKS[2]: Ortho (Inner Product)', - 'Belos: DGKS[2]: Ortho (Norm)', 'Belos: DGKS[2]: Ortho (Update)', - 'total', 'write results', 'MueLu: Hierarchy: Solve (level=0)', - 'MueLu: Hierarchy: Solve (level=1)', - 'MueLu: Hierarchy: Solve : smoothing (level=0)', - 'MueLu: Hierarchy: Solve : prolongation (level=0)', - 'MueLu: Hierarchy: Solve : residual calculation (level=0)', - 'MueLu: Hierarchy: Solve : restriction (level=0)', - 'MueLu: SIMPLE: Apply: Update step - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Solve block 00 - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Compute RHS - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Solve block 11 - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Compute RHS - level 0' - ] - use_waves_timers = np.array([0, 7, 8], dtype=int) - use_teuchos_timers = np.array( - [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], - dtype=int) - per_iteration = [ - False, True, True, False, False, False, False, False, False, True, - True, True, True, True, True, True, True, True, True, True - ] - - for i in range(1, 7): - speedup_of_one_case(i, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_MC_MG_total.py b/katoptron/CMAME/post_process/plate_MC_MG_total.py deleted file mode 100644 index 213eaf0c..00000000 --- a/katoptron/CMAME/post_process/plate_MC_MG_total.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.speedup import * - - -def CPU_time_per_one_case(case_id, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration): - import matplotlib.pyplot as plt - - case_id = str(case_id) - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Final_MT/katoptron_CMAME_tests_plate_MC_MG_all_cases_2_NER_2/case_' + case_id - timers = read_timers_all_ensemble_sizes(n_samples, ensemble_sizes, - file_MC_base_dir, querylines, - use_waves_timers, - use_teuchos_timers) - - print(timers.shape) - - for i in range(0, timers.shape[2]): - print(querylines[i]) - string = '' - for e in range(0, timers.shape[0]): - string = string + str( - round(np.sum(((timers[e, :, i] / ensemble_sizes[e]) / n_samples)), - 3)) + ' & ' - print(string) - print(' ') - - -def main(): - import matplotlib.pyplot as plt - - n_samples = 64 - ensemble_sizes = [1, 8, 16, 32] - quantiles = [0, 0.33, 0.5, 0.66, 1.] - - querylines = [ - 'computeMatrices', 'Belos: Operation Op*x', 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: PseudoBlockGmresSolMgr total solve time', - 'MueLu: Hierarchy: Setup (total)', 'Belos: DGKS[2]: Ortho (Update)', - 'total', 'write results', 'MueLu: Hierarchy: Solve (level=0)', - 'MueLu: Hierarchy: Solve (level=1)', - 'MueLu: Hierarchy: Solve : smoothing (level=0)', - 'MueLu: Hierarchy: Solve : prolongation (level=0)', - 'MueLu: Hierarchy: Solve : residual calculation (level=0)', - 'MueLu: Hierarchy: Solve : restriction (level=0)', - 'MueLu: SIMPLE: Apply: Update step - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Solve block 00 - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Compute RHS - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Solve block 11 - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Compute RHS - level 0', - 'compute contact matrices', 'compute block 00 matrix', 'graph' - ] - use_waves_timers = np.array([0, 7, 8, 20, 21, 22], dtype=int) - use_teuchos_timers = np.array( - [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], - dtype=int) - per_iteration = [ - False, True, True, False, False, False, False, False, False, True, - True, True, True, True, True, True, True, True, True, True - ] - - for i in range(6, 7): - CPU_time_per_one_case(i, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_MC_MG_total_2.py b/katoptron/CMAME/post_process/plate_MC_MG_total_2.py deleted file mode 100644 index 3d62c68e..00000000 --- a/katoptron/CMAME/post_process/plate_MC_MG_total_2.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.speedup import * - - -def CPU_time_per_one_case(case_id, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration): - import matplotlib.pyplot as plt - - case_id = str(case_id) - file_MC_base_dir = '/Volumes/HD_SEAGATE/CMAME/Plate/MC/katoptron_CMAME_tests_plate_MC_MG_all_cases/case_' + case_id - timers = read_timers_all_ensemble_sizes(n_samples, ensemble_sizes, - file_MC_base_dir, querylines, - use_waves_timers, - use_teuchos_timers) - - print(timers.shape) - - for i in range(0, timers.shape[2]): - print(querylines[i]) - string = '' - for e in range(0, timers.shape[0]): - string = string + str( - round(np.sum((timers[e, :, i] / ensemble_sizes[e])), 3)) + ' & ' - print(string) - print(' ') - - for e in range(0, timers.shape[0]): - tmp = timers[0, :, 7] - timers[0, :, 8] - timers[0, :, 0] - np.savez('total_s' + str(ensemble_sizes[e]), time=tmp) - - -def main(): - import matplotlib.pyplot as plt - - n_samples = 6400 - ensemble_sizes = [1] - quantiles = [0, 0.33, 0.5, 0.66, 1.] - - querylines = [ - 'domain', 'Belos: Operation Op*x', 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: PseudoBlockGmresSolMgr total solve time', - 'MueLu: Hierarchy: Setup (total)', 'Belos: DGKS[2]: Ortho (Update)', - 'total', 'write results', 'MueLu: Hierarchy: Solve (level=0)', - 'MueLu: Hierarchy: Solve (level=1)', - 'MueLu: Hierarchy: Solve : smoothing (level=0)', - 'MueLu: Hierarchy: Solve : prolongation (level=0)', - 'MueLu: Hierarchy: Solve : residual calculation (level=0)', - 'MueLu: Hierarchy: Solve : restriction (level=0)', - 'MueLu: SIMPLE: Apply: Update step - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Solve block 00 - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Compute RHS - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Solve block 11 - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Compute RHS - level 0', - 'compute contact matrices', 'compute block 00 matrix', 'dp' - ] - use_waves_timers = np.array([0, 7, 8, 20, 21, 22], dtype=int) - use_teuchos_timers = np.array( - [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], - dtype=int) - per_iteration = [ - False, True, True, False, False, False, False, False, False, True, - True, True, True, True, True, True, True, True, True, True - ] - - for i in range(6, 7): - CPU_time_per_one_case(i, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_MC_MG_total_2_analysis.py b/katoptron/CMAME/post_process/plate_MC_MG_total_2_analysis.py deleted file mode 100644 index af77082d..00000000 --- a/katoptron/CMAME/post_process/plate_MC_MG_total_2_analysis.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.speedup import * -import os -import matplotlib2tikz - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - - current_dir = os.getcwd() - - npzfile = np.load( - current_dir + - '/../katoptron_CMAME_tests_post_process_plate_MC_MG_total_2/total_s1.npz' - ) - time_s1 = npzfile['time'] - npzfile = np.load( - current_dir + - '/../katoptron_CMAME_tests_post_process_plate_MC_MG_total_2/total_s32.npz' - ) - time_s32 = npzfile['time'] - - ensemble_size = 32 - - cum_sp = np.zeros((200, )) - each_sp = np.zeros((200, )) - - time_s1_s32 = np.zeros((200, )) - time_s32_s32 = np.zeros((200, )) - - cum_time_s1 = 0. - cum_time_s32 = 0. - - for i in range(0, 200): - current_s1 = np.sum(time_s1[i * ensemble_size:(i + 1) * ensemble_size]) - current_s32 = time_s32[i * ensemble_size] - - time_s1_s32[i] = current_s1 - time_s32_s32[i] = current_s32 - - cum_time_s1 = cum_time_s1 + current_s1 - cum_time_s32 = cum_time_s32 + current_s32 - - each_sp[i] = (current_s1 / current_s32) - cum_sp[i] = (cum_time_s1 / cum_time_s32) - - plt.figure() - plt.plot(time_s1) - - plt.figure() - plt.plot(time_s32) - - print(np.sum(time_s1_s32)) - print(np.sum(time_s32_s32)) - - plt.figure() - plt.plot(time_s1_s32) - plt.plot(time_s32_s32) - plt.figure() - plt.plot(each_sp) - plt.figure() - plt.plot(cum_sp) - matplotlib2tikz.save("speedup.tex") - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_MC_QoI.py b/katoptron/CMAME/post_process/plate_MC_QoI.py deleted file mode 100644 index 6cb77300..00000000 --- a/katoptron/CMAME/post_process/plate_MC_QoI.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -from katoptron.eigenvalues import * -import os -import fwk -"""@package docstring -This file is used to loop over cases and samples and plot their mechanical properties and solution fields. -""" - -import vtk -import tboxVtk -import tboxVtk.reader as vtkR -import tboxVtk.cutter as vtkC - -from katoptron.CMAME.model import Compute_QoIs - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - - file_MC_base_dir = '/Volumes/HD_SEAGATE/CMAME/Plate/MC/katoptron_CMAME_tests_plate_MC_MG_all_cases_2/case_6/' - n_samples = 6400 - - QoIs = np.zeros((4, n_samples)) - - ensemble_size = 32 - - for i in range(0, n_samples): - i_ensemble = (i // ensemble_size) - i_sample = np.mod(i, ensemble_size) - input_MC_file_dir = file_MC_base_dir + str(ensemble_size) + '/' + str( - i_ensemble) + '/' - mshName_sample = input_MC_file_dir + 'plate_fused_ast1_s' + str( - i_sample) + '_0' - - QoIs[:, i] = Compute_QoIs(mshName_sample) - - print(QoIs) - - np.savez('qois_s' + str(ensemble_size), QoIs=QoIs) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_MC_QoI_analysis.py b/katoptron/CMAME/post_process/plate_MC_QoI_analysis.py deleted file mode 100644 index 275aa2b3..00000000 --- a/katoptron/CMAME/post_process/plate_MC_QoI_analysis.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - - - - -from katoptron.eigenvalues import * -import os -import fwk -"""@package docstring -This file is used to loop over cases and samples and plot their mechanical properties and solution fields. -""" - -import vtk -import tboxVtk -import tboxVtk.reader as vtkR -import tboxVtk.cutter as vtkC - -from katoptron.CMAME.model import Compute_QoIs -import matplotlib2tikz -from scipy import stats - - -def write_tikz_hist(filename, bins, n): - f = open(filename, 'w') - print('\\path [fill=c2, fill opacity=0.5] (axis cs:' + str( - bins[0]) + ', 0)', file=f) - for i in range(0, len(n)): - print('--(axis cs:' + str(bins[i]) + ', ' + str(n[i]) + ')', file=f) - print('--(axis cs:' + str(bins[i + 1]) + ', ' + str(n[i]) + ')', file=f) - print('--(axis cs:' + str(bins[-1]) + ', 0)', file=f) - print('--cycle;', file=f) - f.closed - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - - current_dir = os.getcwd() - - npzfile = np.load( - current_dir + - '/../katoptron_CMAME_tests_post_process_plate_MC_QoI/qois_s1.npz') - QoIs = npzfile['QoIs'] - - n, bins, patches = plt.hist(QoIs[0, :], - 100, - density=True, - facecolor='g', - alpha=0.75) - write_tikz_hist('QoI_s1.tex', bins, n) - - kde = stats.gaussian_kde(QoIs[0, :]) - - x = np.linspace(1500., 5000., 100) - - p = kde(x) - - plt.figure() - plt.plot(x, p) - matplotlib2tikz.save("kde_s1.tex") - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_MC_convergence.py b/katoptron/CMAME/post_process/plate_MC_convergence.py deleted file mode 100644 index 08d16027..00000000 --- a/katoptron/CMAME/post_process/plate_MC_convergence.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.readers import * - - -def read_iter_all_ensemble_sizes(n_samples, ensemble_sizes, file_MC_base_dir, reduction=False): - iter = np.zeros((len(ensemble_sizes), n_samples)) - for i in range(0, len(ensemble_sizes)): - file_MC_base_dir_2 = file_MC_base_dir + \ - '/' + str(ensemble_sizes[i])+'/' - for j in range(0, int((n_samples // ensemble_sizes[i]))): - input_MC_file_dir = file_MC_base_dir_2 + str(j)+'/' - es = ensemble_sizes[i] - if reduction: - es = 1 - iter_indices, residuals = read_Belos( - input_MC_file_dir + 'belos_out.txt', es) - for k in range(0, ensemble_sizes[i]): - iter[i][j*ensemble_sizes[i]+k] = iter_indices[-1] - return iter - - -def plot_iter_all_ensemble_sizes(n_samples, iter): - import matplotlib.pyplot as plt - plt.figure() - plt.plot(list(range(0, n_samples)), - iter[0][:], 'bo', markersize=8, zorder=1) - plt.plot(list(range(0, n_samples)), - iter[1][:], 'ro', markersize=6, zorder=2) - plt.plot(list(range(0, n_samples)), - iter[2][:], 'go', markersize=4, zorder=2) - plt.plot(list(range(0, n_samples)), - iter[3][:], 'ko', markersize=2, zorder=3) - plt.xlabel('sample') - plt.ylabel('Number of iterations to converge') - - -def main(): - import matplotlib.pyplot as plt - - n_samples = 960 - ensemble_sizes = [1, 8, 16, 32] - for case_id in range(1, 5): - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/katoptron_CMAME_tests_plate_MC_GS_case_' + \ - str(case_id)+'_ER' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.savefig('GS_case_'+str(case_id)+'_ER.png', dpi=400) - np.savetxt('GS_case_'+str(case_id)+'_ER.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/katoptron_CMAME_tests_plate_MC_direct_case_' + \ - str(case_id)+'_ER' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.savefig('direct_case_'+str(case_id)+'_ER.png', dpi=400) - np.savetxt('direct_case_'+str(case_id) + - '_ER.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/katoptron_CMAME_tests_plate_MC_GS_case_' + \ - str(case_id)+'_NER' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.savefig('GS_case_'+str(case_id)+'_NER.png', dpi=400) - np.savetxt('GS_case_'+str(case_id)+'_NER.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/katoptron_CMAME_tests_plate_MC_direct_case_' + \ - str(case_id)+'_NER' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.savefig('direct_case_'+str(case_id)+'_NER.png', dpi=400) - np.savetxt('direct_case_'+str(case_id) + - '_NER.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_MC_convergence_2.py b/katoptron/CMAME/post_process/plate_MC_convergence_2.py deleted file mode 100644 index b0eba9e4..00000000 --- a/katoptron/CMAME/post_process/plate_MC_convergence_2.py +++ /dev/null @@ -1,573 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.readers import * - - -def read_iter_all_ensemble_sizes(n_samples, ensemble_sizes, file_MC_base_dir, reduction=False): - iter = np.zeros((len(ensemble_sizes), n_samples)) - for i in range(0, len(ensemble_sizes)): - file_MC_base_dir_2 = file_MC_base_dir + \ - '/' + str(ensemble_sizes[i])+'/' - for j in range(0, int((n_samples // ensemble_sizes[i]))): - input_MC_file_dir = file_MC_base_dir_2 + str(j)+'/' - es = ensemble_sizes[i] - if reduction: - es = 1 - iter_indices, residuals = read_Belos( - input_MC_file_dir + 'belos_out.txt', es) - for k in range(0, ensemble_sizes[i]): - iter[i][j*ensemble_sizes[i]+k] = iter_indices[-1] - return iter - - -def plot_iter_all_ensemble_sizes(n_samples, iter, print_all=False): - import matplotlib.pyplot as plt - plt.figure() - plt.plot(list(range(0, n_samples)), - iter[0][:], 'bo', markersize=8, zorder=1) - ensemble_size = 8 - for i in range(0, int(np.ceil(n_samples*1./ensemble_size))): - plt.plot(list(range(ensemble_size*i, ensemble_size*(i+1))), - iter[1][ensemble_size*i:ensemble_size*(i+1)], '-ro', linewidth=3, markersize=6, zorder=2) - if print_all: - ensemble_size = 16 - for i in range(0, int(np.ceil(n_samples*1./ensemble_size))): - plt.plot(list(range(ensemble_size*i, ensemble_size*(i+1))), - iter[2][ensemble_size*i:ensemble_size*(i+1)], '-go', linewidth=2, markersize=4, zorder=2) - ensemble_size = 32 - for i in range(0, int(np.ceil(n_samples*1./ensemble_size))): - plt.plot(list(range(ensemble_size*i, ensemble_size*(i+1))), - iter[3][ensemble_size*i:ensemble_size*(i+1)], '-ko', linewidth=1, markersize=2, zorder=3) - plt.xlabel('sample') - plt.ylabel('Number of iterations to converge') - - -def main(): - import matplotlib.pyplot as plt - - n_samples = 8 - ensemble_sizes = [1, 8] - for case_id in range(1, 2): - file_MC_base_dir = '/Users/kimliegeois/Desktop/tests_plate_vd/katoptron_CMAME_tests_plate_vd_Direct_3' - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.savefig('Direct_3.png', dpi=400) - np.savetxt('Direct_3.txt', iter, delimiter=' ') - file_MC_base_dir = '/Users/kimliegeois/Desktop/tests_plate_vd/katoptron_CMAME_tests_plate_vd_Direct_200' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.savefig('Direct_200.png', dpi=400) - np.savetxt('Direct_200.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/tests_plate_vd/katoptron_CMAME_tests_plate_vd_GS_3' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.grid() - plt.ylim([0, 850]) - plt.savefig('GS_3.png', dpi=400) - np.savetxt('GS_3.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/tests_plate_vd/katoptron_CMAME_tests_plate_vd_GS_200' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.grid() - plt.ylim([0, 850]) - plt.savefig('GS_200.png', dpi=400) - np.savetxt('GS_200.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_vd_GS/katoptron_CMAME_tests_plate_vd_GS_3' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.grid() - plt.ylim([0, 850]) - plt.savefig('GS_3_005.png', dpi=400) - np.savetxt('GS_3_005.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_vd_GS/katoptron_CMAME_tests_plate_vd_GS_200' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.grid() - plt.ylim([0, 850]) - plt.savefig('GS_200_005.png', dpi=400) - np.savetxt('GS_200_005.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_vd_GS_2/katoptron_CMAME_tests_plate_vd_GS_3' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.grid() - plt.ylim([0, 850]) - plt.savefig('GS_3_0005.png', dpi=400) - np.savetxt('GS_3_0005.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_vd_GS_2/katoptron_CMAME_tests_plate_vd_GS_200' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.grid() - plt.ylim([0, 850]) - plt.savefig('GS_200_0005.png', dpi=400) - np.savetxt('GS_200_0005.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_vd_GS_3/katoptron_CMAME_tests_plate_vd_GS_3' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.grid() - plt.ylim([0, 850]) - plt.savefig('GS_3_0005_group.png', dpi=400) - np.savetxt('GS_3_0005_group.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_vd_GS_3/katoptron_CMAME_tests_plate_vd_GS_200' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.grid() - plt.ylim([0, 850]) - plt.savefig('GS_200_0005_group.png', dpi=400) - np.savetxt('GS_200_0005_group.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_vd_GS_3_2' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.grid() - plt.ylim([0, 850]) - plt.savefig('GS_3_no_gamma.png', dpi=400) - np.savetxt('GS_3_no_gamma.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - n_samples = 32 - ensemble_sizes = [1, 8, 16, 32] - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/fused/katoptron_CMAME_tests_fused_plate_MC_GS_all_cases/case_1' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([40, 100]) - plt.savefig('SPD_case_1_MG.png', dpi=400) - np.savetxt('SPD_case_1_MG.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/fused/katoptron_CMAME_tests_fused_plate_MC_GS_all_cases/case_2' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([40, 100]) - plt.savefig('SPD_case_2_MG.png', dpi=400) - np.savetxt('SPD_case_2_MG.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/fused/katoptron_CMAME_tests_fused_plate_MC_GS_all_cases/case_3' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([0, 150]) - plt.savefig('SPD_case_3_MG.png', dpi=400) - np.savetxt('SPD_case_3_MG.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/fused/katoptron_CMAME_tests_fused_plate_MC_GS_all_cases/case_4' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([0, 150]) - plt.savefig('SPD_case_4_MG.png', dpi=400) - np.savetxt('SPD_case_4_MG.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/fused/katoptron_CMAME_tests_fused_plate_MC_GS_all_cases/case_5' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([0, 150]) - plt.savefig('SPD_case_5_MG.png', dpi=400) - np.savetxt('SPD_case_5_MG.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/fused/katoptron_CMAME_tests_fused_plate_MC_GS_all_cases/case_6' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([0, 150]) - plt.savefig('SPD_case_6_MG.png', dpi=400) - np.savetxt('SPD_case_6_MG.txt', iter, delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - - n_samples = 896 - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/MG/all/katoptron_CMAME_tests_plate_MC_MG_all_cases/case_1' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([75, 150]) - plt.savefig('MC_MG_case_1.png', dpi=400) - np.savetxt('MC_MG_case_1.txt', np.transpose(iter), delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/MG/all/katoptron_CMAME_tests_plate_MC_MG_all_cases/case_2' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([75, 150]) - plt.savefig('MC_MG_case_2.png', dpi=400) - np.savetxt('MC_MG_case_2.txt', np.transpose(iter), delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/MG/all/katoptron_CMAME_tests_plate_MC_MG_all_cases/case_3' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([75, 150]) - plt.savefig('MC_MG_case_3.png', dpi=400) - np.savetxt('MC_MG_case_3.txt', np.transpose(iter), delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/MG/all/katoptron_CMAME_tests_plate_MC_MG_all_cases/case_4' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([75, 150]) - plt.savefig('MC_MG_case_4.png', dpi=400) - np.savetxt('MC_MG_case_4.txt', np.transpose(iter), delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/MG/all/katoptron_CMAME_tests_plate_MC_MG_all_cases/case_5' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([75, 150]) - plt.savefig('MC_MG_case_5.png', dpi=400) - np.savetxt('MC_MG_case_5.txt', np.transpose(iter), delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/MG/all/katoptron_CMAME_tests_plate_MC_MG_all_cases/case_6' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([75, 150]) - plt.savefig('MC_MG_case_6.png', dpi=400) - np.savetxt('MC_MG_case_6.txt', np.transpose(iter), delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - n_samples = 96 - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_Juelich_tests_M1_assembly_fused_MC_NER_2' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([190, 210]) - plt.savefig('Juelich_NER.png', dpi=400) - np.savetxt('Juelich_NER.txt', np.transpose(iter), delimiter=' ') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_Juelich_tests_M1_assembly_fused_MC_ER_2' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([190, 310]) - plt.savefig('Juelich_ER.png', dpi=400) - np.savetxt('Juelich_ER.txt', np.transpose(iter), delimiter=' ') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - - n_samples = 64 - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases/case_1' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([50, 150]) - plt.savefig('MC_MG_case_1_2.png', dpi=400) - np.savetxt('MC_MG_case_1_2.txt', np.transpose(iter), delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases/case_2' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([50, 150]) - plt.savefig('MC_MG_case_2_2.png', dpi=400) - np.savetxt('MC_MG_case_2_2.txt', np.transpose(iter), delimiter=' ') - except: - print(file_MC_base_dir + ' has not all the files') - - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_4_ER/case_1' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([50, 400]) - plt.savefig('MC_MG_case_1_ER.png', dpi=400) - np.savetxt('MC_MG_case_1_ER.txt', - np.transpose(iter), delimiter=' ') - print('MC_MG_case_1_ER') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_4_ER/case_2' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([50, 400]) - plt.savefig('MC_MG_case_2_ER.png', dpi=400) - np.savetxt('MC_MG_case_2_ER.txt', - np.transpose(iter), delimiter=' ') - print('MC_MG_case_2_ER') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_4_ER/case_3' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([50, 400]) - plt.savefig('MC_MG_case_3_ER.png', dpi=400) - np.savetxt('MC_MG_case_3_ER.txt', - np.transpose(iter), delimiter=' ') - print('MC_MG_case_3_ER') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_4_ER/case_4' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([50, 400]) - plt.savefig('MC_MG_case_4_ER.png', dpi=400) - np.savetxt('MC_MG_case_4_ER.txt', - np.transpose(iter), delimiter=' ') - print('MC_MG_case_4_ER') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_4_ER/case_5' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([50, 400]) - plt.savefig('MC_MG_case_5_ER.png', dpi=400) - np.savetxt('MC_MG_case_5_ER.txt', - np.transpose(iter), delimiter=' ') - print('MC_MG_case_5_ER') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_4_ER/case_6' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([50, 400]) - plt.savefig('MC_MG_case_6_ER.png', dpi=400) - np.savetxt('MC_MG_case_6_ER.txt', - np.transpose(iter), delimiter=' ') - print('MC_MG_case_6_ER') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_4_NER/case_1' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([100, 150]) - plt.savefig('MC_MG_case_1_NER.png', dpi=400) - np.savetxt('MC_MG_case_1_NER.txt', - np.transpose(iter), delimiter=' ') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_4_NER/case_2' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([100, 150]) - plt.savefig('MC_MG_case_2_NER.png', dpi=400) - np.savetxt('MC_MG_case_2_NER.txt', - np.transpose(iter), delimiter=' ') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_4_NER/case_3' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([100, 150]) - plt.savefig('MC_MG_case_3_NER.png', dpi=400) - np.savetxt('MC_MG_case_3_NER.txt', - np.transpose(iter), delimiter=' ') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_4_NER/case_4' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([100, 150]) - plt.savefig('MC_MG_case_4_NER.png', dpi=400) - np.savetxt('MC_MG_case_4_NER.txt', - np.transpose(iter), delimiter=' ') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_4_NER/case_5' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([100, 150]) - plt.savefig('MC_MG_case_5_NER.png', dpi=400) - np.savetxt('MC_MG_case_5_NER.txt', - np.transpose(iter), delimiter=' ') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - file_MC_base_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_4_NER/case_6' - try: - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - plt.grid() - plt.ylim([100, 150]) - plt.savefig('MC_MG_case_6_NER.png', dpi=400) - np.savetxt('MC_MG_case_6_NER.txt', - np.transpose(iter), delimiter=' ') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_MC_convergence_3.py b/katoptron/CMAME/post_process/plate_MC_convergence_3.py deleted file mode 100644 index 94b16298..00000000 --- a/katoptron/CMAME/post_process/plate_MC_convergence_3.py +++ /dev/null @@ -1,159 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.readers import * - - -def read_iter_all_ensemble_sizes(n_samples, - ensemble_sizes, - file_MC_base_dir, - reduction=False): - iter = np.zeros((len(ensemble_sizes), n_samples)) - for i in range(0, len(ensemble_sizes)): - file_MC_base_dir_2 = file_MC_base_dir + '/' + str( - ensemble_sizes[i]) + '/' - for j in range(0, int((n_samples // ensemble_sizes[i]))): - input_MC_file_dir = file_MC_base_dir_2 + str(j) + '/' - es = ensemble_sizes[i] - if reduction: - es = 1 - iter_indices, residuals = read_Belos( - input_MC_file_dir + 'belos_out.txt', es) - for k in range(0, ensemble_sizes[i]): - iter[i][j * ensemble_sizes[i] + k] = iter_indices[-1] - return iter - - -def plot_iter_all_ensemble_sizes(n_samples, iter, print_all=False): - import matplotlib.pyplot as plt - plt.figure() - plt.plot(list(range(0, n_samples)), - iter[0][:], 'bo', markersize=8, zorder=1) - ensemble_size = 8 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - plt.plot(list(range(ensemble_size * i, ensemble_size * (i + 1))), - iter[1][ensemble_size * i:ensemble_size * (i + 1)], - '-ro', - linewidth=3, - markersize=6, - zorder=2) - if print_all: - ensemble_size = 16 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - plt.plot(list(range(ensemble_size * i, ensemble_size * (i + 1))), - iter[2][ensemble_size * i:ensemble_size * (i + 1)], - '-go', - linewidth=2, - markersize=4, - zorder=2) - ensemble_size = 32 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - plt.plot(list(range(ensemble_size * i, ensemble_size * (i + 1))), - iter[3][ensemble_size * i:ensemble_size * (i + 1)], - '-ko', - linewidth=1, - markersize=2, - zorder=3) - plt.xlabel('sample') - plt.ylabel('Number of iterations to converge') - - -def write_tex(n_samples, iter, filename): - f = open(filename, 'w') - print('\\addplot [c1, mark=*, mark size=2pt, mark options={solid}, only marks]', file=f) - print('table [row sep=crcr] {%', file=f) - for i in range(0, n_samples): - print(str(i) + ' ' + str(iter[0][i]) + '\\\\', file=f) - print('};', file=f) - print('\\label{pgfplots:noEP}', file=f) - ensemble_size = 8 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - print('\\addplot [line width=2pt, c2]', file=f) - print('table [row sep=crcr] {%', file=f) - print(str(ensemble_size * i) + ' ' + str( - iter[1][ensemble_size * i]) + '\\\\', file=f) - print(str(ensemble_size * - (i + 1)) + ' ' + str(iter[1][ensemble_size * - (i + 1) - 1]) + '\\\\', file=f) - print('};', file=f) - print('\\label{pgfplots:s8}', file=f) - ensemble_size = 16 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - print('\\addplot [line width=1.5pt, c3]', file=f) - print('table [row sep=crcr] {%', file=f) - print(str(ensemble_size * i) + ' ' + str( - iter[2][ensemble_size * i]) + '\\\\', file=f) - print(str(ensemble_size * - (i + 1)) + ' ' + str(iter[2][ensemble_size * - (i + 1) - 1]) + '\\\\', file=f) - print('};', file=f) - print('\\label{pgfplots:s16}', file=f) - ensemble_size = 32 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - print('\\addplot [line width=1.pt, c4]', file=f) - print('table [row sep=crcr] {%', file=f) - print(str(ensemble_size * i) + ' ' + str( - iter[3][ensemble_size * i]) + '\\\\', file=f) - print(str(ensemble_size * - (i + 1)) + ' ' + str(iter[3][ensemble_size * - (i + 1) - 1]) + '\\\\', file=f) - print('};', file=f) - print('\\label{pgfplots:s32}', file=f) - f.closed - - -def main(): - import matplotlib.pyplot as plt - - n_samples = 64 - ensemble_sizes = [1, 8, 16, 32] - - for case_id in [1, 2, 3, 4, 5, 6]: - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Final_MT/katoptron_CMAME_tests_plate_MC_MG_all_cases_2_ER_2/case_' + str( - case_id) - try: - iter = read_iter_all_ensemble_sizes(n_samples, ensemble_sizes, - file_MC_base_dir, True) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - write_tex(n_samples, iter, - 'MC_MG_case_' + str(case_id) + '_ER.tex') - plt.grid() - plt.ylim([100, 400]) - plt.savefig('MC_MG_case_' + str(case_id) + '_ER.png', dpi=400) - np.savetxt('MC_MG_case_' + str(case_id) + '_ER.txt', - np.transpose(iter), - delimiter=' ') - print('MC_MG_case_' + str(case_id) + '_ER') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Final_MT/katoptron_CMAME_tests_plate_MC_MG_all_cases_2_NER_2/case_' + str( - case_id) - try: - iter = read_iter_all_ensemble_sizes(n_samples, ensemble_sizes, - file_MC_base_dir, False) - plot_iter_all_ensemble_sizes(n_samples, iter, True) - write_tex(n_samples, iter, - 'MC_MG_case_' + str(case_id) + '_NER.tex') - plt.grid() - plt.ylim([100, 400]) - plt.savefig('MC_MG_case_' + str(case_id) + '_NER.png', dpi=400) - np.savetxt('MC_MG_case_' + str(case_id) + '_NER.txt', - np.transpose(iter), - delimiter=' ') - iter2 = np.transpose(iter) - sum_iter = np.zeros((4, 1)) - for i in range(0, 4): - sum_iter[i] = np.sum(iter2[:, i]) - print(sum_iter / sum_iter[0]) - except: - print(file_MC_base_dir + ' has not all the files') - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_MC_speedup.py b/katoptron/CMAME/post_process/plate_MC_speedup.py deleted file mode 100644 index f60e31c2..00000000 --- a/katoptron/CMAME/post_process/plate_MC_speedup.py +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -from katoptron.speedup import * - - -def speedup_of_one_case(case_id, GS, ensemble_reduction, n_samples, ensemble_sizes, quantiles, querylines, use_waves_timers, use_teuchos_timers, per_iteration): - import matplotlib.pyplot as plt - if GS: - prec = 'GS_' - else: - prec = 'direct_' - - if ensemble_reduction: - case_id = str(case_id)+'_ER' - else: - case_id = str(case_id)+'_NER' - - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/katoptron_CMAME_tests_plate_MC_' + \ - prec+'case_' + case_id - try: - speedup = compute_speedup(n_samples, ensemble_sizes, file_MC_base_dir, querylines, - per_iteration, quantiles, use_waves_timers, use_teuchos_timers, ensemble_reduction) - - plot_speedup(speedup, ensemble_sizes, np.arange( - 0, len(querylines)), prec+'case_' + case_id, querylines, per_iteration) - plt.savefig(prec+'case_' + case_id + '.png', dpi=400) - - save_speedup(speedup, ensemble_sizes, - querylines, prec+'case_' + case_id) - - R = compute_R(n_samples, ensemble_sizes, file_MC_base_dir, - quantiles, ensemble_reduction) - save_R(R, 'R_'+prec+'case_' + case_id) - except: - print('/Volumes/HD_SONY/CMAME/Plate/katoptron_CMAME_tests_plate_MC_' + - prec+'case_' + case_id + ' has not all the files') - - -def main(): - import matplotlib.pyplot as plt - - n_samples = 32 - ensemble_sizes = [1, 8, 16, 32] - quantiles = [0, 0.33, 0.5, 0.66, 1.] - - querylines = ['computeMatrices', 'Belos: Operation Op*x', 'Belos: Operation Prec*x', 'Belos: DGKS[2]: Orthogonalization', - 'Belos: DGKS[2]: Ortho (Inner Product)', 'Belos: DGKS[2]: Ortho (Norm)', 'Belos: DGKS[2]: Ortho (Update)', 'total'] - use_waves_timers = np.array([0, 7], dtype=int) - use_teuchos_timers = np.array([1, 2, 3, 4, 5, 6], dtype=int) - per_iteration = [False, True, True, False, False, False, False, False] - - for i in range(1, 5): - speedup_of_one_case(i, False, True, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, per_iteration) - speedup_of_one_case(i, True, True, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, per_iteration) - speedup_of_one_case(i, False, False, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, per_iteration) - speedup_of_one_case(i, True, False, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, per_iteration) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_convergence.py b/katoptron/CMAME/post_process/plate_convergence.py deleted file mode 100644 index 5e76dd27..00000000 --- a/katoptron/CMAME/post_process/plate_convergence.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - -from katoptron.readers import * - - -def main(): - import matplotlib.pyplot as plt - - file_base_dir = '/Volumes/HD_SONY/CMAME/Final_MT/katoptron_CMAME_tests_plate_MC_MG_all_cases_2_NER/case_2/1/2/' - iter_indices_1, residuals_1 = read_Belos( - file_base_dir + 'belos_out.txt', 1) - - file_base_dir = '/Volumes/HD_SONY/CMAME/Final_MT/katoptron_CMAME_tests_plate_MC_MG_all_cases_2_NER/case_2/32/0/' - iter_indices_2, residuals_2 = read_Belos( - file_base_dir + 'belos_out.txt', 3) - - print(residuals_2.shape) - - plt.figure() - plt.plot(iter_indices_1, residuals_1) - plt.plot(iter_indices_2, residuals_2[:, 2]) - plt.yscale('log') - plt.grid(True) - - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_cor_R.py b/katoptron/CMAME/post_process/plate_cor_R.py deleted file mode 100644 index e2ad9dcc..00000000 --- a/katoptron/CMAME/post_process/plate_cor_R.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - - - -from katoptron.eigenvalues import * -from katoptron.readers import * -from katoptron.readers import * -import os -import fwk -"""@package docstring -This file is used to investigate the choice of prec parameters. -""" - - -def read_timer_all(n_cases, sub_cases, file_MC_base_dir): - querylines = ['Belos: Operation Op*x', - 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: DGKS[2]: Ortho (Inner Product)', - 'Belos: DGKS[2]: Ortho (Norm)', - 'Belos: DGKS[2]: Ortho (Update)', - 'Belos: PseudoBlockGmresSolMgr total solve time'] - timer = np.zeros((n_cases, len(sub_cases), len(querylines))) - for i in range(0, n_cases): - file_MC_base_dir_2 = file_MC_base_dir + '/' + str(i)+'/' - for j in range(0, len(sub_cases)): - input_MC_file_dir = file_MC_base_dir_2 + str(sub_cases[j])+'/' - timer[i, j, :] = read_teuchos_timers( - input_MC_file_dir+'teuchos_timers.txt', querylines) - return timer - - -def read_iter_all(n_cases, sub_cases, file_MC_base_dir): - iter = np.zeros((n_cases, len(sub_cases))) - for i in range(0, n_cases): - file_MC_base_dir_2 = file_MC_base_dir + '/' + str(i)+'/' - for j in range(0, len(sub_cases)): - input_MC_file_dir = file_MC_base_dir_2 + str(sub_cases[j])+'/' - iter_indices, residuals = read_Belos( - input_MC_file_dir + 'belos_out.txt', 1) - iter[i][j] = iter_indices[-1] - return iter - - -def main(): - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/gaussian/katoptron_CMAME_tests_plate_correlation/' - #file_dir + '/../../../workspace/katoptron_CMAME_tests_plate_mean_prec_GS_direct/' - sub_cases = ['1', '8'] - - N = 200 - correlation_min_exp = -1 - correlation_max_exp = np.log10(2) - - correlations = np.logspace( - correlation_min_exp, correlation_max_exp, N, endpoint=True) - - iter = read_iter_all(N, sub_cases, file_MC_base_dir) - timer = read_timer_all(N, sub_cases, file_MC_base_dir) - - from mpl_toolkits.mplot3d import Axes3D - import matplotlib.pyplot as plt - from matplotlib import cm - - plt.subplot(211) - plt.semilogx(correlations, iter[:, 0]) - plt.semilogx(correlations, iter[:, 1]) - plt.xlabel('correlation length') - plt.ylabel('iter') - plt.subplot(212) - plt.semilogx(correlations, np.divide(iter[:, 1], iter[:, 0])) - plt.xlabel('correlation length') - plt.ylabel('R') - - plt.figure() - plt.subplot(211) - plt.plot(1./correlations, iter[:, 0]) - plt.plot(1./correlations, iter[:, 1]) - plt.xlabel('1./correlation length') - plt.ylabel('iter') - plt.subplot(212) - plt.plot(1./correlations, np.divide(iter[:, 1], iter[:, 0])) - plt.xlabel('1./correlation length') - plt.ylabel('R') - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_deltas_omegas.py b/katoptron/CMAME/post_process/plate_deltas_omegas.py deleted file mode 100644 index fb834496..00000000 --- a/katoptron/CMAME/post_process/plate_deltas_omegas.py +++ /dev/null @@ -1,207 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.eigenvalues import * -import os -import fwk - - -def plot_as_bar_plot(x, y, semilog=False): - import matplotlib.pyplot as plt - plt.figure() - - for i in range(0, len(x)): - if i == 0: - x_bar = np.array([x[0], 0.5*x[0]+0.5*x[1]]) - y_bar = np.array([y[0], y[0]]) - elif i != len(x)-1: - x_bar = np.append(x_bar, [x_bar[-1], 0.5*x[i]+0.5*x[i+1]]) - y_bar = np.append(y_bar, [y[i], y[i]]) - else: - x_bar = np.append(x_bar, [x_bar[-1], x[i]]) - y_bar = np.append(y_bar, [y[i], y[i]]) - break - if semilog: - plt.semilogy(x_bar, y_bar) - else: - plt.plot(x_bar, y_bar) - - -def analysis_deltas_omegas(n_samples, base_dir, GS, write): - import matplotlib.pyplot as plt - current_n = 1 - - theta = np.zeros((current_n, n_samples)) - omegas = np.zeros((current_n, n_samples)) - deltas = np.zeros((current_n, n_samples), dtype=np.complex128) - - if GS: - base_dir_omega = base_dir + 'GS/omegas_GS_GS_' - base_dir_delta = base_dir + 'GS/deltas_GS_GS_' - else: - base_dir_omega = base_dir + 'direct/omegas_direct_direct_' - base_dir_delta = base_dir + 'direct/deltas_direct_direct_' - for i in range(0, n_samples): - tmp_delta = np.loadtxt(base_dir_delta+str(i)+'.txt') - omegas_c = np.loadtxt(base_dir_omega+str(i)+'.txt') - - n = tmp_delta.shape[0] - - if current_n < n: - - theta_tmp = np.zeros((n, n_samples)) - omegas_tmp = np.zeros((n, n_samples)) - deltas_tmp = np.zeros((n, n_samples), dtype=np.complex128) - - theta_tmp[0:current_n, :] = theta - omegas_tmp[0:current_n, :] = omegas - deltas_tmp[0:current_n, :] = deltas - - theta = theta_tmp - omegas = omegas_tmp - deltas = deltas_tmp - - current_n = n - - deltas_c = np.zeros((n,), dtype=np.complex128) - - deltas_c.real = tmp_delta[:, 0] - deltas_c.imag = tmp_delta[:, 1] - - deltas[0:n, i] = deltas_c - - omegas[0:n, i] = omegas_c - - theta_c = compute_theta(deltas_c) - - theta[0:n, i] = theta_c - - sort_indices = np.argsort(theta_c) - theta_c = theta_c[sort_indices] - deltas_c = deltas_c[sort_indices] - omegas_c = omegas_c[sort_indices] - - N = 720 - theta_discrete, cum_delta, deriv_delta, cum_delta_omega, deriv_delta_omega, percent_delta, percent_delta_omega = compute_cum_delta( - theta_c, deltas_c, omegas_c, N) - - indices = np.zeros((n,)) - sort_indices = np.argsort(-omegas_c) - indices[sort_indices[0:30]] = 1 - plot_eigenvalues_on_unit_circle_highlight(deltas_c, indices) - plot_polar_function(theta_discrete, deriv_delta, 1.5, 2.5) - plot_polar_function(theta_discrete, deriv_delta_omega, 3, 4) - plt.title('Sample ' + str(i)) - if GS: - plt.savefig('fig_GS_'+str(i)+'.png') - else: - plt.savefig('fig_direct_'+str(i)+'.png') - - plot_as_bar_plot(theta_discrete, deriv_delta_omega) - plt.title('Sample ' + str(i)) - if GS: - plt.savefig('fig_GS_omegas_'+str(i)+'.png') - else: - plt.savefig('fig_direct_omegas_'+str(i)+'.png') - - tmp = np.ones((len(theta[0:n, i]), 2)) - tmp[:, 0] = theta[0:n, i] - if write: - if GS: - np.savetxt('theta_GS_'+str(i)+'.txt', tmp) - else: - np.savetxt('theta_direct_'+str(i)+'.txt', tmp) - - tmp = np.ones((len(theta_discrete), 2)) - tmp[:, 0] = theta_discrete - - if write: - if GS: - np.savetxt('theta_GS_discrete_'+str(i)+'.txt', tmp) - np.savetxt('deriv_GS_delta_'+str(i)+'.tex', deriv_delta) - np.savetxt('deriv_GS_delta_omega_' + - str(i)+'.tex', deriv_delta_omega) - else: - np.savetxt('theta_direct_discrete_'+str(i)+'.txt', tmp) - np.savetxt('deriv_direct_delta_'+str(i)+'.tex', deriv_delta) - np.savetxt('deriv_direct_delta_omega_' + - str(i)+'.tex', deriv_delta_omega) - - if write: - if GS: - np.savetxt('omegas_GS_all.txt', omegas) - else: - np.savetxt('omegas_direct_all.txt', omegas) - - ensemble_sizes = np.array([8, 16, 32]) - - for i_s in range(0, len(ensemble_sizes)): - s = ensemble_sizes[i_s] - for i in range(0, n_samples, s): - i_sample_min = i - i_sample_max = i_sample_min + s - - omegas_s = omegas[:, i_sample_min:i_sample_max].flatten('F') - deltas_s = deltas[:, i_sample_min:i_sample_max].flatten('F') - theta_s = theta[:, i_sample_min:i_sample_max].flatten('F') - index = np.argwhere(np.absolute(deltas_s) >= 0.9) - - omegas_s = omegas_s[index] - deltas_s = deltas_s[index] - theta_s = theta_s[index] - - sort_indices = np.argsort(theta_s) - theta_s = theta_s[sort_indices] - deltas_s = deltas_s[sort_indices] - omegas_s = omegas_s[sort_indices] - - N = 720 - theta_discrete, cum_delta, deriv_delta, cum_delta_omega, deriv_delta_omega, percent_delta, percent_delta_omega = compute_cum_delta( - theta_s, deltas_s, omegas_s, N) - - n = len(omegas_s) - indices = np.zeros((n,)) - sort_indices = np.argsort(-omegas_s) - indices[sort_indices[0:30]] = 1 - plot_eigenvalues_on_unit_circle_highlight(deltas_s, indices) - plot_polar_function(theta_discrete, deriv_delta, 1.5, 2.5) - plot_polar_function(theta_discrete, deriv_delta_omega, 3, 4) - plt.title('Ensemble ' + str(int((i // s))) + - ' of ensemble size ' + str(s)) - if GS: - plt.savefig('fig_s_GS_' + str(s) + '_' + - str(int((i // s))) + '.png') - else: - plt.savefig('fig_s_direct_' + str(s) + '_' + - str(int((i // s))) + '.png') - plt.clf() - plt.close() - plot_as_bar_plot(theta_discrete, deriv_delta_omega) - plt.title('Ensemble ' + str(int((i // s))) + - ' of ensemble size ' + str(s)) - if GS: - plt.savefig('fig_s_GS_omegas_' + str(s) + '_' + - str(int((i // s))) + '.png') - else: - plt.savefig('fig_s_direct_omegas_' + str(s) + - '_' + str(int((i // s))) + '.png') - plt.clf() - plt.close() - - -def main(): - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - n_samples = 32 - - base_dir = file_dir + '/../../../workspace/katoptron_CMAME_tests_plate_deltas_omegas_' - write = False - - analysis_deltas_omegas(n_samples, base_dir, True, write) - analysis_deltas_omegas(n_samples, base_dir, False, write) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_deltas_omegas_direct_analysis.py b/katoptron/CMAME/post_process/plate_deltas_omegas_direct_analysis.py deleted file mode 100644 index 9bd4fea0..00000000 --- a/katoptron/CMAME/post_process/plate_deltas_omegas_direct_analysis.py +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.eigenvalues import * -import os -import fwk - - -def plot_as_bar_plot(x, y, semilog=False): - import matplotlib.pyplot as plt - plt.figure(figsize=(15, 4)) - - for i in range(0, len(x)): - if i == 0: - x_bar = np.array([x[0], 0.5*x[0]+0.5*x[1]]) - y_bar = np.array([y[0], y[0]]) - elif i != len(x)-1: - x_bar = np.append(x_bar, [x_bar[-1], 0.5*x[i]+0.5*x[i+1]]) - y_bar = np.append(y_bar, [y[i], y[i]]) - else: - x_bar = np.append(x_bar, [x_bar[-1], x[i]]) - y_bar = np.append(y_bar, [y[i], y[i]]) - break - if semilog: - plt.semilogy(x_bar, y_bar) - else: - plt.plot(x_bar, y_bar) - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - display = False - - current_n = 1 - n_samples = 32 - - theta = np.zeros((current_n, n_samples)) - omegas = np.zeros((current_n, n_samples)) - deltas = np.zeros((current_n, n_samples), dtype=np.complex128) - - for i in range(0, n_samples): - tmp_delta = np.loadtxt( - file_dir + '/../../../workspace/katoptron_CMAME_tests_plate_deltas_omegas_direct/deltas_direct_direct_'+str(i)+'.txt') - omegas_c = np.loadtxt( - file_dir + '/../../../workspace/katoptron_CMAME_tests_plate_deltas_omegas_direct/omegas_direct_direct_'+str(i)+'.txt') - - n = tmp_delta.shape[0] - - if current_n < n: - - theta_tmp = np.zeros((n, n_samples)) - omegas_tmp = np.zeros((n, n_samples)) - deltas_tmp = np.zeros((n, n_samples), dtype=np.complex128) - - theta_tmp[0:current_n, :] = theta - omegas_tmp[0:current_n, :] = omegas - deltas_tmp[0:current_n, :] = deltas - - theta = theta_tmp - omegas = omegas_tmp - deltas = deltas_tmp - - current_n = n - - deltas_c = np.zeros((n,), dtype=np.complex128) - - deltas_c.real = tmp_delta[:, 0] - deltas_c.imag = tmp_delta[:, 1] - - deltas[0:n, i] = deltas_c - - omegas[0:n, i] = omegas_c - - theta_c = compute_theta(deltas_c) - - theta[0:n, i] = theta_c - - sort_indices = np.argsort(theta_c) - theta_c = theta_c[sort_indices] - deltas_c = deltas_c[sort_indices] - omegas_c = omegas_c[sort_indices] - - N = 720 - theta_discrete, cum_delta, deriv_delta, cum_delta_omega, deriv_delta_omega, percent_delta, percent_delta_omega = compute_cum_delta( - theta_c, deltas_c, omegas_c, N) - - indices = np.zeros((n,)) - sort_indices = np.argsort(-omegas_c) - indices[sort_indices[0:30]] = 1 - plot_eigenvalues_on_unit_circle_highlight(deltas_c, indices) - plot_polar_function(theta_discrete, deriv_delta, 1.5, 2.5) - plot_polar_function(theta_discrete, deriv_delta_omega, 3, 4) - plt.title('Sample ' + str(i)) - plt.savefig('fig_'+str(i)+'.png') - - plot_as_bar_plot(theta_discrete, deriv_delta_omega) - plt.title('Sample ' + str(i)) - plt.savefig('fig_omegas_'+str(i)+'.png') - - tmp = np.ones((len(theta[0:n, i]), 2)) - tmp[:, 0] = theta[0:n, i] - np.savetxt('theta_'+str(i)+'.txt', tmp) - - tmp = np.ones((len(theta_discrete), 2)) - tmp[:, 0] = theta_discrete - np.savetxt('theta_discrete_'+str(i)+'.txt', tmp) - np.savetxt('deriv_delta_'+str(i)+'.tex', deriv_delta) - np.savetxt('deriv_delta_omega_'+str(i)+'.tex', deriv_delta_omega) - - np.savetxt('omegas_all.txt', omegas) - - ensemble_sizes = np.array([8, 16, 32]) - - for i_s in range(0, len(ensemble_sizes)): - s = ensemble_sizes[i_s] - for i in range(0, n_samples, s): - i_sample_min = i - i_sample_max = i_sample_min + s - - omegas_s = omegas[:, i_sample_min:i_sample_max].flatten('F') - deltas_s = deltas[:, i_sample_min:i_sample_max].flatten('F') - theta_s = theta[:, i_sample_min:i_sample_max].flatten('F') - index = np.argwhere(np.absolute(deltas_s) >= 0.9) - - omegas_s = omegas_s[index] - deltas_s = deltas_s[index] - theta_s = theta_s[index] - - sort_indices = np.argsort(theta_s) - theta_s = theta_s[sort_indices] - deltas_s = deltas_s[sort_indices] - omegas_s = omegas_s[sort_indices] - - N = 720 - theta_discrete, cum_delta, deriv_delta, cum_delta_omega, deriv_delta_omega, percent_delta, percent_delta_omega = compute_cum_delta( - theta_s, deltas_s, omegas_s, N) - - n = len(omegas_s) - indices = np.zeros((n,)) - sort_indices = np.argsort(-omegas_s) - indices[sort_indices[0:30]] = 1 - plot_eigenvalues_on_unit_circle_highlight(deltas_s, indices) - plot_polar_function(theta_discrete, deriv_delta, 1.5, 2.5) - plot_polar_function(theta_discrete, deriv_delta_omega, 3, 4) - plt.title('Ensemble ' + str(int((i // s))) + - ' of ensemble size ' + str(s)) - - plt.savefig('fig_s_' + str(s) + '_' + - str(int((i // s))) + '.png') - plt.clf() - plt.close() - plot_as_bar_plot(theta_discrete, deriv_delta_omega) - plt.title('Ensemble ' + str(int((i // s))) + - ' of ensemble size ' + str(s)) - plt.savefig('fig_s_omegas_' + str(s) + '_' + - str(int((i // s))) + '.png') - plt.clf() - plt.close() - if display: - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_deltas_omegas_gs_analysis.py b/katoptron/CMAME/post_process/plate_deltas_omegas_gs_analysis.py deleted file mode 100644 index 1a9609a2..00000000 --- a/katoptron/CMAME/post_process/plate_deltas_omegas_gs_analysis.py +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - -from katoptron.eigenvalues import * -import os -import fwk - - -def plot_as_bar_plot(x, y, semilog=False): - import matplotlib.pyplot as plt - plt.figure() - - for i in range(0, len(x)): - if i == 0: - x_bar = np.array([x[0], 0.5*x[0]+0.5*x[1]]) - y_bar = np.array([y[0], y[0]]) - elif i != len(x)-1: - x_bar = np.append(x_bar, [x_bar[-1], 0.5*x[i]+0.5*x[i+1]]) - y_bar = np.append(y_bar, [y[i], y[i]]) - else: - x_bar = np.append(x_bar, [x_bar[-1], x[i]]) - y_bar = np.append(y_bar, [y[i], y[i]]) - break - if semilog: - plt.semilogy(x_bar, y_bar) - else: - plt.plot(x_bar, y_bar) - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - display = True - - current_n = 1 - n_samples = 32 - - theta = np.zeros((current_n, n_samples)) - omegas = np.zeros((current_n, n_samples)) - deltas = np.zeros((current_n, n_samples), dtype=np.complex128) - - for i in range(0, n_samples): - tmp_delta = np.loadtxt( - file_dir + '/../../../workspace/katoptron_CMAME_tests_plate_deltas_omegas_GS/deltas_GS_GS_'+str(i)+'.txt') - omegas_c = np.loadtxt( - file_dir + '/../../../workspace/katoptron_CMAME_tests_plate_deltas_omegas_GS/omegas_GS_GS_'+str(i)+'.txt') - - n = tmp_delta.shape[0] - - deltas_c = np.zeros((n,), dtype=np.complex128) - - deltas_c.real = tmp_delta[:, 0] - deltas_c.imag = tmp_delta[:, 1] - - index = np.argwhere(np.absolute(deltas_c) >= 0.95) - n = len(index) - - deltas_c = deltas_c[index].reshape((n,)) - omegas_c = omegas_c[index].reshape((n,)) - - if current_n < n: - - theta_tmp = np.zeros((n, n_samples)) - omegas_tmp = np.zeros((n, n_samples)) - deltas_tmp = np.zeros((n, n_samples), dtype=np.complex128) - - theta_tmp[0:current_n, :] = theta - omegas_tmp[0:current_n, :] = omegas - deltas_tmp[0:current_n, :] = deltas - - theta = theta_tmp - omegas = omegas_tmp - deltas = deltas_tmp - - current_n = n - - deltas[0:n, i] = deltas_c - omegas[0:n, i] = omegas_c - - theta_c = compute_theta(deltas_c) - - theta[0:n, i] = theta_c - - N = 720 - theta_discrete, cum_delta, deriv_delta, cum_delta_omega, deriv_delta_omega, percent_delta, percent_delta_omega = compute_cum_delta( - theta_c, deltas_c, omegas_c, N) - - # plot_as_bar_plot(theta_discrete,deriv_delta_omega) - - indices = np.zeros((n,)) - sort_indices = np.argsort(-omegas_c) - indices[sort_indices[0:30]] = 1 - # plot_eigenvalues_on_unit_circle_highlight(deltas_c,indices) - # plot_polar_function(theta_discrete,deriv_delta,1.5,2.5) - # plot_polar_function(theta_discrete,deriv_delta_omega,3,4) - #plt.title('Sample ' + str(i)) - # plt.savefig('fig_'+str(i)+'.png') - - #sort_indices = np.argsort(theta_c) - # plt.figure() - #plt.bar(theta_c[sort_indices],omegas_c[sort_indices], width=0.1, alpha=0.6, align="center") - # plt.plot(theta_c[sort_indices],omegas_c[sort_indices]) - - #tmp = np.ones((len(theta[0:n,i]),2)) - #tmp[:,0] = theta[0:n,i] - # np.savetxt('theta_'+str(i)+'.txt',tmp) - - #tmp = np.ones((len(theta_discrete),2)) - #tmp[:,0] = theta_discrete - # np.savetxt('theta_discrete_'+str(i)+'.txt',tmp) - # np.savetxt('deriv_delta_'+str(i)+'.tex',deriv_delta) - # np.savetxt('deriv_delta_omega_'+str(i)+'.tex',deriv_delta_omega) - - # np.savetxt('omegas_all.txt',omegas) - - theta = theta.flatten('F') - deltas = deltas.flatten('F') - omegas = omegas.flatten('F') - - N = 720 - theta_discrete, cum_delta, deriv_delta, cum_delta_omega, deriv_delta_omega, percent_delta, percent_delta_omega = compute_cum_delta( - theta, deltas, omegas, N) - plot_as_bar_plot(theta_discrete, deriv_delta_omega) - #sort_indices = np.argsort(theta) - # plt.figure() - #plt.bar(theta[sort_indices],omegas[sort_indices], width=0.1, alpha=0.6, align="center") - - ''' - ensemble_sizes = np.array([8,16,32]) - - for i_s in range(0,len(ensemble_sizes)): - s = ensemble_sizes[i_s] - for i in range(0,n_samples,s): - i_sample_min = i - i_sample_max = i_sample_min + s - - omegas_s = omegas[:,i_sample_min:i_sample_max].flatten('F') - deltas_s = deltas[:,i_sample_min:i_sample_max].flatten('F') - theta_s = theta[:,i_sample_min:i_sample_max].flatten('F') - index = np.argwhere(np.absolute(deltas_s)>=0.9) - - omegas_s = omegas_s[index] - deltas_s = deltas_s[index] - theta_s = theta_s[index] - - N = 1000 - theta_discrete, cum_delta, deriv_delta, cum_delta_omega, deriv_delta_omega, percent_delta, percent_delta_omega = compute_cum_delta(theta_s,deltas_s,omegas_s,N) - - n = len(omegas_s) - indices = np.zeros((n,)) - sort_indices = np.argsort(-omegas_s) - indices[sort_indices[0:30]] = 1 - plot_eigenvalues_on_unit_circle_highlight(deltas_s,indices) - plot_polar_function(theta_discrete,deriv_delta,1.5,2.5) - plot_polar_function(theta_discrete,deriv_delta_omega,3,4) - plt.title('Ensemble ' + str(int(i/s)) + ' of ensemble size ' + str(s)) - - plt.savefig('fig_s_'+ str(s) +'_' + str(int(i/s)) + '.png') - ''' - if display: - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_gamma.py b/katoptron/CMAME/post_process/plate_gamma.py deleted file mode 100644 index eaaa22a8..00000000 --- a/katoptron/CMAME/post_process/plate_gamma.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - - - -from katoptron.eigenvalues import * -from katoptron.readers import * -import os -import fwk - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - display = False - - input_file_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_vd_GS_3_3/1/' - - for i in range(0, 8): - filename_Q = input_file_dir + str(i) + '/A_mm_after_bc.txt' - filename_GT = input_file_dir + str(i) + '/B_mm.txt' - - Q = read_mm(filename_Q) - #Q = get_symmetrical_part(Q) - GT = read_mm(filename_GT) - - norm_Q = sparse_matrix_2_norm(Q) - norm_GT = sparse_matrix_2_norm(GT) - - print((norm_Q / norm_GT)) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_gamma_R.py b/katoptron/CMAME/post_process/plate_gamma_R.py deleted file mode 100644 index 3902d82d..00000000 --- a/katoptron/CMAME/post_process/plate_gamma_R.py +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - - - -from katoptron.eigenvalues import * -from katoptron.readers import * -from katoptron.readers import * -import os -import fwk -"""@package docstring -This file is used to investigate the choice of prec parameters. -""" - - -def read_timer_all(n_cases, sub_cases, file_MC_base_dir): - querylines = ['Belos: Operation Op*x', - 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: DGKS[2]: Ortho (Inner Product)', - 'Belos: DGKS[2]: Ortho (Norm)', - 'Belos: DGKS[2]: Ortho (Update)', - 'Belos: PseudoBlockGmresSolMgr total solve time'] - timer = np.zeros((n_cases, len(sub_cases), len(querylines))) - for i in range(0, n_cases): - file_MC_base_dir_2 = file_MC_base_dir + '/' + str(i)+'/' - for j in range(0, len(sub_cases)): - input_MC_file_dir = file_MC_base_dir_2 + str(sub_cases[j])+'/' - timer[i, j, :] = read_teuchos_timers( - input_MC_file_dir+'teuchos_timers.txt', querylines) - return timer - - -def read_iter_all(n_cases, sub_cases, file_MC_base_dir): - iter = np.zeros((n_cases, len(sub_cases))) - for i in range(0, n_cases): - file_MC_base_dir_2 = file_MC_base_dir + '/' + str(i)+'/' - for j in range(0, len(sub_cases)): - input_MC_file_dir = file_MC_base_dir_2 + str(sub_cases[j])+'/' - iter_indices, residuals = read_Belos( - input_MC_file_dir + 'belos_out.txt', 1) - iter[i][j] = iter_indices[-1] - return iter - - -def main(): - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - file_MC_base_dir = '/Volumes/HD_SONY/CMAME/Plate/gaussian/katoptron_CMAME_tests_plate_mean_gamma/' - #file_dir + '/../../../workspace/katoptron_CMAME_tests_plate_mean_prec_GS_direct/' - sub_cases = ['1', '8'] - - N = 200 - gamma_min_exp = -2 - gamma_max_exp = 10 - - gammas = np.logspace(gamma_min_exp, gamma_max_exp, N, endpoint=True) - - iter = read_iter_all(N, sub_cases, file_MC_base_dir) - timer = read_timer_all(N, sub_cases, file_MC_base_dir) - - from mpl_toolkits.mplot3d import Axes3D - import matplotlib.pyplot as plt - from matplotlib import cm - - plt.subplot(211) - plt.semilogx(gammas, iter[:, 0]) - plt.semilogx(gammas, iter[:, 1]) - plt.semilogx([4368992., 4368992.], [200, 1000], '--k') - plt.xlabel('gamma') - plt.ylabel('iter') - plt.subplot(212) - plt.semilogx(gammas, np.divide(iter[:, 1], iter[:, 0])) - plt.xlabel('gamma') - plt.ylabel('R') - plt.semilogx([4368992., 4368992.], [1, 5], '--k') - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_mean.py b/katoptron/CMAME/post_process/plate_mean.py deleted file mode 100644 index 545e96f8..00000000 --- a/katoptron/CMAME/post_process/plate_mean.py +++ /dev/null @@ -1,196 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.eigenvalues import * -from katoptron.readers import * -import os - -import vtk -import tboxVtk -import tboxVtk.reader as vtkR -import tboxVtk.cutter as vtkC - - -def Kirsch_equations(x, y, center_x, center_y, a, sigma_inf): - - centered_x = x-center_x - centered_y = y-center_y - - r = np.abs(centered_x+centered_y*1.0j) - theta = np.angle(centered_x+centered_y*1.0j) - (np.pi / 2) - - half_sigma_inf = ((sigma_inf / 2)) - - ar = (a / r) - ar_p_2 = np.power(ar, 2) - ar_p_4 = np.power(ar, 4) - - cos2theta = np.cos(2*theta) - sin2theta = np.sin(2*theta) - - sigma_rr = half_sigma_inf*(1-ar_p_2)+half_sigma_inf * \ - (1-4*ar_p_2+3*ar_p_4)*cos2theta - sigma_thetatheta = half_sigma_inf * \ - (1+ar_p_2)-half_sigma_inf*(1+3*ar_p_4)*cos2theta - tau_rtheta = -half_sigma_inf*(1+2*ar_p_2-3*ar_p_4)*sin2theta - - VM = np.sqrt(np.square(sigma_rr)+np.square(sigma_thetatheta) - - sigma_rr*sigma_thetatheta+3*np.square(tau_rtheta)) - - return VM - - -def cut_plate(mshName): - reader = vtkR.Reader() - reader.open(mshName) - cutter = vtkC.Cutter(reader.reader.GetOutputPort()) - c_output = cutter.cut(1, [0., 0., 0.5], [0., 0., 1.], tag_name='volume_id') - pts, tri, vals = cutter.extract( - c_output, 3, ['u', 'x', 'y', 'z'], atPoint=True) - pts_2, tri_2, vals_2 = cutter.extract( - c_output, 3, ['G', 'von Mises'], atPoint=False) - vals.update(vals_2) - - return pts, tri, vals - - -def extract_quad_msh(mshName): - reader = vtkR.Reader() - reader.open(mshName) - rdata = reader.reader.GetOutput() - - _pts = rdata.GetPoints() - pts = np.zeros((_pts.GetNumberOfPoints(), 2)) - pts_indices = np.zeros((_pts.GetNumberOfPoints(),), dtype=int) - for i in range(0, pts.shape[0]): - if _pts.GetPoint(i)[2] <= 0.01: - for j in range(0, 2): - pts[i][j] = _pts.GetPoint(i)[j] - pts_indices[i] = 1 - n_elems = rdata.GetNumberOfCells() - quad = [] - for i in range(0, n_elems): - elem = rdata.GetCell(i) - for j in range(0, 6): - face = elem.GetFace(j) - points_id = np.zeros((4,), dtype=int) - good_face = True - for k in range(0, 4): - points_id[k] = face.GetPointId(k) - if pts_indices[points_id[k]] != 1: - good_face = False - break - if good_face: - if len(quad) == 0: - quad = points_id.reshape((1, 4)) - else: - quad = np.append(quad, points_id.reshape((1, 4)), axis=0) - return pts, quad - - -def plot_2D_cut_values_at_node(x, y, tri, value, v_min, v_max, n_levels=16): - import matplotlib.pyplot as plt - value = value.reshape((len(x),)) - levels = np.linspace(v_min, v_max, n_levels) - print(levels) - - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - plt.tricontour(x, y, tri, value, levels, linestyles='-', - colors='black', linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, value, levels) - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, - hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - - -def plot_2D_cut_values_at_elem(x, y, tri_1, value, v_min, v_max, n_levels=16, shading=False): - import matplotlib.pyplot as plt - - value = value.reshape((tri_1.shape[0],)) - - levels = np.linspace(v_min, v_max, n_levels) - print(levels) - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - if shading: - plt.tripcolor(x, y, tri_1, value, shading='gouraud') - else: - plt.tripcolor(x, y, tri_1, value, levels) - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, - hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - - -def plot_2D_mesh(pts, quad): - import matplotlib.pyplot as plt - fig = plt.figure(figsize=(8, 8)) - f = open('mesh_2.tex', 'w') - print('\begin{tikzpicture}', file=f) - for i in range(0, quad.shape[0]): - x = np.zeros((quad.shape[1]+1,)) - y = np.zeros((quad.shape[1]+1,)) - for j in range(0, quad.shape[1]): - x[j] = pts[quad[i, j], 0] - y[j] = pts[quad[i, j], 1] - x[-1] = pts[quad[i, 0], 0] - y[-1] = pts[quad[i, 0], 1] - string_1 = '\draw[thick] ' - for j in range(0, quad.shape[1]+1): - string_1 = string_1 + '(' + str(x[j]) + ',' + str(y[j]) + ')' - if j == quad.shape[1]: - string_1 = string_1 + ';' - else: - string_1 = string_1 + '--' - - print(string_1, file=f) - plt.plot(x, y, 'black') - plt.gca().set_aspect('equal') - - print('\end{tikzpicture}', file=f) - f.closed - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - display = False - - input_file_dir = '/Users/kimliegeois/Desktop/katoptron_CMAME_tests_plate_MC_MG_all_cases_2/case_1/8/0/' - - mshName = input_file_dir+'plate_fused_ast1_s0_0' - - pts, tri, vals = cut_plate(mshName) - pts_2, quad = extract_quad_msh(mshName) - - plot_2D_mesh(pts_2, quad) - - x = pts[:, 0] - y = pts[:, 1] - - VM_theory = Kirsch_equations(x, y, 5, 5, 2, 700) - plot_2D_cut_values_at_node(x, y, tri, VM_theory, 0, 3100) - plt.savefig("mean_VM_theory.pdf", transparent=True, - bbox_inches='tight', pad_inches=-0.05) - - # plot_2D_cut_values_at_node(x,y,tri,vals['u']) - plot_2D_cut_values_at_node(x, y, tri, vals['G'], -0.07967112, 0.15190813) - plt.savefig("G_0.pdf", transparent=True, - bbox_inches='tight', pad_inches=-0.05) - - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_mean_GS.py b/katoptron/CMAME/post_process/plate_mean_GS.py deleted file mode 100644 index 0fefac3e..00000000 --- a/katoptron/CMAME/post_process/plate_mean_GS.py +++ /dev/null @@ -1,292 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -from katoptron.eigenvalues import * -from katoptron.readers import * -import os -import fwk -"""@package docstring -This file is used to investigate the convergence of the SOR (Gauss-Seidel with damping factor in [0,2]). -""" - -Verbose = False - -algo_inverse = 4 - - -def save_data(name, omegas, rhos): - tmp = np.zeros((len(omegas), 2)) - tmp[:, 0] = omegas - tmp[:, 1] = rhos - np.savetxt(name, tmp) - - -def Inv_triangular_matrix_1(A): - """ - This function computes the inverse of a triangular matrix based on - https://math.stackexchange.com/questions/1003801/inverse-of-an-invertible-upper-triangular-matrix-of-order-3 - - This one is slow but precise! - """ - from scipy.sparse import eye - n = A.shape[0] - invA = eye(n) - tmp = A - for i in range(1, n - 1): - invA = invA + tmp - tmp = tmp * A - return invA - - -def Inv_triangular_matrix_2(A): - """ - This function computes the inverse of a triangular matrix based on - forward substitution - - This one is fast but not precise! - """ - from scipy.sparse import eye - from scipy.sparse import csr_matrix - n = A.shape[0] - invA = np.zeros((n, n)) - tmpA = A.todense() - for i in range(0, n): - invA[i, :] = invA[i, :] - A[i, 0:(i - 1)].dot(invA[0:(i - 1), :]) - invA[i, i] = 1. - return csr_matrix(invA) - - -def Inv_triangular_matrix_3(A, B): - from scipy.sparse.linalg import spsolve_triangular - n = A.shape[0] - X = np.zeros((n, n)) - - for i in range(1, n): - #X[:,[i]] = spsolve_triangular(A, B[:,i]) - tmp = A.tocsr()[0:i, :].tocsc()[:, 0:i] - X[0:i, [i]] = spsolve_triangular(tmp, B[0:i, i]) - return X - - -def Inv_triangular_matrix_4(A): - """ - This function computes the inverse of a triangular matrix based on - a recursive approach - - This one is fast and precise! - """ - from scipy.sparse import csr_matrix - from scipy.sparse import eye - n = A.shape[0] - - n_max = 100 - - if n < n_max: - return Inv_triangular_matrix_1(eye(n) - A).todense() - else: - n1 = n // 2 - invA = np.zeros((n, n)) - invA[0:n1, 0:n1] = Inv_triangular_matrix_4(A[0:n1, 0:n1]) - invA[n1:n, n1:n] = Inv_triangular_matrix_4(A[n1:n, n1:n]) - tmp = invA[n1:n, n1:n] * A[n1:n, 0:n1] - invA[n1:n, 0:n1] = -tmp.dot(invA[0:n1, 0:n1]) - return invA - - -def M_Jac(A): - """ - This function returns the iterative matrix of the Jacobi approach applied on A - If this matrix has a spectral radius strictly smaller than 1, the optimal - damping parameters of the SOR applied on A can be deduced analytically. - """ - from scipy.sparse import diags - from scipy.sparse import eye - invD = diags(1. / A.diagonal(), 0) - n = A.shape[0] - return eye(n) - invD * A - - -def M_SOR(A, omega): - """ - This function returns the iterative matrix of the SOR approach applied on A. - """ - from scipy.sparse import tril - from scipy.sparse import triu - from scipy.sparse import eye - from scipy.sparse import diags - from scipy.sparse.linalg import inv - from scipy.sparse.linalg import spsolve_triangular - - E = -tril(A, -1) - F = -triu(A, 1) - invD = diags(1. / A.diagonal(), 0) - - L = invD * E - U = invD * F - I = eye(A.shape[0]) - - if algo_inverse == 1: - x = Inv_triangular_matrix_1(omega * L) * ((1. - omega) * I + omega * U) - elif algo_inverse == 2: - x = Inv_triangular_matrix_2(I - omega * L) * ( - (1. - omega) * I + omega * U) - elif algo_inverse == 3: - x = Inv_triangular_matrix_3(I - omega * L, - ((1. - omega) * I + omega * U).todense()) - elif algo_inverse == 4: - x = Inv_triangular_matrix_4(I - omega * L) * ( - (1. - omega) * I + omega * U) - return x - - -def spectral_radius_analysis(A, - N, - timers, - tmp_name, - omega_min=0., - omega_max=2.): - """ - This function computes the spectral radii. - """ - timers['Compute M_Jac'].start() - m_Jac = M_Jac(A) - timers['Compute M_Jac'].stop() - timers['Compute rho_Jac'].start() - rho_Jac = spectral_radius(m_Jac) - timers['Compute rho_Jac'].stop() - - if Verbose: - if rho_Jac >= 1.: - print('The Jacobi approach does not converge on this matrix as rho(M_Jac) = ' + str( - rho_Jac)) - else: - print('The Jacobi approach does converge on this matrix as rho(M_Jac) = ' + str( - rho_Jac)) - - omegas = np.linspace(omega_min, omega_max, N) - rho_SOR = np.ones(omegas.shape) - - for i in range(0, N): - if 0. < omegas[i] and omegas[i] < 2.: - timers['Compute M_SOR'].start() - m_SOR = M_SOR(A, omegas[i]) - timers['Compute M_SOR'].stop() - timers['Compute rho_SOR'].start() - try: - rho_SOR[i] = spectral_radius(m_SOR) - except: - rho_SOR[i:(N + 1)] = 1. - timers['Compute M_SOR'].stop() - break - timers['Compute M_SOR'].stop() - - if Verbose: - if rho_SOR[i] >= 1.: - print('The SOR approach does not converge on this matrix as rho(M_SOR) = ' + str( - rho_SOR[i]) + ' with omega = ' + str(omegas[i])) - else: - print('The SOR approach does converge on this matrix as rho(M_SOR) = ' + str( - rho_SOR[i]) + ' with omega = ' + str(omegas[i])) - print(str(((100. * i) // N)) + - ' % of the omegas are evaluated ') - save_data(tmp_name, omegas, rho_SOR) - if Verbose: - print(timers) - - return rho_Jac, omegas, rho_SOR - - -def main(): - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - timers = fwk.Timers() - - timers['Read data'].start() - input_file_dir = file_dir + '/../../../workspace/katoptron_CMAME_tests_plate/' - filename_K = input_file_dir + 'A_mm_after_bc.txt' - filename_GT = input_file_dir + 'B_mm.txt' - filename_rhs = input_file_dir + 'b_mm_after_bc.txt' - - K = read_mm(filename_K) - K = get_symmetrical_part(K) - GT = read_mm(filename_GT) - G = GT.transpose() - timers['Read data'].stop() - timers['Compute and apply gamma'].start() - norm_K = sparse_matrix_2_norm(K) - norm_GT = sparse_matrix_2_norm(GT) - - b = read_mm(filename_rhs, is_sparse=False) - b0 = b[0:K.shape[0]] - - gamma = (norm_K / norm_GT) - - Q = K + gamma * G * GT - timers['Compute and apply gamma'].stop() - - from numpy import linalg as LA - - n = 20 - gs = Gauss_Seidel(K, n=n, damping=1.) - xn, norm_res_K = gs.dot_with_norm(b0) - gs = Gauss_Seidel(K, n=n, damping=0.8) - xn, norm_res_Q = gs.dot_with_norm(b0) - - n_omegas = 50 - omegas = np.linspace(0., 2., n_omegas) - res_omegas = np.zeros((n_omegas, n+2)) - res_omegas[:, 0] = omegas - import matplotlib.pyplot as plt - plt.figure() - for i in range(0, n_omegas): - gs = Gauss_Seidel(K, n=n, damping=omegas[i]) - xn, norm_res = gs.dot_with_norm(b0) - tmp = (norm_res / norm_res[0]) - res_omegas[i, 1:n+2] = np.reshape(tmp[:], (n+1,)) - plt.plot(tmp) - plt.grid() - - plt.figure() - plt.plot(omegas, res_omegas[:, 1]) - plt.plot(omegas, res_omegas[:, 2]) - plt.plot(omegas, res_omegas[:, 3]) - print(res_omegas) - for i in range(1, n+1): - j = np.argmin(res_omegas[:, i+1]) - print(omegas[j]) - np.savetxt('res_omegas.txt', res_omegas) - - plt.show() - - print(timers) - - ''' - R = approx_Schur_complement(Q, G, GT) - - N = 5 - - timers_R = fwk.Timers() - timers_Q = fwk.Timers() - rho_Jac_R, omegas_R, rho_SOR_R = spectral_radius_analysis(R, - N, - timers_R, - 'tmp_SOR_R.out', - omega_min=0., - omega_max=1.) - save_data('SOR_R.out', omegas_R, rho_SOR_R) - print timers_R - rho_Jac_Q, omegas_Q, rho_SOR_Q = spectral_radius_analysis(Q, - N, - timers_Q, - 'tmp_SOR_Q.out', - omega_min=0.8, - omega_max=2.) - save_data('SOR_Q.out', omegas_Q, rho_SOR_Q) - np.savetxt('Jac.out', (rho_Jac_R, rho_Jac_Q)) - print timers_Q - ''' - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_mean_GS_omega.py b/katoptron/CMAME/post_process/plate_mean_GS_omega.py deleted file mode 100644 index b4df656e..00000000 --- a/katoptron/CMAME/post_process/plate_mean_GS_omega.py +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - -from katoptron.eigenvalues import * -from katoptron.readers import * -import os -import fwk - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - display = False - - input_file_dir = file_dir + '/../../../workspace/katoptron_CMAME_tests_plate/' - - mshName = input_file_dir+'plate_fused_ast1_s0_0' - - filename_Q = input_file_dir + 'ApCTC_mm.txt' # 'A_mm_after_bc.txt' # - filename_GT = input_file_dir + 'B_mm.txt' - - Q = read_mm(filename_Q) - Q = get_symmetrical_part(Q) - GT = read_mm(filename_GT) - G = GT.transpose() - - R = approx_Schur_complement(Q, G, GT) - - if diagonal_dominance(R): - print('R is diagonally dominant') - else: - print('R is not diagonally dominant') - if diagonal_dominance(Q): - print('Q is diagonally dominant') - else: - print('Q is not diagonally dominant') - - if is_SPD(R): - print('R is SPD') - else: - print('R is not SPD') - - if is_SPD(Q): - print('Q is SPD') - else: - print('Q is not SPD') - #Qjac = jacobi_iteration_matrix(Q) - #Rjac = jacobi_iteration_matrix(R) - - #mu_Q = np.absolute(spectral_radius(Qjac)) - #mu_R = np.absolute(spectral_radius(Rjac)) - - #print mu_Q - #print mu_R - - #print 2/(1+np.sqrt(1-mu_Q**2)) - #print 2/(1+np.sqrt(1-mu_R**2)) - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/post_process/plate_mean_convergence.py b/katoptron/CMAME/post_process/plate_mean_convergence.py deleted file mode 100644 index 7ba726c6..00000000 --- a/katoptron/CMAME/post_process/plate_mean_convergence.py +++ /dev/null @@ -1,223 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.eigenvalues import * -import os -import fwk - -import vtk -import tboxVtk -import tboxVtk.reader as vtkR -import tboxVtk.lineExtractor as vtkC - - -def Kirsch_equations(x, y, center_x, center_y, a, sigma_inf): - - centered_x = x-center_x - centered_y = y-center_y - - r = np.abs(centered_x+centered_y*1.0j) - theta = np.angle(centered_x+centered_y*1.0j) - (np.pi / 2) - - half_sigma_inf = ((sigma_inf / 2)) - - ar = (a / r) - ar_p_2 = np.power(ar, 2) - ar_p_4 = np.power(ar, 4) - - cos2theta = np.cos(2*theta) - sin2theta = np.sin(2*theta) - - sigma_rr = half_sigma_inf*(1-ar_p_2)+half_sigma_inf * \ - (1-4*ar_p_2+3*ar_p_4)*cos2theta - sigma_thetatheta = half_sigma_inf * \ - (1+ar_p_2)-half_sigma_inf*(1+3*ar_p_4)*cos2theta - tau_rtheta = -half_sigma_inf*(1+2*ar_p_2-3*ar_p_4)*sin2theta - - VM = np.sqrt(np.square(sigma_rr)+np.square(sigma_thetatheta) - - sigma_rr*sigma_thetatheta+3*np.square(tau_rtheta)) - - return VM - - -def cut_plate(mshName): - reader = vtkR.Reader() - reader.open(mshName) - cutter = vtkC.Cutter(reader.reader.GetOutputPort()) - c_output = cutter.cut(1, [0., 0., 0.5], [0., 0., 1.], tag_name='volume_id') - pts, tri, vals = cutter.extract( - c_output, 3, ['u', 'x', 'y', 'z'], atPoint=True) - pts_2, tri_2, vals_2 = cutter.extract( - c_output, 3, ['G', 'von Mises'], atPoint=False) - vals.update(vals_2) - - return pts, tri, vals - - -def cut_line(mshName, P1, P2): - reader = vtkR.Reader() - reader.open(mshName) - cutter = vtkC.LineExtractor(reader.reader.GetOutputPort()) - c_output = cutter.cut(1, P1, P2, tag_name='volume_id') - pts, tri, vals = cutter.extract( - c_output, ['u', 'x', 'y', 'z'], atPoint=True) - pts_2, tri_2, vals_2 = cutter.extract( - c_output, ['G', 'von Mises'], atPoint=False) - vals.update(vals_2) - - return pts, tri, vals - - -def extract_quad_msh(mshName): - reader = vtkR.Reader() - reader.open(mshName) - rdata = reader.reader.GetOutput() - - _pts = rdata.GetPoints() - pts = np.zeros((_pts.GetNumberOfPoints(), 2)) - pts_indices = np.zeros((_pts.GetNumberOfPoints(),), dtype=int) - for i in range(0, pts.shape[0]): - if _pts.GetPoint(i)[2] <= 0.01: - for j in range(0, 2): - pts[i][j] = _pts.GetPoint(i)[j] - pts_indices[i] = 1 - n_elems = rdata.GetNumberOfCells() - quad = [] - for i in range(0, n_elems): - elem = rdata.GetCell(i) - for j in range(0, 6): - face = elem.GetFace(j) - points_id = np.zeros((4,), dtype=int) - good_face = True - for k in range(0, 4): - points_id[k] = face.GetPointId(k) - if pts_indices[points_id[k]] != 1: - good_face = False - break - if good_face: - if len(quad) == 0: - quad = points_id.reshape((1, 4)) - else: - quad = np.append(quad, points_id.reshape((1, 4)), axis=0) - return pts, quad - - -def plot_2D_cut_values_at_node(x, y, tri, value, v_min, v_max, n_levels=16): - import matplotlib.pyplot as plt - value = value.reshape((len(x),)) - levels = np.linspace(v_min, v_max, n_levels) - print(levels) - - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - plt.tricontour(x, y, tri, value, levels, linestyles='-', - colors='black', linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, value, levels) - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, - hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - - -def plot_2D_cut_values_at_elem(x, y, tri_1, value, v_min, v_max, n_levels=16, shading=False): - import matplotlib.pyplot as plt - - value = value.reshape((tri_1.shape[0],)) - - levels = np.linspace(v_min, v_max, n_levels) - print(levels) - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - if shading: - plt.tripcolor(x, y, tri_1, value, shading='gouraud') - else: - plt.tripcolor(x, y, tri_1, value, levels) - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, - hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - - -def plot_2D_mesh(pts, quad): - import matplotlib.pyplot as plt - fig = plt.figure(figsize=(8, 8)) - f = open('mesh_2.tex', 'w') - print('\begin{tikzpicture}', file=f) - for i in range(0, quad.shape[0]): - x = np.zeros((quad.shape[1]+1,)) - y = np.zeros((quad.shape[1]+1,)) - for j in range(0, quad.shape[1]): - x[j] = pts[quad[i, j], 0] - y[j] = pts[quad[i, j], 1] - x[-1] = pts[quad[i, 0], 0] - y[-1] = pts[quad[i, 0], 1] - string_1 = '\draw[thick] ' - for j in range(0, quad.shape[1]+1): - string_1 = string_1 + '(' + str(x[j]) + ',' + str(y[j]) + ')' - if j == quad.shape[1]: - string_1 = string_1 + ';' - else: - string_1 = string_1 + '--' - - print(string_1, file=f) - plt.plot(x, y, 'black') - plt.gca().set_aspect('equal') - - print('\end{tikzpicture}', file=f) - f.closed - - -def plot_1D_data_per_elem(pts, elems, vals): - import matplotlib.pyplot as plt - - plt.figure() - for i in range(0, elems.shape[0]): - if i == 0: - x = np.array([pts[elems[i][0]], pts[elems[i][1]]]) - y = np.array([vals[i], vals[i]]) - else: - x = np.append(x, [pts[elems[i][0]], pts[elems[i][1]]]) - y = np.append(y, [vals[i], vals[i]]) - - plt.plot(x, y, 'r') - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - display = False - - mshName_extended_1 = file_dir + \ - '/../../../workspace/katoptron_CMAME_tests_plate_extended/plate_fused_ast1_s0_0' - mshName_extended_2 = file_dir + \ - '/../../../workspace/katoptron_CMAME_tests_plate_extended_1/plate_fused_ast1_s0_0' - mshName_mean = file_dir + \ - '/../../../workspace/katoptron_CMAME_tests_plate/plate_fused_ast1_s0_0' - - i = 0 - for mshName in [mshName_extended_1, mshName_extended_2, mshName_mean]: - if i == 2: - pts, tri, vals = cut_line(mshName, [5., 5., 0.5], [10, 5., 0.5]) - else: - pts, tri, vals = cut_line(mshName, [5., 5., 0.5], [50, 5., 0.5]) - VM_theory = Kirsch_equations(pts+5, np.zeros(pts.shape), 5, 0, 2, 700) - plot_1D_data_per_elem(pts, tri, vals['von Mises']) - plt.plot(pts, VM_theory) - plt.ylabel('[MPa]') - plt.xlabel('Pos') - plt.savefig('fig_'+str(i)+'.png') - i = i + 1 - # plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMAME/slurm/blake_MC_MG.slurm.sh b/katoptron/CMAME/slurm/blake_MC_MG.slurm.sh deleted file mode 100644 index a1025926..00000000 --- a/katoptron/CMAME/slurm/blake_MC_MG.slurm.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=MC_MG -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/MC_MG.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=48 -export KMP_PLACE_THREADS=24c,2t -export KMP_AFFINITY=compact - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} - -function setEnsembleReduction(){ - remove2env INCLUDE "${Trilinos_DIR}/include" - remove2env LIB "${Trilinos_DIR}/lib" - remove2env PYTHONPATH "${Trilinos_DIR}/lib/python2.7/site-packages" - remove2env LD_LIBRARY_PATH "${Trilinos_DIR}/lib/python2.7/site-packages/PyTrilinos" - remove2env LD_LIBRARY_PATH "${Trilinos_DIR}/lib/python2.7/site-packages" - remove2env LD_LIBRARY_PATH "${Trilinos_DIR}/lib" - if [ “$1†== “false†]; then - export Trilinos_DIR=$Trilinos_DIR_NO_ER - export Waves_DIR=$Waves_DIR_NO_ER - export ensemble_reduction="false" - else - export Trilinos_DIR=$Trilinos_DIR_ER - export Waves_DIR=$Waves_DIR_ER - export ensemble_reduction="true" - fi - add2env INCLUDE "${Trilinos_DIR}/include" end - add2env LIB "${Trilinos_DIR}/lib" end - add2env PYTHONPATH "${Trilinos_DIR}/lib/python2.7/site-packages" front - add2env LD_LIBRARY_PATH "${Trilinos_DIR}/lib/python2.7/site-packages/PyTrilinos" end - add2env LD_LIBRARY_PATH "${Trilinos_DIR}/lib/python2.7/site-packages" end - add2env LD_LIBRARY_PATH "${Trilinos_DIR}/lib" end - cd $Waves_DIR -} - -setEnsembleReduction false - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_MC_MG_all_cases.py - -setEnsembleReduction true - -python run.py -k ${OMP_NUM_THREADS} katoptron/CMAME/tests/plate_MC_MG_all_cases.py diff --git a/katoptron/CMAME/tests/plate_MC_MG_all_cases.py b/katoptron/CMAME/tests/plate_MC_MG_all_cases.py deleted file mode 100644 index fa7ce389..00000000 --- a/katoptron/CMAME/tests/plate_MC_MG_all_cases.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -"""@package docstring -This test runs the four different cases as defined in table 2 of the paper -with a SIMPLE-GS-GS preconditioner. -""" - - - - - -import katoptron.CMAME.model as model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - - -def evaluate_one_ensemble(ensemble_size, case_id, first_sample_id, msh, comm, - file_dir): - """ - This function evaluates one ensemble for a given test case - """ - work_dir = os.getcwd() - args = parseargs() - - p = model.get_parameters(case_id, first_sample_id) - p['MueLu xml template file name'] = '/../../preconditioners/SIMPLE_gs_direct_lvl_MT.xml.in' - - pm = model.plate_model(ensemble_size, np.array([0]), msh, comm, file_dir, - work_dir, p) - pm.run() - - -def evaluate_all_ensembles(ensemble_sizes, case_ids, N, msh, comm, file_dir): - """ - This function loop over the test cases, the ensemble sizes, - and the ensembles - """ - for case_id in case_ids: - directory_case_id = 'case_' + str(case_id) - if not os.path.exists(directory_case_id): - os.makedirs(directory_case_id) - os.chdir(directory_case_id) - for ensemble_size in ensemble_sizes: - directory = str(ensemble_size) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - directory = str(ensemble_index) - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - first_sample_id = ensemble_index * ensemble_size - - evaluate_one_ensemble(ensemble_size, case_id, first_sample_id, - msh, comm, file_dir) - os.chdir('..') - os.chdir('..') - os.chdir('..') - - -def main(): - """ - This loads the mesh and define the case ids and ensemble sizes - """ - comm, rank, size = m.utilities.import_MPI() - - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.geo', 'plate_1_tmp', 'plate_2.geo', - 'plate_2_tmp', 'plate_fused', file_dir + '/../mesh', - work_dir, comm, rank, size) - - deterministic = False - - if deterministic: - N = 1 - ensemble_sizes = [1] - case_ids = [0] - else: - N = 96 - ensemble_sizes = [1, 8, 16, 24, 32] - case_ids = [1, 2, 3, 4, 5, 6, 7, 8, 9] - - nThreads = u.Initialize_Kokkos() - evaluate_all_ensembles(ensemble_sizes, case_ids, N, msh, comm, file_dir) - u.Finalize_Kokkos() - - -if __name__ == "__main__": - main() diff --git a/katoptron/CMakeLists.txt b/katoptron/CMakeLists.txt deleted file mode 100644 index 3b458a43..00000000 --- a/katoptron/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -# Kim, you need to set your dependencies here! - -# Add source and exe dir -ADD_SUBDIRECTORY( src ) -ADD_SUBDIRECTORY( _src ) - -ADD_SUBDIRECTORY( exe ) - -# Add test dir -MACRO_AddTest(${CMAKE_CURRENT_SOURCE_DIR}/tests) -MACRO_AddTest(${CMAKE_CURRENT_SOURCE_DIR}/tests 2) - diff --git a/katoptron/Juelich/UQ/GS.py b/katoptron/Juelich/UQ/GS.py deleted file mode 100644 index 34ad8a5f..00000000 --- a/katoptron/Juelich/UQ/GS.py +++ /dev/null @@ -1,290 +0,0 @@ -import numpy - -from katoptron.eigenvalues import * -from scipy.sparse import eye -import matplotlib.pyplot as plt -import scipy - -import katoptron.utilities as u - - -def spectral_radii_bound(A, omega_min=0., omega_max=2., n_omega=100): - from scipy.sparse import tril - from scipy.sparse import triu - from scipy.sparse import eye - from scipy.sparse import diags - from scipy.sparse import issparse - - omegas = np.linspace(omega_min, omega_max, n_omega) - rhos = np.ones((n_omega, )) - - Adiag = A.diagonal() - - invD = diags(1. / Adiag, 0) - - scaled_A = invD * A - - L = -tril(scaled_A, -1) - U = -triu(scaled_A, 1) - - n = A.shape[0] - - #n = 100 - - l_n = np.zeros((n, )) - u_n = np.zeros((n, )) - - l_2n = np.zeros((n, n - 1)) - u_2n = np.zeros((n, n - 1)) - - T_l_n = np.zeros((n, )) - T_u_n = np.zeros((n, )) - L_abs = np.abs(L) - U_abs = np.abs(U) - - l_n = L_abs.sum(axis=1) - u_n = U_abs.sum(axis=1) - - T_l_n = L_abs.max(axis=1) - T_u_n = U_abs.max(axis=1) - - if np.max(l_n) > 1: - print('error') - return omegas, rhos - if np.max(T_l_n) > 1: - print('error') - return omegas, rhos - ''' - for i in range(0,n): - print i - print n - tmp = L.getrow(i) - T_l_n[i] = np.max(np.abs(tmp)) - tmp = U.getrow(i) - T_l_n[i] = np.max(np.abs(tmp)) - ''' - - for i in range(0, n): - for j in range(0, i): - u_2n[i, j] = u_n[i] + u_n[j] - l_2n[i, j] = l_n[i] + l_n[j] - for j in range(i + 1, n): - u_2n[i, j - 1] = u_n[i] + u_n[j] - l_2n[i, j - 1] = l_n[i] + l_n[j] - - for omega_i in range(0, n_omega): - omega = omegas[omega_i] - - tmp_1 = np.divide(2 * np.abs(1 - omega) + omega * u_2n, - 2. - omega * l_2n) - - max_1 = np.amax(tmp_1) - - tmp_2 = np.zeros((n, )) - for i in range(0, n): - scalar_1 = ((np.abs(1 - omega) + omega * u_n[i]) / (1 - - omega * l_n[i])) - scalar_2 = ((np.abs(1 - omega)) / (1 - omega * T_u_n[i])) - scalar_3 = np.abs(1 - omega) + omega * u_n[i] - scalar_4 = np.max([scalar_2, scalar_3]) - tmp_2[i] = np.min([scalar_1, scalar_4]) - - max_2 = np.max(tmp_2) - - rhos[i] = np.max([max_1, max_2]) - - return omegas, rhos - - -def is_Z_matrix(A): - from scipy.sparse import diags - Adiag = A.diagonal() - - D = diags(Adiag, 0) - - Aoff = A - D - - max_row = Aoff.max(axis=1) - - if np.max(max_row) <= 0: - return True - else: - return False - - -def is_M_matrix(A): - is_Z = is_Z_matrix(A) - if not is_Z: - return False - is_spd = is_SPD(A) - - return is_spd - - -def spectral_radii(A, omegas, n_power=10): - from scipy.sparse import tril - from scipy.sparse import triu - from scipy.sparse import eye - from scipy.sparse import diags - from scipy.sparse import issparse - - n_omega = len(omegas) - rhos = np.ones((n_omega, )) - - E = -tril(A, -1) - F = -triu(A, 1) - invD = diags(1. / A.diagonal(), 0) - n = A.shape[0] - I = eye(n) - - for omega_i in range(0, n_omega): - #print omega_i - omega = omegas[omega_i] - if omega == 0. or omega == 2.: - rhos[omega_i] = 1. - else: - N = I - omega * invD * E - M = (1. - omega) * I + omega * invD * F - rhos[omega_i] = np.min([gen_power_method(M, N, n=n_power), 1.]) - - #print rhos - - return rhos - - -def main(): - comm, rank, siz = u.import_MPI() - - post_process = True - - #base_dir = '/Volumes/HD_SONY/Thesis/Juelich/GS/order_44/1/0/' - - #A_u = read_mm(base_dir+'A_00_mm.txt', -1, True, True, False) - #A_T = read_mm(base_dir+'A_11_mm.txt', -1, True, True, True) - - # scipy.sparse.save_npz('A_T.npz',A_T) - # scipy.sparse.save_npz('A_u.npz',A_u) - - if post_process: - omegas = np.loadtxt('omegas.txt') - rho_T = np.loadtxt('rho_T.txt') - rho_u = np.loadtxt('rho_u.txt') - - omegas = np.loadtxt('results_3/omegas.txt') - rho_T = np.loadtxt('results_3/rho_T.txt') - rho_u_A = np.loadtxt('results_3/rho_u_A.txt') - rho_u_B = np.loadtxt('results_3/rho_u_B.txt') - - rho_T[omegas >= 1.75] = 1. - i_T = np.argmin(rho_T) - i_u_A = np.argmin(rho_u_A) - i_u_B = np.argmin(rho_u_B) - - print(omegas[i_T]) - print(omegas[i_u_A]) - print(omegas[i_u_B]) - - plt.figure() - plt.plot(omegas, rho_T) - plt.plot(omegas, rho_u_A) - plt.plot(omegas, rho_u_B) - plt.show() - - else: - print('Read data: start') - - A_T = scipy.sparse.load_npz('A_T.npz') - A_u_A = scipy.sparse.load_npz('A_u.npz') - A_u_B = scipy.sparse.load_npz('A_u_B.npz') - - print('Read data: end ' + str(siz)) - - print('Spectral radius computation') - - n_omega = 201 - n_power = 100 - omegas = np.linspace(0., 2., n_omega) - - n_omega_per_MPI = int(np.floor(float(n_omega) / siz)) - my_first_i = n_omega_per_MPI * rank - my_last_i = my_first_i + n_omega_per_MPI - n_my_data = my_last_i-my_first_i - - omegas_tmp = omegas[my_first_i:my_last_i] - - rho_u_A = np.ones((n_omega, 1)) - rho_u_B = np.ones((n_omega, 1)) - rho_T = np.zeros((n_omega, 1)) - - rho_u_A_tmp = spectral_radii(A_u_A, omegas_tmp, n_power=n_power) - rho_u_B_tmp = spectral_radii(A_u_B, omegas_tmp, n_power=n_power) - rho_T_tmp = spectral_radii(A_T, omegas_tmp, n_power=n_power) - - if rank == 0: - np.savetxt('omegas_'+str(rank)+'.txt', omegas_tmp) - np.savetxt('rho_T_'+str(rank)+'.txt', rho_T_tmp) - np.savetxt('rho_u_'+str(rank)+'_A.txt', rho_u_A_tmp) - np.savetxt('rho_u_'+str(rank)+'_B.txt', rho_u_B_tmp) - - if n_my_data > 1: - for j in range(0, n_my_data): - rho_u_A[my_first_i+j] = rho_u_A_tmp[j] - rho_u_B[my_first_i+j] = rho_u_B_tmp[j] - rho_T[my_first_i+j] = rho_T_tmp[j] - else: - rho_u_A[my_first_i] = rho_u_A_tmp - rho_u_B[my_first_i] = rho_u_B_tmp - rho_T[my_first_i] = rho_T_tmp - - for i in range(1, siz): - first_i = n_omega_per_MPI * i - last_i = first_i + n_omega_per_MPI - - n_data = last_i-first_i - - data = comm.recv(source=i, tag=11) - - if n_data > 1: - for j in range(0, n_data): - rho_u_A[first_i+j] = data[j] - else: - rho_u_A[first_i] = data - - data = comm.recv(source=i, tag=11) - - if n_data > 1: - for j in range(0, n_data): - rho_u_B[first_i+j] = data[j] - else: - rho_u_B[first_i] = data - - data = comm.recv(source=i, tag=11) - - if n_data > 1: - for j in range(0, n_data): - rho_T[first_i+j] = data[j] - else: - rho_T[first_i] = data - else: - np.savetxt('omegas_'+str(rank)+'.txt', omegas_tmp) - np.savetxt('rho_T_'+str(rank)+'.txt', rho_T_tmp) - np.savetxt('rho_u_'+str(rank)+'_A.txt', rho_u_A_tmp) - np.savetxt('rho_u_'+str(rank)+'_B.txt', rho_u_B_tmp) - comm.send(rho_u_A_tmp, dest=0, tag=11) - comm.send(rho_u_B_tmp, dest=0, tag=11) - comm.send(rho_T_tmp, dest=0, tag=11) - - if rank == 0: - print(omegas) - print(rho_T) - print(rho_u_A) - print(rho_u_B) - - np.savetxt('omegas.txt', omegas) - np.savetxt('rho_T.txt', rho_T) - np.savetxt('rho_u_A.txt', rho_u_A) - np.savetxt('rho_u_B.txt', rho_u_B) - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/UQ/GS_2.py b/katoptron/Juelich/UQ/GS_2.py deleted file mode 100644 index ca05f675..00000000 --- a/katoptron/Juelich/UQ/GS_2.py +++ /dev/null @@ -1,198 +0,0 @@ -import numpy - -from katoptron.eigenvalues import * -from scipy.sparse import eye -import matplotlib.pyplot as plt -import scipy - -import katoptron.utilities as u - - -def spectral_radii_bound(A, omega_min=0., omega_max=2., n_omega=100): - from scipy.sparse import tril - from scipy.sparse import triu - from scipy.sparse import eye - from scipy.sparse import diags - from scipy.sparse import issparse - - omegas = np.linspace(omega_min, omega_max, n_omega) - rhos = np.ones((n_omega, )) - - Adiag = A.diagonal() - - invD = diags(1. / Adiag, 0) - - scaled_A = invD * A - - L = -tril(scaled_A, -1) - U = -triu(scaled_A, 1) - - n = A.shape[0] - - #n = 100 - - l_n = np.zeros((n, )) - u_n = np.zeros((n, )) - - l_2n = np.zeros((n, n - 1)) - u_2n = np.zeros((n, n - 1)) - - T_l_n = np.zeros((n, )) - T_u_n = np.zeros((n, )) - L_abs = np.abs(L) - U_abs = np.abs(U) - - l_n = L_abs.sum(axis=1) - u_n = U_abs.sum(axis=1) - - T_l_n = L_abs.max(axis=1) - T_u_n = U_abs.max(axis=1) - - if np.max(l_n) > 1: - print('error') - return omegas, rhos - if np.max(T_l_n) > 1: - print('error') - return omegas, rhos - ''' - for i in range(0,n): - print i - print n - tmp = L.getrow(i) - T_l_n[i] = np.max(np.abs(tmp)) - tmp = U.getrow(i) - T_l_n[i] = np.max(np.abs(tmp)) - ''' - - for i in range(0, n): - for j in range(0, i): - u_2n[i, j] = u_n[i] + u_n[j] - l_2n[i, j] = l_n[i] + l_n[j] - for j in range(i + 1, n): - u_2n[i, j - 1] = u_n[i] + u_n[j] - l_2n[i, j - 1] = l_n[i] + l_n[j] - - for omega_i in range(0, n_omega): - omega = omegas[omega_i] - - tmp_1 = np.divide(2 * np.abs(1 - omega) + omega * u_2n, - 2. - omega * l_2n) - - max_1 = np.amax(tmp_1) - - tmp_2 = np.zeros((n, )) - for i in range(0, n): - scalar_1 = ((np.abs(1 - omega) + omega * u_n[i]) / (1 - - omega * l_n[i])) - scalar_2 = ((np.abs(1 - omega)) / (1 - omega * T_u_n[i])) - scalar_3 = np.abs(1 - omega) + omega * u_n[i] - scalar_4 = np.max([scalar_2, scalar_3]) - tmp_2[i] = np.min([scalar_1, scalar_4]) - - max_2 = np.max(tmp_2) - - rhos[i] = np.max([max_1, max_2]) - - return omegas, rhos - - -def is_Z_matrix(A): - from scipy.sparse import diags - Adiag = A.diagonal() - - D = diags(Adiag, 0) - - Aoff = A - D - - max_row = Aoff.max(axis=1) - - if np.max(max_row) <= 0: - return True - else: - return False - - -def is_M_matrix(A): - is_Z = is_Z_matrix(A) - if not is_Z: - return False - is_spd = is_SPD(A) - - return is_spd - - -def spectral_radii(A, omegas, n_power=10): - from scipy.sparse import tril - from scipy.sparse import triu - from scipy.sparse import eye - from scipy.sparse import diags - from scipy.sparse import issparse - - n_omega = len(omegas) - rhos = np.ones((n_omega, )) - - E = -tril(A, -1) - F = -triu(A, 1) - invD = diags(1. / A.diagonal(), 0) - n = A.shape[0] - I = eye(n) - - for omega_i in range(0, n_omega): - #print omega_i - omega = omegas[omega_i] - if omega == 0. or omega == 2.: - rhos[omega_i] = 1. - else: - N = I - omega * invD * E - M = (1. - omega) * I + omega * invD * F - rhos[omega_i] = np.min([gen_power_method(M, N, n=n_power), 1.]) - - #print rhos - - return rhos - - -def main(): - comm, rank, siz = u.import_MPI() - - post_process = True - - base_dir = '/Users/kimliegeois/Desktop/preload/katoptron_tests_1_cube_tet_block_5/1/' - - A = read_mm(base_dir+'A_mm_after_bc.txt', -1) - A_u = read_mm(base_dir+'A_00_mm.txt', -1, True, True, False) - A_T = read_mm(base_dir+'A_11_mm.txt', -1, True, True, True) - - B = jacobi_iteration_matrix(A) - B_u = jacobi_iteration_matrix(get_symmetrical_part(A_u)) - B_T = jacobi_iteration_matrix(A_T) - - sp = spectral_radius(B) - sp_u = spectral_radius(B_u) - sp_T = spectral_radius(B_T) - - A_u_f = A_u.todense() - index = np.array([3, 4, 5, 15, 16, 17, 18, 19, 20, 21, 22, 23]) - # => rho = 0.875 (sum off diag = 1.8904321, diag = 2.16049383) nu = 0.2 - index = np.array([3, 15, 18, 21]) - index = np.array([4, 16, 19, 22]) # => rho = 0.875 - # index = np.array([5,17,20,23]) #=> rho = 0.4285714285714285 nu = 0.2 - # => rho = .3035714285714295 (sum off diag = 3.2793209800000005, diag = 2.16049383) nu = 0.2 - index = np.array([3, 4, 15, 16, 18, 19, 21, 22]) - # if nu = 0 OK! rho(B_u) = 0.8125 - A_u_f_1 = A_u_f[index, :] - A_u_f_2 = A_u_f_1[:, index] - print(A_u_f_2) - print(sp) - print(sp_u) - print(sp_T) - - B_u = jacobi_iteration_matrix(scipy.sparse.csr_matrix(A_u_f_2)) - - print(B_u.todense()) - sp_u = spectral_radius(B_u) - print(sp_u) - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/UQ/__init__.py b/katoptron/Juelich/UQ/__init__.py deleted file mode 100644 index e8aed8a0..00000000 --- a/katoptron/Juelich/UQ/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf-8 -*- -# katoptron.Juelich.post_process MODULE initialization file diff --git a/katoptron/Juelich/UQ/copulas.py b/katoptron/Juelich/UQ/copulas.py deleted file mode 100644 index 118c368d..00000000 --- a/katoptron/Juelich/UQ/copulas.py +++ /dev/null @@ -1,12 +0,0 @@ - -from scipy.stats import lognorm -import numpy as np - - -def lognormal(points, means, sigmas): - randomVariable = np.zeros(points.shape) - for i in range(0, points.shape[0]): - randomVariable[i, :] = lognorm.ppf(points[i, :], - sigmas[i], - scale=np.exp(means[i])) - return randomVariable diff --git a/katoptron/Juelich/UQ/halton.py b/katoptron/Juelich/UQ/halton.py deleted file mode 100644 index 0fc60976..00000000 --- a/katoptron/Juelich/UQ/halton.py +++ /dev/null @@ -1,392 +0,0 @@ -def halton ( i, m ): - -#*****************************************************************************80 -# -## HALTON computes an element of a Halton sequence. -# -# Licensing: -# -# This code is distributed under the GNU LGPL license. -# -# Modified: -# -# 10 August 2016 -# -# Author: -# -# John Burkardt -# -# Reference: -# -# John Halton, -# On the efficiency of certain quasi-random sequences of points -# in evaluating multi-dimensional integrals, -# Numerische Mathematik, -# Volume 2, pages 84-90, 1960. -# -# Parameters: -# -# Input, integer I, the index of the element of the sequence. -# 0 <= I. -# -# Input, integer M, the spatial dimension. -# 1 <= M <= 1600. -# -# Output, real R(M), the element of the sequence with index I. -# - import numpy as np - - i = int ( i ) - - t = np.ones ( m ) - - t = i * t -# -# Carry out the computation. -# - prime_inv = np.zeros ( m ) - for j in range ( 0, m ): - prime_inv[j] = 1.0 / float ( prime ( j ) ) - - r = np.zeros ( m ) - - while ( 0 < np.sum ( t ) ): - for j in range ( 0, m ): - d = ( t[j] % prime ( j ) ) - r[j] = r[j] + float ( d ) * prime_inv[j] - prime_inv[j] = (prime_inv[j] / prime ( j )) - t[j] = ( t[j] // prime ( j ) ) - - return r - -def halton_base ( i, m, b ): - -#*****************************************************************************80 -# -## HALTON_BASE computes an element of a Halton sequence with user bases. -# -# Licensing: -# -# This code is distributed under the GNU LGPL license. -# -# Modified: -# -# 11 August 2016 -# -# Author: -# -# John Burkardt -# -# Reference: -# -# John Halton, -# On the efficiency of certain quasi-random sequences of points -# in evaluating multi-dimensional integrals, -# Numerische Mathematik, -# Volume 2, pages 84-90, 1960. -# -# Parameters: -# -# Input, integer I, the index of the element of the sequence. -# 0 <= I. -# -# Input, integer M, the spatial dimension. -# -# Input, integer B(M), the bases to use for each dimension. -# -# Output, real R(M), the element of the sequence with index I. -# - import numpy as np - - i = int ( i ) - - t = np.ones ( m ) - - t = i * t -# -# Carry out the computation. -# - b_inv = np.zeros ( m ) - for j in range ( 0, m ): - b_inv[j] = 1.0 / b[j] - - r = np.zeros ( m ) - - while ( 0 < np.sum ( t ) ): - for j in range ( 0, m ): - d = ( t[j] % b[j] ) - r[j] = r[j] + float ( d ) * b_inv[j] - b_inv[j] = (b_inv[j] / b[j]) - t[j] = ( t[j] // b[j] ) - - return r - -def halton_inverse ( r, m ): - -#*****************************************************************************80 -# -## HALTON_INVERSE inverts an element of the Halton sequence. -# -# Licensing: -# -# This code is distributed under the GNU LGPL license. -# -# Modified: -# -# 10 August 2016 -# -# Author: -# -# John Burkardt -# -# Parameters: -# -# Input, real R(M), the I-th element of the Halton sequence. -# 0 <= R < 1.0 -# -# Input, integer M, the spatial dimension. -# -# Output, integer I, the index of the element of the sequence. -# - import numpy as np - from sys import exit - - for j in range ( 0, m ): - if ( r[j] < 0.0 or 1.0 <= r[j] ): - print ( '' ) - print ( 'HALTON_INVERSE - Fatal error!' ) - print ( ' 0 <= R < 1.0 is required.' ) - exit ( 'HALTON_INVERSE - Fatal error!' ) -# -# Compute the index based on the first component, -# because base 2 is reliable. -# - t = r[0] - i = 0 - p = 1 - - while ( t != 0 ): - t = t * 2.0 - d = np.floor ( t ) - i = i + d * p - p = p * 2 - t = t - d - - return i - -def prime ( n ): - -#*****************************************************************************80 -# -## PRIME returns returns any of the first PRIME_MAX prime numbers. -# -# Discussion: -# -# PRIME_MAX is 1600, and the largest prime stored is 13499. -# -# Thanks to Bart Vandewoestyne for pointing out a typo, 18 February 2005. -# -# Licensing: -# -# This code is distributed under the GNU LGPL license. -# -# Modified: -# -# 05 December 2014 -# -# Author: -# -# John Burkardt -# -# Reference: -# -# Milton Abramowitz and Irene Stegun, -# Handbook of Mathematical Functions, -# US Department of Commerce, 1964, pages 870-873. -# -# Daniel Zwillinger, -# CRC Standard Mathematical Tables and Formulae, -# 30th Edition, -# CRC Press, 1996, pages 95-98. -# -# Parameters: -# -# Input, integer N, the index of the desired prime number. -# In general, is should be true that 0 <= N < PRIME_MAX. -# -# Output, integer P, the N-th prime. -# - import numpy as np - from sys import exit - - prime_max = 1600 - - prime_vector = np.array ( [ - 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, \ - 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, \ - 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, \ - 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, \ - 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, \ - 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, \ - 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, \ - 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, \ - 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, \ - 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, \ - 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, \ - 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, \ - 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, \ - 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, \ - 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, \ - 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, \ - 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, \ - 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, \ - 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, \ - 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, \ - 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, \ - 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, \ - 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, \ - 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, \ - 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, \ - 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, \ - 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, \ - 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, \ - 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, \ - 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, \ - 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, \ - 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, \ - 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, \ - 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, \ - 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, \ - 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, \ - 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, \ - 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, \ - 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, \ - 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, \ - 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, \ - 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, \ - 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, \ - 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, \ - 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, \ - 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, \ - 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, \ - 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, \ - 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, \ - 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, \ - 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, \ - 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, \ - 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, \ - 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, \ - 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, \ - 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, \ - 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, \ - 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, \ - 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, \ - 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, \ - 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, \ - 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, \ - 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, \ - 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, \ - 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, \ - 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, \ - 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, \ - 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, \ - 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, \ - 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, \ - 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, \ - 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, \ - 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, \ - 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, \ - 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, \ - 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, \ - 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, \ - 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, \ - 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, \ - 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, \ - 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, \ - 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, \ - 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, \ - 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, \ - 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, \ - 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, \ - 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, \ - 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, \ - 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, \ - 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, \ - 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, \ - 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, \ - 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, \ - 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, \ - 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, \ - 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, \ - 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, \ - 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, \ - 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, \ - 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, \ - 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, \ - 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, \ - 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, \ - 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, \ - 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, \ - 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, \ - 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, \ - 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, \ - 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, \ - 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, \ - 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, \ - 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, \ - 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, \ - 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, \ - 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, \ - 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, \ - 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, \ - 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, \ - 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, \ - 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, \ - 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, \ - 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, \ - 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973,10007, \ - 10009,10037,10039,10061,10067,10069,10079,10091,10093,10099, \ - 10103,10111,10133,10139,10141,10151,10159,10163,10169,10177, \ - 10181,10193,10211,10223,10243,10247,10253,10259,10267,10271, \ - 10273,10289,10301,10303,10313,10321,10331,10333,10337,10343, \ - 10357,10369,10391,10399,10427,10429,10433,10453,10457,10459, \ - 10463,10477,10487,10499,10501,10513,10529,10531,10559,10567, \ - 10589,10597,10601,10607,10613,10627,10631,10639,10651,10657, \ - 10663,10667,10687,10691,10709,10711,10723,10729,10733,10739, \ - 10753,10771,10781,10789,10799,10831,10837,10847,10853,10859, \ - 10861,10867,10883,10889,10891,10903,10909,10937,10939,10949, \ - 10957,10973,10979,10987,10993,11003,11027,11047,11057,11059, \ - 11069,11071,11083,11087,11093,11113,11117,11119,11131,11149, \ - 11159,11161,11171,11173,11177,11197,11213,11239,11243,11251, \ - 11257,11261,11273,11279,11287,11299,11311,11317,11321,11329, \ - 11351,11353,11369,11383,11393,11399,11411,11423,11437,11443, \ - 11447,11467,11471,11483,11489,11491,11497,11503,11519,11527, \ - 11549,11551,11579,11587,11593,11597,11617,11621,11633,11657, \ - 11677,11681,11689,11699,11701,11717,11719,11731,11743,11777, \ - 11779,11783,11789,11801,11807,11813,11821,11827,11831,11833, \ - 11839,11863,11867,11887,11897,11903,11909,11923,11927,11933, \ - 11939,11941,11953,11959,11969,11971,11981,11987,12007,12011, \ - 12037,12041,12043,12049,12071,12073,12097,12101,12107,12109, \ - 12113,12119,12143,12149,12157,12161,12163,12197,12203,12211, \ - 12227,12239,12241,12251,12253,12263,12269,12277,12281,12289, \ - 12301,12323,12329,12343,12347,12373,12377,12379,12391,12401, \ - 12409,12413,12421,12433,12437,12451,12457,12473,12479,12487, \ - 12491,12497,12503,12511,12517,12527,12539,12541,12547,12553, \ - 12569,12577,12583,12589,12601,12611,12613,12619,12637,12641, \ - 12647,12653,12659,12671,12689,12697,12703,12713,12721,12739, \ - 12743,12757,12763,12781,12791,12799,12809,12821,12823,12829, \ - 12841,12853,12889,12893,12899,12907,12911,12917,12919,12923, \ - 12941,12953,12959,12967,12973,12979,12983,13001,13003,13007, \ - 13009,13033,13037,13043,13049,13063,13093,13099,13103,13109, \ - 13121,13127,13147,13151,13159,13163,13171,13177,13183,13187, \ - 13217,13219,13229,13241,13249,13259,13267,13291,13297,13309, \ - 13313,13327,13331,13337,13339,13367,13381,13397,13399,13411, \ - 13417,13421,13441,13451,13457,13463,13469,13477,13487,13499 ] ) - - if ( n < 0 or prime_max <= n ): - print ( '' ) - print ( 'PRIME - Fatal error!' ) - print ( ' 0 <= N < %d' % ( prime_max ) ) - exit ( 'PRIME - Fatal error!' ) - - return prime_vector[n] \ No newline at end of file diff --git a/katoptron/Juelich/UQ/kde.py b/katoptron/Juelich/UQ/kde.py deleted file mode 100644 index bec1e921..00000000 --- a/katoptron/Juelich/UQ/kde.py +++ /dev/null @@ -1,70 +0,0 @@ - -import numpy as np -import matplotlib.pyplot as plt -import scipy.stats as st - - -def compute_kde(A): - # Take a 2D array of m x n entries where n is the number of samples - # and m the number of QoI - - kernel = st.gaussian_kde(A) - return kernel - - -def resample_kde(kernel, n_samples): - # Sample the QoI based on the estimated pdf - - samples = kernel.resample(size=n_samples) - return samples - - -def box_prob_MC(kernel, min_bounds, max_bounds, n_samples): - # Evaluate the probability to be in a box - - samples = resample_kde(kernel, n_samples) - - insamples = np.ones((n_samples,)) - for j in range(0, n_samples): - for i in range(0, len(min_bounds)): - insamples[j] = bool(insamples[j]) & ( - samples[i, j] >= min_bounds[i]) & (samples[i, j] <= max_bounds[i]) - - prob = np.sum(insamples)/float(n_samples) - - return prob - - -def plot_kde(kernel, xbounds, ybounds, fixed_values, random_index): - - xx, yy = np.mgrid[xbounds[0]:xbounds[1]:100j, ybounds[0]:ybounds[1]:100j] - - positions_x = xx.ravel() - positions_y = yy.ravel() - - positions = np.zeros((len(fixed_values)+2, len(positions_x))) - - fixed_i = 0 - - for i in range(0, positions.shape[0]): - if i == random_index[0]: - positions[i, :] = positions_x - elif i == random_index[1]: - positions[i, :] = positions_y - else: - positions[i, :] = fixed_values[fixed_i] * \ - np.ones(positions[i, :].shape) - fixed_i = fixed_i + 1 - - f = np.reshape(kernel(positions).T, xx.shape) - - fig = plt.figure(figsize=(8, 8)) - ax = fig.gca() - ax.set_xlim(xbounds[0], xbounds[1]) - ax.set_ylim(ybounds[0], ybounds[1]) - cfset = ax.contourf(xx, yy, f, cmap='coolwarm') - ax.imshow(np.rot90(f), cmap='coolwarm', extent=[ - xbounds[0], xbounds[1], ybounds[0], ybounds[1]]) - cset = ax.contour(xx, yy, f, colors='k') - ax.clabel(cset, inline=1, fontsize=10) - return fig, ax diff --git a/katoptron/Juelich/UQ/mirror.py b/katoptron/Juelich/UQ/mirror.py deleted file mode 100644 index 5a79cdaf..00000000 --- a/katoptron/Juelich/UQ/mirror.py +++ /dev/null @@ -1,605 +0,0 @@ - - - - - -import numpy as np -import matplotlib.pyplot as plt -from mpl_toolkits.mplot3d import axes3d -import matplotlib.tri as mtri - -from katoptron.Juelich.UQ.kde import * -import katoptron.utilities as u - - -def convergence_qoi(qoi): - mean_qoi = np.zeros((len(qoi), )) - for i in range(0, len(qoi)): - mean_qoi[i] = np.mean(qoi[0:i]) - return mean_qoi - - -def compute_qoi(base_dir, ensemble_size, ensemble_index, l): - OAX, OAY = 0.0595, 0.017 - npzfile = np.load(base_dir + str(ensemble_size) + '/' + - str(ensemble_index) + '/mirror_data_all.npz') - x = npzfile['x'] - y = npzfile['y'] - z = 0. * x - dz = npzfile['dz'] - T = npzfile['T'] - tri = npzfile['tri'] - optical_coefficients, dz_residual = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz[:, l], "m", np.array([OAX, OAY])) - print(optical_coefficients) - return [ - np.max(T[:, l]), - np.min(T[:, l]), - np.mean(T[:, l]), 1000 * np.mean(dz[:, l]), optical_coefficients[0], - optical_coefficients[1], optical_coefficients[2], - optical_coefficients[3], optical_coefficients[4] - ] # optical_coefficients[0]] - - -def irregularly_plot(x, - y, - z, - x_min, - x_max, - y_min, - y_max, - ngridx=400, - ngridy=400, - scale=1): - - xi = np.linspace(x_min, x_max, ngridx) - yi = np.linspace(y_min, y_max, ngridy) - - triang = mtri.Triangulation(x, y) - interpolator = mtri.LinearTriInterpolator(triang, z) - Xi, Yi = np.meshgrid(xi, yi) - zi = interpolator(Xi, Yi) - - #fig = plt.figure() - #ax = fig.gca(projection='3d') - #ax.plot_surface(Xi, Yi, zi, cmap='jet',vmin=np.amin(z),vmax=np.amax(z)) - #ax.scatter(x,y,z) - - fig = plt.figure() - ax = fig.gca() - levels = np.linspace(np.amin(z * scale), - np.amax(z * scale), - 16, - endpoint=True) - - cf = ax.contourf(Xi, Yi, zi * scale, levels, cmap="jet") - ax.contour(xi, yi, zi * scale, levels, linewidths=0.5, colors='k') - ax.set_aspect('equal') - - cbar = fig.colorbar(cf, ticks=levels) - - return fig, cbar - - -def irregularly_tol_plot(x, - y, - QoI, - x_min, - x_max, - y_min, - y_max, - ngridx=200, - ngridy=200, - scale=1.): - - xi = np.linspace(x_min, x_max, ngridx) - yi = np.linspace(y_min, y_max, ngridy) - - triang = mtri.Triangulation(x, y) - interpolator_0 = mtri.LinearTriInterpolator(triang, QoI[0, :]) - interpolator_1 = mtri.LinearTriInterpolator(triang, QoI[1, :]) - interpolator_2 = mtri.LinearTriInterpolator(triang, QoI[2, :]) - interpolator_3 = mtri.LinearTriInterpolator(triang, QoI[3, :]) - interpolator_4 = mtri.LinearTriInterpolator(triang, QoI[4, :]) - - Xi, Yi = np.meshgrid(xi, yi) - - z_0 = interpolator_0(Xi, Yi) - z_1 = interpolator_1(Xi, Yi) - z_2 = interpolator_2(Xi, Yi) - z_3 = interpolator_3(Xi, Yi) - z_4 = interpolator_4(Xi, Yi) - - z_5 = np.copy(z_0) - - for i in range(0, z_0.shape[0]): - for j in range(0, z_0.shape[1]): - if np.isfinite(z_0[i, j]): - z_5[i, j] = u.check_optical_tolerance( - [z_0[i, j], z_1[i, j], z_2[i, j], z_3[i, j], z_4[i, j]], - "mm", - scale=scale) - else: - z_5[i, j] = z_0[i, j] - - #fig = plt.figure() - #ax = fig.gca(projection='3d') - #ax.plot_surface(Xi, Yi, zi, cmap='jet',vmin=np.amin(z),vmax=np.amax(z)) - #ax.scatter(x,y,z) - - fig = plt.figure() - ax = fig.gca() - levels = np.linspace(0., 1., 3, endpoint=True) - - cf = ax.contourf(Xi, Yi, z_5, levels, cmap="jet") - ax.contour(xi, yi, z_5, levels, linewidths=0.5, colors='k') - ax.set_aspect('equal') - - cbar = fig.colorbar(cf, ticks=levels) - - -def clip_scater(x, y, z, x_lim, y_lim, z_lim): - x_new = np.array([]) - y_new = np.array([]) - z_new = np.array([]) - for i in np.arange(len(x)): - if x[i] >= x_lim[0] and x[i] <= x_lim[1] and y[i] >= y_lim[0] and y[ - i] <= y_lim[1] and z[i] >= z_lim[0] and z[i] <= z_lim[1]: - x_new = np.append(x_new, x[i]) - y_new = np.append(y_new, y[i]) - z_new = np.append(z_new, z[i]) - return x_new, y_new, z_new - - -def plot_kde_2D(x, y, x_min, x_max, y_min, y_max, ngridx=200, ngridy=200): - - xi = np.linspace(x_min, x_max, ngridx) - yi = np.linspace(y_min, y_max, ngridy) - - xx, yy = np.meshgrid(xi, yi) - positions = np.vstack([xx.ravel(), yy.ravel()]) - values = np.vstack([x, y]) - kernel = st.gaussian_kde(values) - f = np.reshape(kernel(positions).T, xx.shape) - - fig = plt.figure() - ax = fig.gca() - ax.set_xlim(x_min, x_max) - ax.set_ylim(y_min, y_max) - - levels = np.linspace(np.amin(f), np.amax(f), 16, endpoint=True) - - # Contourf plot - cfset = ax.contourf(xx, yy, f, levels, cmap='Blues') - ## Or kernel density estimate plot instead of the contourf plot - #ax.imshow(np.rot90(f), cmap='Blues', extent=[xmin, xmax, ymin, ymax]) - # Contour plot - cset = ax.contour(xx, yy, f, levels, linewidths=0.5, colors='k') - # Label plot - # ax.clabel(cset, inline=1, fontsize=10) - plt.xlabel('Heat conductivity spacer 1 $[$W/mK$]$') - plt.ylabel('Heat conductivity spacer 2 $[$W/mK$]$') - #plt.plot(345,345,'+') - ax.set_aspect('equal') - cbar = fig.colorbar(cfset, ticks=levels) - cbar.set_label('pdf $[m^2K^2/W^2]$') - plt.savefig("kde.pdf", dpi=100) - - -def plot_kde_1D(qoi, id, xlabel, ylabel, x_min, x_max, nx=200): - - min_qoi = x_min - max_qoi = x_max - - kernel = compute_kde(qoi) - - qoi_lin = np.linspace(min_qoi, max_qoi, nx) - plt.figure() - plt.plot(qoi_lin, kernel(qoi_lin)) - plt.xlabel(xlabel) - plt.ylabel(ylabel) - plt.savefig('kde_' + id + '.pdf', dpi=100) - - -def main(): - - N = 640 - base_dir = '/Users/kimliegeois/Desktop/QoI_results_27/' - ensemble_size = 1 - - N = 640 - base_dir = '/Users/kimliegeois/Desktop/QoI_results_2_AlN/' - ensemble_size = 16 - - N = 453 - base_dir = '/Users/kimliegeois/Desktop/QoI_results_3/' - ensemble_size = 1 - - N = 453 - base_dir = '/Volumes/HD_SONY/Thesis/Juelich/all_results_NER/' - ensemble_size = 1 - data_name = 'qois_xiao_2.data' - - N = 79 - base_dir = '/Users/kimliegeois/Desktop/Juelich/order_2_30/order_20/' - ensemble_size = 1 - data_name = 'A2_xiao_20.data' - - N = 79 - base_dir = '/Users/kimliegeois/Desktop/Juelich/ER/MPI_2/' - ensemble_size = 1 - data_name = 'B2_xiao_20.data' - - #N = 3200 - #base_dir = '/Volumes/HD_SONY/juelich/k_conductivity/QoI_results_8/' - #ensemble_size = 32 - - n_qoi = 10 - n_rand = 3 - - optical_coefficients_all = np.zeros((n_qoi, N)) - random_variables = np.zeros((n_rand, N)) - - x = random_variables[0, :] - y = random_variables[2, :] - - for i in range(0, n_rand): - filename = base_dir + 'randomVariable_' + str(i + 1) + '.txt' - tmp = np.loadtxt(filename) - #print tmp[2741] - random_variables[i, :] = tmp[0:N] - - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - for l in range(0,ensemble_size): - filename = base_dir+str(ensemble_size)+'/'+str(ensemble_index)+'/mirror_optical_results_'+str(l)+'.npz' - npzfile = np.load(filename) - optical_coefficients = npzfile['optical_coefficients'] - optical_coefficients_all[0:9,ensemble_index*ensemble_size+l] = compute_qoi(base_dir,ensemble_size,ensemble_index,l) #optical_coefficients - #optical_coefficients_all[4:9,ensemble_index*ensemble_size+l] = optical_coefficients - optical_coefficients_all[9,ensemble_index*ensemble_size+l] = u.check_optical_tolerance(optical_coefficients_all[4:9,ensemble_index*ensemble_size+l], "mm", max_fringe = 0.0056) - np.save(data_name,optical_coefficients_all) - - optical_coefficients_all = np.load(data_name + '.npy') - optical_coefficients_all_1 = np.copy(optical_coefficients_all) - print(optical_coefficients_all_1) - print(optical_coefficients_all_1.shape) - ''' - ensemble_size = 8 - - N_ensemble = N / ensemble_size - for ensemble_index in range(0, N_ensemble): - print ensemble_index - for l in range(0,ensemble_size): - filename = base_dir+str(ensemble_size)+'/'+str(ensemble_index)+'/mirror_optical_results_'+str(l)+'.npz' - npzfile = np.load(filename) - optical_coefficients = npzfile['optical_coefficients'] - optical_coefficients_all[:,ensemble_index*ensemble_size+l] = compute_qoi(base_dir,ensemble_size,ensemble_index,l) #optical_coefficients - - optical_coefficients_all_8 = np.copy(optical_coefficients_all) - - - print optical_coefficients_all_1 - print optical_coefficients_all_8 - - print optical_coefficients_all_8-optical_coefficients_all_1 - print (optical_coefficients_all_8-optical_coefficients_all_1)/optical_coefficients_all_1 - ''' - - qoi = optical_coefficients_all_1[0, :] - - kernel = compute_kde(qoi) - - T = np.linspace(100, 170, 200) - plt.figure() - plt.plot(T, kernel(T)) - #plt.show() - - print('-----') - print(np.mean(qoi)) - #print np.mean(qoi[random_variables[0,:]<=random_variables[1,:]]) - #print np.mean(qoi[random_variables[0,:]>random_variables[1,:]]) - print('-----') - - mean_qoi = convergence_qoi(qoi) - plt.figure() - plt.plot(mean_qoi - mean_qoi[-1]) - - qoi = optical_coefficients_all_1[3, :] - - print(np.min(qoi)) - print(np.max(qoi)) - - kernel = compute_kde(qoi) - - max_dz = np.linspace(0.000135, 0.00015, 200) - plt.figure() - plt.plot(max_dz, kernel(max_dz)) - max_dz = np.linspace(0.000145, 0.00015, 100) - ax = plt.gca() - ax.fill_between(max_dz, - 0, - kernel(max_dz), - facecolor='red', - interpolate=True) - - print('-----') - print(np.mean(qoi)) - #print np.mean(qoi[random_variables[0,:]<=random_variables[1,:]]) - #print np.mean(qoi[random_variables[0,:]>random_variables[1,:]]) - print('-----') - - mean_qoi = convergence_qoi(qoi) - plt.figure() - plt.plot(mean_qoi - mean_qoi[-1]) - - print(np.sum(kernel(max_dz)) * (max_dz[1] - max_dz[0])) - #plot_kde(kernel,[370,380],[330,340],[],[0,1]) - ''' - ensemble_size = 1 - ensemble_index = 3 - for i in range(0, 8): - npzfile = np.load(base_dir+str(ensemble_size)+'/'+str(ensemble_index)+'/mirror_data_' + str(i) + '.npz') - x_i = npzfile['x'] - y_i = npzfile['y'] - z_i = 0. * x_i - dz_i = npzfile['dz'] - tri_i = npzfile['tri'] - if i == 0: - x = x_i - y = y_i - z = z_i - dz = dz_i - tri = tri_i - nNodes = len(x) - else: - x = np.append(x, x_i, axis=0) - y = np.append(y, y_i, axis=0) - z = np.append(z, z_i, axis=0) - dz = np.append(dz, dz_i, axis=0) - tri = np.append(tri, tri_i + nNodes, axis=0) - nNodes = len(x) - x_1_0 = dz[:,0] - ensemble_size = 8 - ensemble_index = 0 - for i in range(0, 8): - npzfile = np.load(base_dir+str(ensemble_size)+'/'+str(ensemble_index)+'/mirror_data_' + str(i) + '.npz') - x_i = npzfile['x'] - y_i = npzfile['y'] - z_i = 0. * x_i - dz_i = npzfile['dz'] - tri_i = npzfile['tri'] - if i == 0: - x = x_i - y = y_i - z = z_i - dz = dz_i - tri = tri_i - nNodes = len(x) - else: - x = np.append(x, x_i, axis=0) - y = np.append(y, y_i, axis=0) - z = np.append(z, z_i, axis=0) - dz = np.append(dz, dz_i, axis=0) - tri = np.append(tri, tri_i + nNodes, axis=0) - nNodes = len(x) - x_8_0 = dz[:,3] - - plt.figure() - plt.plot(x_1_0) - plt.plot(x_8_0) - - plt.figure() - plt.plot(x_1_0-x_8_0) - ''' - - #triang = mtri.Triangulation(x, y) - - plot_kde_2D(x, y, 50, 230, 50, 230, ngridx=200, ngridy=200) - - scales = np.linspace(0.2, 0.3, 20) - - for scale in scales: - #150,800,150,800 - print(x.shape) - print(y.shape) - print(optical_coefficients_all_1.shape) - irregularly_tol_plot(x, - y, - optical_coefficients_all_1[4:9, :], - 50, - 230, - 50, - 230, - ngridx=200, - ngridy=200, - scale=scale) - - plt.xlabel('Heat conductivity spacer 1 $[$W/mK$]$') - plt.ylabel('Heat conductivity spacer 2 $[$W/mK$]$') - - #plt.plot(345,345,'+') - - scale_name = str(scale).replace(".", "_") - plt.savefig('qoi_scale_' + scale_name + '.pdf', dpi=100) - - for i in range(0, n_qoi - 1): - #fig = plt.figure() - #ax = fig.gca(projection='3d') - #ax.plot_trisurf(triang, optical_coefficients_all_1[i,:], cmap='jet') - #irregularly_plot(x,y,optical_coefficients_all_1[i,:],150,1000,150,1000) - #irregularly_plot(x,y,optical_coefficients_all_1[i,:],100,800,100,800) - scale = 1 - if i == 5 or i == 6: - scale = 1000 - - fig, cbar = irregularly_plot(x, - y, - optical_coefficients_all_1[i, :], - 50, - 230, - 50, - 230, - ngridx=2000, - ngridy=2000, - scale=scale) - - plt.xlabel('Heat conductivity spacer 1 $[$W/mK$]$') - plt.ylabel('Heat conductivity spacer 2 $[$W/mK$]$') - - #plt.plot(345,345,'+') - - if i == 0: - plt.title('Maximal temperature on the mirror surface') - cbar.set_label('Temperature $[^\circ$C$]$') - id_name = 'max_temp' - xlabel = 'Temperature $[^\circ$C$]$' - ylabel = 'pdf $[1/ \,^\circ$C$]$' - x_min = 100 - x_max = 150 - if i == 1: - plt.title('Minimal temperature on the mirror surface') - cbar.set_label('Temperature $[^\circ$C$]$') - id_name = 'min_temp' - xlabel = 'Temperature $[^\circ$C$]$' - ylabel = 'pdf $[1/ \,^\circ$C$]$' - x_min = 100 - x_max = 150 - if i == 2: - plt.title('Mean temperature on the mirror surface') - cbar.set_label('Temperature $[^\circ$C$]$') - id_name = 'mean_temp' - xlabel = 'Temperature $[^\circ$C$]$' - ylabel = 'pdf $[1/ \,^\circ$C$]$' - x_min = 100 - x_max = 150 - if i == 3: - plt.title('Mean z displacement of the mirror surface') - cbar.set_label('Displacement $[$mm$]$') - id_name = 'mean_z' - xlabel = 'Displacement $[$mm$]$' - ylabel = 'pdf $[1/ mm]$' - x_min = 0.008 - x_max = 0.016 - if i == 4: - plt.title('Translation') - cbar.set_label('Displacement $[$mm$]$') - id_name = 'translation' - xlabel = 'Displacement $[$mm$]$' - ylabel = 'pdf $[1/ mm]$' - x_min = 0.024 - x_max = 0.03 - if i == 5: - plt.title('Rotation y') - cbar.set_label('$[$mrads$]$') - id_name = 'rotation_y' - xlabel = '$[$mrads$]$' - ylabel = 'pdf $[1/ mrads]$' - x_min = 0. - x_max = 0.1 - if i == 6: - plt.title('Rotation x') - cbar.set_label('$[$mrads$]$') - id_name = 'rotation_x' - xlabel = '$[$mrads$]$' - ylabel = 'pdf $[1/ mrads]$' - x_min = -0.1 - x_max = 0.01 - if i == 7: - plt.title('Curvature') - cbar.set_label('$[$mm$]$') - id_name = 'curvature' - xlabel = '$[$mm$]$' - ylabel = 'pdf $[1/ mm]$' - x_min = -0.02 - x_max = 0.01 - if i == 8: - plt.title('Irregularity') - cbar.set_label('$[$mm$]$') - id_name = 'irregularity' - xlabel = '$[$mm$]$' - ylabel = 'pdf $[1/ mm]$' - x_min = 0.004 - x_max = 0.007 - - plt.savefig("qoi_" + str(i) + ".pdf", dpi=100) - - plot_kde_1D(optical_coefficients_all_1[i, :] * scale, - id_name, - xlabel, - ylabel, - x_min, - x_max, - nx=1000) - - tmp = np.zeros((len(x), 3)) - tmp[:, 0] = x - tmp[:, 1] = y - tmp[:, 2] = optical_coefficients_all_1[i, :] - - np.savetxt("qoi_" + str(i) + ".txt", tmp) - - if i == n_qoi - 1: - radius = 578.8807505281204 - x_circle = np.linspace(130, 560, 1000) - #plt.plot(x_circle,np.sqrt(radius**2-x_circle**2)) - #ax.scatter(x, y, optical_coefficients_all_1[i,:]) - - for i in range(0, n_qoi): - fig = plt.figure() - ax = fig.gca(projection='3d') - - print('-------') - print(np.amax(optical_coefficients_all_1[i, :])) - print(np.amin(optical_coefficients_all_1[i, :])) - - #if i == n_qoi-1: - # z_max = 0.000133 - # z_min = 0.000131 - - # x_new,y_new,z_new = clip_scater(x, y, optical_coefficients_all_1[i,:],[300, 400],[300, 400],[z_min, z_max]) - #else: - x_new, y_new, z_new = x, y, optical_coefficients_all_1[i, :] - - ax.scatter(x_new, y_new, z_new) - - #if i == n_qoi-1: - # ax.set_xlim(300, 400) - # ax.set_ylim(300, 400) - # ax.set_zlim(z_min, z_max) - - #fig = plt.figure() - #ax = fig.gca(projection='3d') - #for i in range(0, 3): - # ax.plot_trisurf(triang, optical_coefficients_all_1[i,:], cmap='jet') - ''' - fig = plt.figure() - ax = fig.gca(projection='3d') - ax.scatter(optical_coefficients_all[0,:], optical_coefficients_all[1,:], optical_coefficients_all[2,:]) - fig = plt.figure() - ax = fig.gca(projection='3d') - ax.scatter(optical_coefficients_all[0,:], optical_coefficients_all[1,:], optical_coefficients_all[3,:]) - fig = plt.figure() - ax = fig.gca(projection='3d') - ax.scatter(optical_coefficients_all[0,:], optical_coefficients_all[1,:], optical_coefficients_all[4,:]) - ''' - - #kernel = compute_kde(optical_coefficients_all) - - #plot_kde(kernel,[0.0915,0.94],[1.78638639e-04,2.01983639e-04],[-5.16471018e-05,-6.05417325e-02,4.14012494e-02],[0,1]) - - qoi = optical_coefficients_all_1[-1, :] - - not_blurred = np.sum(qoi) / float(len(qoi)) - blurred = 1. - not_blurred - - print('not blurred') - print(not_blurred) - print('blurred') - print(blurred) - - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/UQ/mirror_2.py b/katoptron/Juelich/UQ/mirror_2.py deleted file mode 100644 index ac1edaee..00000000 --- a/katoptron/Juelich/UQ/mirror_2.py +++ /dev/null @@ -1,73 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt -from mpl_toolkits.mplot3d import axes3d -import matplotlib.tri as mtri - -from katoptron.Juelich.UQ.kde import * -import katoptron.utilities as u -from numpy import linalg as LA - - -def compute_qoi(base_dir, ensemble_size, ensemble_index, l): - OAX, OAY = 0.0595, 0.017 - npzfile = np.load(base_dir + str(ensemble_size) + '/' + - str(ensemble_index) + '/mirror_data_all.npz') - x = npzfile['x'] - y = npzfile['y'] - z = 0. * x - dz = npzfile['dz'] - T = npzfile['T'] - tri = npzfile['tri'] - - fig = plt.figure() - axtri = plt.tricontourf(x, y, tri, T[:, l], vmin=330., vmax=375.) - cb = fig.colorbar(axtri, orientation="horizontal") - return x, y, tri, T[:, l] - - -def main(): - - N = 8 - # '/Volumes/HD_SONY/juelich/k_conductivity/QoI_results_7/' - base_dir = '/Users/kimliegeois/Desktop/QoI_results_7/' - n_qoi = 5 - n_rand = 3 - ensemble_size = 1 - - optical_coefficients_all = np.zeros((n_qoi, N)) - random_variables = np.zeros((n_rand, N)) - - ensemble_size = 1 - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - for l in range(0, ensemble_size): - x, y, tri, dz = compute_qoi(base_dir, ensemble_size, - ensemble_index, l) - if l == 0 and ensemble_index == 0: - dz_1 = dz.reshape((len(dz), 1)) - else: - dz_1 = np.append(dz_1, dz.reshape((len(dz), 1)), axis=1) - ensemble_size = 8 - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - for l in range(0, ensemble_size): - x, y, tri, dz = compute_qoi(base_dir, ensemble_size, - ensemble_index, l) - if l == 0 and ensemble_index == 0: - dz_8 = dz.reshape((len(dz), 1)) - else: - dz_8 = np.append(dz_8, dz.reshape((len(dz), 1)), axis=1) - - for i in range(0, N): - #fig = plt.figure() - #axtri = plt.tricontourf(x, y, tri, np.abs(dz_1[:,i]-dz_8[:,i])/dz_1[:,i] ) - #cb = fig.colorbar(axtri, orientation="horizontal") - print(LA.norm(dz_1[:, i] - dz_8[:, i])) - print(LA.norm(dz_1[:, i])) - print((LA.norm(dz_1[:, i] - dz_8[:, i]) / LA.norm(dz_1[:, i]))) - print('-----') - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/UQ/mirror_PCE.py b/katoptron/Juelich/UQ/mirror_PCE.py deleted file mode 100644 index 1e01230b..00000000 --- a/katoptron/Juelich/UQ/mirror_PCE.py +++ /dev/null @@ -1,235 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt -from mpl_toolkits.mplot3d import axes3d -import matplotlib.tri as mtri -from matplotlib import cm - -import os - -from katoptron.Juelich.UQ.kde import * -import katoptron.utilities as u - -import scipy as sc - - -def build_exponents_L2(order): - exponents = np.zeros(((order + 1)**2, 2), dtype=int) - exponents[:, 0], exponents[:, 1] = np.divmod(np.arange((order + 1)**2), - order + 1) - return exponents - - -def build_exponents_L1(order): - exponents = build_exponents_L2(order) - tmp = exponents[np.where((exponents.T[0] + exponents.T[1]) <= order), :] - return tmp[0, :, :] - - -def build_PCE_system(x, - y, - weights, - exponents, - p0=np.array([0, 0]), - scale=np.array([1, 1]), - monomial=True): - n = len(x) - m = exponents.shape[0] - Z = np.zeros((n, m)) - W = np.zeros((n, n)) - - if not monomial: - u = 1. - (x - 30.) / 76. - v = -1. + (y - 30.) / 76. - - for i in range(0, m): - if monomial: - Z[:, i] = (((x - p0[0]) / scale[0]))**exponents[i, 0] * ( - ((y - p0[1]) / scale[1]))**exponents[i, 1] - else: - p_m_x = np.ones(u.shape) - index = np.argwhere(v < 1) - p_m_x[index] = ( - (2 * u[index] + v[index] + 1) / (1 - v[index])) - p_m = sc.special.eval_legendre(exponents[i, 0], p_m_x) - p_n = sc.special.eval_jacobi(exponents[i, 1], - 2 * exponents[i, 0] + 1, 0, v) - Z[:, i] = p_m * (((1 - v) / 2))**exponents[i, 0] * p_n - for i in range(0, n): - W[i, i] = weights[i] - - ZTW = Z.T.dot(W) - ZTWZ = ZTW.dot(Z) - - ZTWZinv = np.linalg.pinv(ZTWZ) - Ainv = ZTWZinv.dot(ZTW) - return Ainv - - -def evaluate_PCE(x, - y, - coefficients, - exponents, - p0=np.array([0, 0]), - scale=np.array([1, 1]), - monomial=True): - n = len(x) - m = exponents.shape[0] - z = np.zeros((n, )) - - if not monomial: - u = 1. - (x - 30.) / 76. - v = -1. + (y - 30.) / 76. - - for i in range(0, m): - if monomial: - z = z + coefficients[i] * ( - ((x - p0[0]) / scale[0]))**exponents[i, 0] * ( - ((y - p0[1]) / scale[1]))**exponents[i, 1] - else: - p_m_x = np.ones(u.shape) - index = np.argwhere(v < 1) - p_m_x[index] = ( - (2 * u[index] + v[index] + 1) / (1 - v[index])) - p_m = sc.special.eval_legendre(exponents[i, 0], p_m_x) - p_n = sc.special.eval_jacobi(exponents[i, 1], - 2 * exponents[i, 0] + 1, 0, v) - z = z + coefficients[i] * p_m * ( - ((1 - v) / 2))**exponents[i, 0] * p_n - return z - - -def triangular_mesh(n_x, n_y, x_min=30, x_max=180, y_min=30, y_max=180): - x = np.linspace(x_min, x_max, n_x, endpoint=True) - y = np.linspace(y_min, y_max, n_y, endpoint=True) - x, y = np.meshgrid(x, y) - x = x.flatten() - y = y.flatten() - - x_TRI = x[np.where(x >= y)] - y_TRI = y[np.where(x >= y)] - - tri = mtri.Triangulation(x_TRI, y_TRI) - - return x_TRI, y_TRI, tri - - -def compute_coeff(Ainv, z): - coefficients = Ainv.dot(z) - return coefficients - - -def write_patch(tri, z, filename): - f = open(filename + "_data.txt", "w+") - print("x y c", file=f) - for i in range(0, tri.triangles.shape[0]): - for j in range(0, 3): - index = tri.triangles[i, j] - print(str(tri.x[index]) + " " + str( - tri.y[index]) + " " + str(z[index]), file=f) - print(" ", file=f) - - f.close() - f = open(filename + "_range.txt", "w+") - print(np.amin(z), file=f) - print(np.amax(z), file=f) - f.close() - - -def main(): - file_dir = os.path.dirname(__file__) - - N = 20 - loaded = np.load(file_dir + '/../samples_files/Xiao_' + str(N) + '.npz') - samples = loaded['samples'] - N = samples.shape[0] - - x = samples[0:N, 0] - y = samples[0:N, 1] - weights = loaded['weights'] - - #qois = np.load('../katoptron_Juelich_UQ_mirror/qois_xiao.data.npy') - qois = np.load('../katoptron_Juelich_UQ_mirror/qois_xiao_2.data.npy') - qois = np.load('../katoptron_Juelich_UQ_mirror/A2_xiao_20.data.npy') - qois = np.load('../katoptron_Juelich_UQ_mirror/B2_xiao_20.data.npy') - - preloads_A2_N = np.loadtxt( - '../katoptron_Juelich_UQ_preload/preloads_A2_N.txt') - preloads_B2_N = np.loadtxt( - '../katoptron_Juelich_UQ_preload/preloads_B2_N.txt') - - x_0 = [30, 30] - scale = [150, 150] - - n_x = 30 - n_y = 30 - - monomial = False - - order = 10 - exponents = build_exponents_L1(order) - Ainv = build_PCE_system(x, - y, - weights, - exponents, - x_0, - scale, - monomial=monomial) - - for z_index in range(0, 9): - z = qois[z_index, :] - filename = 'qoi_' + str(z_index) - - coefficients = compute_coeff(Ainv, z) - print(len(coefficients)) - - x_PCE, y_PCE, tri = triangular_mesh(n_x, n_y) - - z_PCE = evaluate_PCE(x_PCE, - y_PCE, - coefficients, - exponents, - x_0, - scale, - monomial=monomial) - - write_patch(tri, z_PCE, filename) - - for z_index in range(0, 3): - z = preloads_A2_N[:, z_index] - filename = 'qoi_preload_A_' + str(z_index) - - coefficients = compute_coeff(Ainv, z) - print(len(coefficients)) - - x_PCE, y_PCE, tri = triangular_mesh(n_x, n_y) - - z_PCE = evaluate_PCE(x_PCE, - y_PCE, - coefficients, - exponents, - x_0, - scale, - monomial=monomial) - - write_patch(tri, -0.001 * z_PCE, filename) - z = preloads_B2_N[:, z_index] - filename = 'qoi_preload_B_' + str(z_index) - - coefficients = compute_coeff(Ainv, z) - print(len(coefficients)) - - x_PCE, y_PCE, tri = triangular_mesh(n_x, n_y) - - z_PCE = evaluate_PCE(x_PCE, - y_PCE, - coefficients, - exponents, - x_0, - scale, - monomial=monomial) - - write_patch(tri, -0.001 * z_PCE, filename) - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/UQ/mirror_PCE_convergence.py b/katoptron/Juelich/UQ/mirror_PCE_convergence.py deleted file mode 100644 index 20728794..00000000 --- a/katoptron/Juelich/UQ/mirror_PCE_convergence.py +++ /dev/null @@ -1,353 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt -from mpl_toolkits.mplot3d import axes3d -import matplotlib.tri as mtri -from matplotlib import cm - -import os - -from katoptron.Juelich.UQ.kde import * -import katoptron.utilities as u - -import scipy as sc - - -def build_exponents_L2(order): - exponents = np.zeros(((order + 1)**2, 2), dtype=int) - exponents[:, 0], exponents[:, 1] = np.divmod(np.arange((order + 1)**2), - order + 1) - return exponents - - -def build_exponents_L1(order): - exponents = build_exponents_L2(order) - tmp = exponents[np.where((exponents.T[0] + exponents.T[1]) <= order), :] - return tmp[0, :, :] - - -def build_PCE_system(x, - y, - weights, - exponents, - p0=np.array([0, 0]), - scale=np.array([1, 1]), - monomial=True): - n = len(x) - m = exponents.shape[0] - Z = np.zeros((n, m)) - W = np.zeros((n, n)) - - if not monomial: - u = 1. - (x - 30.) / 76. - v = -1. + (y - 30.) / 76. - - for i in range(0, m): - if monomial: - Z[:, i] = (((x - p0[0]) / scale[0]))**exponents[i, 0] * ( - ((y - p0[1]) / scale[1]))**exponents[i, 1] - else: - p_m_x = np.ones(u.shape) - index = np.argwhere(v < 1) - p_m_x[index] = ( - (2 * u[index] + v[index] + 1) / (1 - v[index])) - p_m = sc.special.eval_legendre(exponents[i, 0], p_m_x) - p_n = sc.special.eval_jacobi(exponents[i, 1], - 2 * exponents[i, 0] + 1, 0, v) - Z[:, i] = p_m * (((1 - v) / 2))**exponents[i, 0] * p_n - for i in range(0, n): - W[i, i] = weights[i] - - ZTW = Z.T.dot(W) - ZTWZ = ZTW.dot(Z) - - ZTWZinv = np.linalg.pinv(ZTWZ) - Ainv = ZTWZinv.dot(ZTW) - return Ainv - - -def evaluate_PCE(x, - y, - coefficients, - exponents, - p0=np.array([0, 0]), - scale=np.array([1, 1]), - monomial=True): - n = len(x) - m = exponents.shape[0] - z = np.zeros((n, )) - - if not monomial: - u = 1. - (x - 30.) / 76. - v = -1. + (y - 30.) / 76. - - for i in range(0, m): - if monomial: - z = z + coefficients[i] * ( - ((x - p0[0]) / scale[0]))**exponents[i, 0] * ( - ((y - p0[1]) / scale[1]))**exponents[i, 1] - else: - p_m_x = np.ones(u.shape) - index = np.argwhere(v < 1) - p_m_x[index] = ( - (2 * u[index] + v[index] + 1) / (1 - v[index])) - p_m = sc.special.eval_legendre(exponents[i, 0], p_m_x) - p_n = sc.special.eval_jacobi(exponents[i, 1], - 2 * exponents[i, 0] + 1, 0, v) - z = z + coefficients[i] * p_m * ( - ((1 - v) / 2))**exponents[i, 0] * p_n - return z - - -def triangular_mesh(n_x, n_y, x_min=30, x_max=180, y_min=30, y_max=180): - x = np.linspace(x_min, x_max, n_x, endpoint=True) - y = np.linspace(y_min, y_max, n_y, endpoint=True) - x, y = np.meshgrid(x, y) - x = x.flatten() - y = y.flatten() - - x_TRI = x[np.where(x >= y)] - y_TRI = y[np.where(x >= y)] - - tri = mtri.Triangulation(x_TRI, y_TRI) - - return x_TRI, y_TRI, tri - - -def compute_coeff(Ainv, z): - coefficients = Ainv.dot(z) - return coefficients - - -def write_patch(tri, z, filename): - f = open(filename + "_data.txt", "w+") - print("x y c", file=f) - for i in range(0, tri.triangles.shape[0]): - for j in range(0, 3): - index = tri.triangles[i, j] - print(str(tri.x[index]) + " " + str( - tri.y[index]) + " " + str(z[index]), file=f) - print(" ", file=f) - - f.close() - f = open(filename + "_range.txt", "w+") - print(np.amin(z), file=f) - print(np.amax(z), file=f) - f.close() - - -def compute_qoi(base_dir, ensemble_size, ensemble_index, l): - OAX, OAY = 0.0595, 0.017 - npzfile = np.load(base_dir + str(ensemble_size) + '/' + - str(ensemble_index) + '/mirror_data_all.npz') - x = npzfile['x'] - y = npzfile['y'] - z = 0. * x - dz = npzfile['dz'] - T = npzfile['T'] - tri = npzfile['tri'] - optical_coefficients, dz_residual = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz[:, l], "m", np.array([OAX, OAY])) - print(optical_coefficients) - return [ - np.max(T[:, l]), - np.min(T[:, l]), - np.mean(T[:, l]), 1000 * np.mean(dz[:, l]), optical_coefficients[0], - optical_coefficients[1], optical_coefficients[2], - optical_coefficients[3], optical_coefficients[4] - ] - - -def read_data(order, base_dir, ax, display=False): - - result_file = 'qois_' + str(order) + '.npz' - if os.path.isfile(result_file): - loaded = np.load(result_file) - qois = loaded['qois'] - samples = loaded['samples'] - weights = loaded['weights'] - if display: - #fig = plt.figure() - #ax = fig.gca(projection='3d') - ax.scatter(samples[:, 0], samples[:, 1], qois[:, -2]) - - else: - file_dir = os.path.dirname(__file__) - loaded = np.load(file_dir + '/../samples_files/Xiao_' + str(order) + - '.npz') - samples = loaded['samples'] - weights = loaded['weights'] - N = samples.shape[0] - - order_base_dir = base_dir + str(order) + '/1/' - - n_qois = 9 - - qois = np.zeros((N, n_qois)) - - for i in range(0, N): - - loaded = np.load(order_base_dir + str(i) + '/mirror_data_all.npz') - T = loaded['T'] - loaded = np.load(order_base_dir + str(i) + - '/mirror_optical_results_0.npz') - optical_coefficients = loaded['optical_coefficients'] - - #qois[i, 0] = np.min(T) - #qois[i, 1] = np.mean(T) - #qois[i, 2] = np.max(T) - #qois[i, 3:8] = optical_coefficients - - qois[i, :] = compute_qoi(base_dir + str(order) + '/', 1, i, 0) - - np.savez('qois_' + str(order), - qois=qois, - samples=samples, - weights=weights) - - return qois, samples, weights - - -def generate_random_samples(N): - tmp = np.random.rand(3*N, 2) - index = np.argwhere(tmp[:, 0] >= tmp[:, 1]) - - tmp_2 = tmp[index[0:N], :] - - samples = 30. + 150*tmp_2 - - samples = np.reshape(samples, (N, 2)) - - return samples - - -def main(): - base_dir = "/Users/kimliegeois/Desktop/Juelich/order_2_30/order_" - - orders = np.arange(2, 32, 2) - n_orders = len(orders) - - x_0 = [30, 30] - scale = [150, 150] - - monomial = False - - x_PCE = np.array([180., 30.]) - y_PCE = np.array([180., 30.]) - - #value = np.array([0.0109, -0.04723]) - #which_qoi = -2 - - value = np.array([0.00688, 0.00742]) - which_qoi = -1 - - #value = np.array([105.13469634968574, 172.45597099271995]) - #which_qoi = 1 - - #value = np.array([120.26643788294894, 189.0950734335578]) - #which_qoi = 0 - - error = np.zeros((n_orders, 2)) - - cauchy_error = np.zeros((n_orders-1, )) - - N_vec = np.zeros((n_orders, 1)) - N_vec_2 = np.zeros((n_orders, 1)) - - fig = plt.figure() - ax = fig.gca(projection='3d') - - n_real = 100000 - - rand_samples = generate_random_samples(n_real) - - rand_z = np.zeros((n_real, len(orders))) - - for i in range(0, n_orders): - order = orders[i] - qois, samples, weights = read_data(order, base_dir, ax, True) - - N = len(samples[:, 0]) - - N_vec[i] = N - - d = (order / 2) - - x = samples[0:N, 0] - y = samples[0:N, 1] - - exponents = build_exponents_L1(d) - Ainv = build_PCE_system(x, - y, - weights, - exponents, - x_0, - scale, - monomial=monomial) - - coefficients = compute_coeff(Ainv, qois[:, which_qoi]) - - N_vec_2[i] = len(coefficients) - - z_PCE = evaluate_PCE(x_PCE, - y_PCE, - coefficients, - exponents, - x_0, - scale, - monomial=monomial) - - rand_z[:, i] = evaluate_PCE(rand_samples[:, 0], - rand_samples[:, 1], - coefficients, - exponents, - x_0, - scale, - monomial=monomial) - - error[i, 0] = np.abs(z_PCE[0] - value[0]) - error[i, 1] = np.abs(z_PCE[1] - value[1]) - - if i != 0: - cauchy_error[i - - 1] = np.mean(np.power(rand_z[:, i]-rand_z[:, i-1], 2)) - - print((error[:, 0] / value[0])) - print((error[:, 1] / value[1])) - - tmp = np.zeros((len(orders), 2)) - tmp[:, 0] = (orders / 2) - - tmp[:, 1] = np.abs((error[:, 0] / value[0])) - np.savetxt('birr.txt', tmp) - - tmp[:, 1] = np.abs((error[:, 1] / value[1])) - np.savetxt('airr.txt', tmp) - - plt.figure() - plt.plot((orders / 2), np.abs((error[:, 0] / value[0]))) - plt.plot((orders / 2), np.abs((error[:, 1] / value[1]))) - - plt.figure() - plt.plot((orders / 2), N_vec) - plt.plot((orders / 2), N_vec_2) - - print(cauchy_error) - plt.figure() - plt.plot(cauchy_error) - - plt.figure() - plt.semilogy(cauchy_error) - - tmp = np.zeros((len(orders)-1, 2)) - tmp[:, 0] = np.arange(2, 16, 1) - tmp[:, 1] = cauchy_error - np.savetxt('cauchy_error.txt', tmp) - - plt.figure() - plt.semilogy((orders / 2), np.abs((error[:, 0] / value[0]))) - plt.semilogy((orders / 2), np.abs((error[:, 1] / value[1]))) - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/UQ/preload.py b/katoptron/Juelich/UQ/preload.py deleted file mode 100644 index a4006b93..00000000 --- a/katoptron/Juelich/UQ/preload.py +++ /dev/null @@ -1,159 +0,0 @@ - - - - - -import numpy -import vtk - -from katoptron.Juelich.post_process.vtk_post_process import * -import os - - -def compute_qoi(filename, mm=True, scale_x=1.): - reader = vtk.vtkXMLPUnstructuredGridReader() - reader.SetFileName(filename) - reader.Update() - - scale = 1. - if mm: - scale = 1000. - - OX = 0.0529999991413206 * scale * scale_x # *10 - OY = 0.0440000002272427 * scale * scale_x # *10 - OZ = -0.038604540600378885 * scale * scale_x # *10 - # Previously: -0.0413666241463175 - - F1 = compute_integrated_F(6, 8, OX, OY, OZ, 0, 0, 1, reader) - F2 = compute_integrated_F(7, 8, OX, OY, OZ, 0, 0, 1, reader) - F3 = compute_integrated_F(8, 8, OX, OY, OZ, 0, 0, 1, reader) - return F1, F2, F3 - - -def compute_and_write_preloads(base_dir, filename_out, N, ensemble_size, - n_qoi): - preloads = np.zeros((N, n_qoi)) - - N_ensemble = N // ensemble_size - for ensemble_index in range(0, N_ensemble): - for l in range(0, ensemble_size): - filename = base_dir + str(ensemble_size) + '/' + str( - ensemble_index - ) + '/fused_mirror_assembly_mm_part_2_ast1_s' + str(l) + '.pvtu' - F1, F2, F3 = compute_qoi(filename) - preloads[ensemble_index * ensemble_size + l, 0] = F1 - preloads[ensemble_index * ensemble_size + l, 1] = F2 - preloads[ensemble_index * ensemble_size + l, 2] = F3 - - np.savetxt(filename_out, preloads) - return preloads - - -def main(): - - file_dir = os.path.dirname(__file__) - - compute = False - if compute: - N = 2 - ensemble_size = 1 - n_qoi = 3 - - base_dir = file_dir + \ - '/../../../workspace/katoptron_Juelich_tests_M1_assembly_fused/MPI_2/A2/' - preloads_A2 = compute_and_write_preloads(base_dir, 'preloads_A2.txt', - N, ensemble_size, n_qoi) - print(preloads_A2) - - base_dir = file_dir + \ - '/../../../workspace/katoptron_Juelich_tests_M1_assembly_fused/MPI_2/A2_baking/' - preloads_A2_baking = compute_and_write_preloads( - base_dir, 'preloads_A2_baking.txt', N, ensemble_size, n_qoi) - print(preloads_A2_baking) - - base_dir = file_dir + \ - '/../../../workspace/katoptron_Juelich_tests_M1_assembly_fused/MPI_2/B2/' - preloads_B2 = compute_and_write_preloads(base_dir, 'preloads_B2.txt', - N, ensemble_size, n_qoi) - print(preloads_B2) - - base_dir = file_dir + \ - '/../../../workspace/katoptron_Juelich_tests_M1_assembly_fused/MPI_2/B2_baking/' - preloads_B2_baking = compute_and_write_preloads( - base_dir, 'preloads_B2_baking.txt', N, ensemble_size, n_qoi) - print(preloads_B2_baking) - - np.savetxt('preloads_A2_dif.txt', preloads_A2 - preloads_A2_baking) - np.savetxt('preloads_B2_dif.txt', preloads_B2 - preloads_B2_baking) - - N = 79 - - base_dir = file_dir + \ - '/../../../workspace/katoptron_Juelich_tests_M1_assembly_fused_preload/MPI_2/A2/' - preloads_A2_N = compute_and_write_preloads(base_dir, - 'preloads_A2_N.txt', N, - ensemble_size, n_qoi) - - print(preloads_A2_N) - - np.savetxt('preloads_A2_N_dif.txt', - preloads_A2_N - preloads_A2_baking[0]) - - base_dir = file_dir + \ - '/../../../workspace/katoptron_Juelich_tests_M1_assembly_fused_preload/MPI_2/B2/' - preloads_B2_N = compute_and_write_preloads(base_dir, - 'preloads_B2_N.txt', N, - ensemble_size, n_qoi) - - print(preloads_B2_N) - - np.savetxt('preloads_B2_N_dif.txt', - preloads_B2_N - preloads_B2_baking[0]) - else: - N = 20 - loaded = np.load(file_dir + '/../samples_files/Xiao_' + str(N) + - '.npz') - samples = loaded['samples'] - N = samples.shape[0] - - preloads_A2_N = np.loadtxt('preloads_A2_N.txt') - preloads_B2_N = np.loadtxt('preloads_B2_N.txt') - - tmp = np.zeros((N, 3)) - tmp[:, 0] = samples[:, 0] - tmp[:, 1] = samples[:, 1] - tmp[:, 2] = preloads_A2_N[:, 0] - np.savetxt('qoi_A_P1.txt', tmp, fmt='%f') - tmp[:, 2] = preloads_A2_N[:, 1] - np.savetxt('qoi_A_P2.txt', tmp, fmt='%f') - tmp[:, 2] = preloads_A2_N[:, 2] - np.savetxt('qoi_A_P3.txt', tmp, fmt='%f') - - tmp[:, 2] = preloads_B2_N[:, 0] - np.savetxt('qoi_B_P1.txt', tmp, fmt='%f') - tmp[:, 2] = preloads_B2_N[:, 1] - np.savetxt('qoi_B_P2.txt', tmp, fmt='%f') - tmp[:, 2] = preloads_B2_N[:, 2] - np.savetxt('qoi_B_P3.txt', tmp, fmt='%f') - - print(np.amin(preloads_A2_N[:, 0])) - print(np.amax(preloads_A2_N[:, 0])) - - print(np.amin(preloads_A2_N[:, 1])) - print(np.amax(preloads_A2_N[:, 1])) - - print(np.amin(preloads_A2_N[:, 2])) - print(np.amax(preloads_A2_N[:, 2])) - - print(np.amin(preloads_B2_N[:, 0])) - print(np.amax(preloads_B2_N[:, 0])) - - print(np.amin(preloads_B2_N[:, 1])) - print(np.amax(preloads_B2_N[:, 1])) - - print(np.amin(preloads_B2_N[:, 2])) - print(np.amax(preloads_B2_N[:, 2])) - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/UQ/speedup.py b/katoptron/Juelich/UQ/speedup.py deleted file mode 100644 index de8d588c..00000000 --- a/katoptron/Juelich/UQ/speedup.py +++ /dev/null @@ -1,409 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from katoptron.speedup import * -import matplotlib.pyplot as plt -import os - - -def plot_iter_all_ensemble_sizes(n_samples, iter): - import matplotlib.pyplot as plt - plt.figure() - plt.plot(list(range(0, n_samples)), - iter[0][:], 'bo', markersize=8, zorder=1) - if iter.shape[0] >= 2: - plt.plot(list(range(0, n_samples)), - iter[1][:], 'ro', markersize=6, zorder=2) - if iter.shape[0] >= 3: - plt.plot(list(range(0, n_samples)), - iter[2][:], 'go', markersize=4, zorder=2) - if iter.shape[0] >= 4: - plt.plot(list(range(0, n_samples)), - iter[3][:], 'ko', markersize=2, zorder=3) - plt.xlabel('sample') - plt.ylabel('Number of iterations to converge') - - -def speedup_of_one_case(file_MC_base_dir, - n_samples, - ensemble_sizes, - quantiles, - querylines, - use_waves_timers, - use_teuchos_timers, - per_iteration, - iter_2, - reduction=False): - import matplotlib.pyplot as plt - - if reduction: - name = 'case_ER' - else: - name = 'case' - - speedup = compute_speedup(n_samples, - ensemble_sizes, - file_MC_base_dir, - querylines, - per_iteration, - quantiles, - use_waves_timers, - use_teuchos_timers, - reduction, - remove_write=True, - remove_block=True) - - plot_speedup(speedup, ensemble_sizes, np.arange(0, len(querylines)), name, - querylines, per_iteration) - plt.savefig(name + '.png', dpi=400) - - save_speedup(speedup, ensemble_sizes, querylines, name) - - R = compute_R(n_samples, ensemble_sizes, file_MC_base_dir, quantiles, - reduction) - - save_R(R, name) - - iter = read_iter_all_ensemble_sizes(n_samples, ensemble_sizes, - file_MC_base_dir, reduction) - - # if not reduction: - # iter[0][:] = iter_2[0][:] - if len(ensemble_sizes) == 4: - plot_iter_all_ensemble_sizes(n_samples, iter) - plt.savefig(name + '_convergence.png', dpi=400) - np.savetxt(name + '_convergence.txt', iter, delimiter=' ') - - return iter - - -def write_tex(n_samples, iter, filename): - f = open(filename, 'w') - print('\\addplot [c1, mark=*, mark size=2pt, mark options={solid}, only marks]', file=f) - print('table [row sep=crcr] {%', file=f) - for i in range(0, n_samples): - print(str(i) + ' ' + str(iter[0][i]) + '\\\\', file=f) - print('};', file=f) - print('\\label{pgfplots:noEP}', file=f) - if iter.shape[0] >= 2: - ensemble_size = 8 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - print('\\addplot [line width=2pt, c2]', file=f) - print('table [row sep=crcr] {%', file=f) - print(str(ensemble_size * i) + ' ' + str( - iter[1][ensemble_size * i]) + '\\\\', file=f) - print(str(ensemble_size * - (i + 1)) + ' ' + str(iter[1][ensemble_size * - (i + 1) - 1]) + '\\\\', file=f) - print('};', file=f) - print('\\label{pgfplots:s8}', file=f) - if iter.shape[0] >= 3: - ensemble_size = 16 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - print('\\addplot [line width=1.5pt, c3]', file=f) - print('table [row sep=crcr] {%', file=f) - print(str(ensemble_size * i) + ' ' + str( - iter[2][ensemble_size * i]) + '\\\\', file=f) - print(str(ensemble_size * - (i + 1)) + ' ' + str(iter[2][ensemble_size * - (i + 1) - 1]) + '\\\\', file=f) - print('};', file=f) - print('\\label{pgfplots:s16}', file=f) - if iter.shape[0] >= 4: - ensemble_size = 32 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - print('\\addplot [line width=1.pt, c4]', file=f) - print('table [row sep=crcr] {%', file=f) - print(str(ensemble_size * i) + ' ' + str( - iter[3][ensemble_size * i]) + '\\\\', file=f) - print(str(ensemble_size * - (i + 1)) + ' ' + str(iter[3][ensemble_size * - (i + 1) - 1]) + '\\\\', file=f) - print('};', file=f) - print('\\label{pgfplots:s32}', file=f) - f.closed - - -def plot_iter_all(base_dir_ER, base_dir_NER, ensemble_sizes, n_samples): - - iter_NER = read_iter_all_ensemble_sizes(n_samples, ensemble_sizes, - base_dir_NER, False) - iter_ER = read_iter_all_ensemble_sizes(n_samples, ensemble_sizes, - base_dir_ER, True) - plot_iter_all_ensemble_sizes(n_samples, iter_NER) - write_tex(n_samples, iter_NER, 'NER_conv.tex') - np.savetxt('NER_conv.txt', iter_NER) - np.savetxt('ordering_1.txt', - np.argsort(iter_NER[0, :]).astype(int), - fmt='%i') - np.savetxt('ordering_2.txt', - np.argsort(iter_NER[0][:]).astype(int), - fmt='%i') - plot_iter_all_ensemble_sizes(n_samples, iter_ER) - write_tex(n_samples, iter_ER, 'ER_conv.tex') - np.savetxt('ER_conv.txt', iter_ER) - - order = np.argsort(iter_NER[0, :]) - - tmp = iter_NER[0][order] - - plt.figure() - plt.plot(iter_NER[0][:]) - plt.savefig('no_order_1.png', dpi=400) - - iter_NER[0][:] = tmp - - plt.figure() - plt.plot(tmp) - plt.savefig('order_1.png', dpi=400) - - tmp = iter_ER[0][order] - - plt.figure() - plt.plot(iter_ER[0][:]) - plt.savefig('no_order_2.png', dpi=400) - - iter_ER[0][:] = tmp - - write_tex(n_samples, iter_NER, 'NER_conv_2.tex') - write_tex(n_samples, iter_ER, 'ER_conv_2.tex') - - plt.figure() - plt.plot(tmp) - plt.savefig('order_2.png', dpi=400) - - -def CPU_time_per_one_case(base_dir, - n_samples, - ensemble_sizes, - quantiles, - querylines, - use_waves_timers, - use_teuchos_timers, - per_iteration, - filename_CPU, - filename_speed_up, - total_id, - write_id, - block_id, - per_ensemble=True): - - timers = read_timers_all_ensemble_sizes(n_samples, ensemble_sizes, - base_dir, querylines, - use_waves_timers, - use_teuchos_timers) - - f = open(filename_CPU, 'w') - print(timers.shape, file=f) - - for i in range(0, timers.shape[2]): - print(querylines[i], file=f) - string = '' - for e in range(0, timers.shape[0]): - if per_ensemble: - current_timer = (np.sum(timers[e, :, i]) / n_samples) - if i == total_id: - current_timer -= ( - np.sum(timers[e, :, write_id]) / n_samples) - current_timer -= ( - np.sum(timers[e, :, block_id]) / n_samples) - - else: - current_timer = (np.sum( - timers[e, :, i]) / (n_samples * ensemble_sizes[e])) - if i == total_id: - current_timer -= (np.sum(timers[e, :, write_id]) / ( - n_samples * ensemble_sizes[e])) - current_timer -= (np.sum(timers[e, :, block_id]) / ( - n_samples * ensemble_sizes[e])) - - string = string + str(round(current_timer, 3)) + ' & ' - print(string, file=f) - print(' ', file=f) - f.closed - - f = open(filename_speed_up, 'w') - print(timers.shape, file=f) - - for i in range(0, timers.shape[2]): - print(querylines[i], file=f) - string = '' - for e in range(0, timers.shape[0]): - if e == 0: - current_timer_s1 = np.sum(timers[0, :, i]) - if i == total_id: - current_timer_s1 -= np.sum(timers[0, :, write_id]) - current_timer_s1 -= np.sum(timers[0, :, block_id]) - - current_timer = (np.sum(timers[e, :, i]) / ensemble_sizes[e]) - if i == total_id: - current_timer -= (np.sum( - timers[e, :, write_id]) / ensemble_sizes[e]) - current_timer -= (np.sum( - timers[e, :, block_id]) / ensemble_sizes[e]) - - string = string + str(round((current_timer_s1 / current_timer), - 3)) + ' & ' - print(string, file=f) - print(' ', file=f) - f.closed - - -def analysis_one_case(directory, - base_dir, - n_samples, - ensemble_sizes, - quantiles, - querylines, - use_waves_timers, - use_teuchos_timers, - per_iteration, - ensemble_reduction=False): - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - iter = speedup_of_one_case(base_dir, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, - use_teuchos_timers, per_iteration, np.array([]), - ensemble_reduction) - - CPU_time_per_one_case(base_dir, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration, 'average_CPU.txt', - 'average_speed_up.txt', 7, 8, 21) - - #plot_iter_all(base_dir_ER, base_dir_NER, ensemble_sizes, n_samples) - iters = read_iter_all_ensemble_sizes(n_samples, ensemble_sizes, base_dir, - ensemble_reduction) - plot_iter_all_ensemble_sizes(n_samples, iters) - write_tex(n_samples, iters, 'conv.tex') - - os.chdir('..') - - -def main(): - import matplotlib.pyplot as plt - - ensemble_sizes = [1, 8, 16, 32] - quantiles = [0, 0.33, 0.5, 0.66, 1.] - - querylines = [ - 'computeMatrices', 'Belos: Operation Op*x', 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: DGKS[2]: Ortho (Inner Product)', - 'Belos: DGKS[2]: Ortho (Norm)', 'Belos: DGKS[2]: Ortho (Update)', - 'total', 'write results', 'MueLu: Hierarchy: Solve (level=0)', - 'MueLu: Hierarchy: Solve (level=1)', - 'MueLu: Hierarchy: Solve (level=2)', - 'MueLu: Hierarchy: Solve : smoothing (level=0)', - 'MueLu: Hierarchy: Solve : prolongation (level=0)', - 'MueLu: Hierarchy: Solve : residual calculation (level=0)', - 'MueLu: Hierarchy: Solve : restriction (level=0)', - 'MueLu: Hierarchy: Solve : smoothing (level=0)', - 'MueLu: Hierarchy: Solve : smoothing (level=1)', - 'MueLu: Hierarchy: Solve : coarse (level=2)', - 'Belos: PseudoBlockGmresSolMgr total solve time', - 'MueLu: Hierarchy: Setup (total)', 'create the block matrix' - ] - use_waves_timers = np.array([0, 7, 8, 21], dtype=int) - use_teuchos_timers = np.array( - [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], - dtype=int) - per_iteration = [ - False, True, True, False, False, False, False, False, False, True, - True, True, True, True, True, True, True, True, True, False, False, - False - ] - - n_samples = 64 - - ensemble_sizes = [1, 8, 16] - - base_dir = '/Users/kimliegeois/Desktop/Juelich/ER/mpi_ER/MPI_2' - - directory = 'option_A_mpi_2_ER' - analysis_one_case(directory, base_dir, n_samples, ensemble_sizes, - quantiles, querylines, use_waves_timers, - use_teuchos_timers, per_iteration, True) - - base_dir = '/Users/kimliegeois/Desktop/Juelich/NER/mpi_NER/MPI_2' - - directory = 'option_A_mpi_2_NER' - analysis_one_case(directory, base_dir, n_samples, ensemble_sizes, - quantiles, querylines, use_waves_timers, - use_teuchos_timers, per_iteration, False) - - ensemble_sizes = [1, 8, 16, 32] - - base_dir = '/Users/kimliegeois/Desktop/Juelich/ER/mpi_ER/MPI_4' - - directory = 'option_A_mpi_4_ER' - analysis_one_case(directory, base_dir, n_samples, ensemble_sizes, - quantiles, querylines, use_waves_timers, - use_teuchos_timers, per_iteration, True) - - base_dir = '/Users/kimliegeois/Desktop/Juelich/NER/mpi_NER/MPI_4' - - directory = 'option_A_mpi_4_NER' - analysis_one_case(directory, base_dir, n_samples, ensemble_sizes, - quantiles, querylines, use_waves_timers, - use_teuchos_timers, per_iteration, False) - - base_dir = '/Users/kimliegeois/Desktop/Juelich/ER/mpi_ER/MPI_8' - - directory = 'option_A_mpi_8_ER' - analysis_one_case(directory, base_dir, n_samples, ensemble_sizes, - quantiles, querylines, use_waves_timers, - use_teuchos_timers, per_iteration, True) - - base_dir = '/Users/kimliegeois/Desktop/Juelich/NER/mpi_NER/MPI_8' - - directory = 'option_A_mpi_8_NER' - analysis_one_case(directory, base_dir, n_samples, ensemble_sizes, - quantiles, querylines, use_waves_timers, - use_teuchos_timers, per_iteration, False) - - n_samples = 32 - ensemble_sizes = [1, 8, 16] - base_dir = '/Users/kimliegeois/Desktop/Juelich/mpi_4/MPI_16' - - directory = 'option_A_mpi_16_all' - print(directory) - analysis_one_case(directory, base_dir, n_samples, ensemble_sizes, - quantiles, querylines, use_waves_timers, - use_teuchos_timers, per_iteration, False) - - n_samples = 32 - ensemble_sizes = [1, 8, 16, 32] - base_dir = '/Users/kimliegeois/Desktop/Juelich/mpi_4/MPI_32' - - directory = 'option_A_mpi_32_all' - print(directory) - analysis_one_case(directory, base_dir, n_samples, ensemble_sizes, - quantiles, querylines, use_waves_timers, - use_teuchos_timers, per_iteration, False) - - n_samples = 16 - ensemble_sizes = [1, 8, 16] - base_dir = '/Users/kimliegeois/Desktop/Juelich/mpi_5/MPI_32' - - directory = 'option_A_mpi_32_all_2' - print(directory) - analysis_one_case(directory, base_dir, n_samples, ensemble_sizes, - quantiles, querylines, use_waves_timers, - use_teuchos_timers, per_iteration, False) - - n_samples = 32 - ensemble_sizes = [1, 8, 16, 32] - base_dir = '/Users/kimliegeois/Desktop/Juelich/mpi_6/MPI_32' - - directory = 'option_A_mpi_32_all_3' - print(directory) - analysis_one_case(directory, base_dir, n_samples, ensemble_sizes, - quantiles, querylines, use_waves_timers, - use_teuchos_timers, per_iteration, False) - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/UQ/test_halton.py b/katoptron/Juelich/UQ/test_halton.py deleted file mode 100644 index 64864a76..00000000 --- a/katoptron/Juelich/UQ/test_halton.py +++ /dev/null @@ -1,67 +0,0 @@ - -import numpy as np -import matplotlib.pyplot as plt -from mpl_toolkits.mplot3d import axes3d -import matplotlib.tri as mtri - -from katoptron.Juelich.UQ.halton import * -from katoptron.Juelich.UQ.copulas import * -import katoptron.utilities as u -from scipy.stats import lognorm - - -def main(): - - N = 640 - n_rand = 2 - - halton_points = np.zeros((n_rand, N)) - - for i in range(0, N): - halton_points[:, i] = halton(i + 1, n_rand) - - #fig = plt.figure() - # plt.scatter(halton_points[0,:],halton_points[1,:]) - #ax = fig.gca() - # ax.set_aspect('equal') - - np.random.seed(42) - - sigma = 0.15 - mu = np.log(345) + sigma**2 # mode = 345 - - randomVariable_1 = np.random.lognormal(mu, sigma, N) - randomVariable_2 = np.random.lognormal(mu, sigma, N) - - randomVariable_1_halton = lognorm.ppf(halton_points[0, :], - sigma, - scale=np.exp(mu)) - randomVariable_2_halton = lognorm.ppf(halton_points[1, :], - sigma, - scale=np.exp(mu)) - - randomVariable_halton = lognormal(halton_points, [mu, mu], [sigma, sigma]) - - #randomVariable_1_halton = lognorm.rvs(sigma,scale=np.exp(mu), size=N, random_state=42) - #randomVariable_2_halton = lognorm.rvs(sigma,scale=np.exp(mu), size=N) - - #fig = plt.figure() - # plt.scatter(randomVariable_1,randomVariable_2) - #ax = fig.gca() - # ax.set_aspect('equal') - - #fig = plt.figure() - # plt.scatter(randomVariable_1_halton,randomVariable_2_halton) - #ax = fig.gca() - # ax.set_aspect('equal') - - fig = plt.figure() - plt.scatter(randomVariable_1, randomVariable_2) - plt.scatter(randomVariable_halton[0, :], randomVariable_halton[1, :]) - ax = fig.gca() - ax.set_aspect('equal') - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/UQ/test_kde.py b/katoptron/Juelich/UQ/test_kde.py deleted file mode 100644 index 569dd1d3..00000000 --- a/katoptron/Juelich/UQ/test_kde.py +++ /dev/null @@ -1,49 +0,0 @@ - -import numpy as np -import matplotlib.pyplot as plt -from mpl_toolkits.mplot3d import axes3d - -from katoptron.Juelich.UQ.kde import * - - -def main(): - - N = 1000 - g1 = np.array([0.6 + 0.6 * np.random.rand(N), - np.random.rand(N), 0.4+0.1*np.random.rand(N)]) - g2 = np.array([0.4+0.3 * np.random.rand(N), 0.5 * - np.random.rand(N), 0.1*np.random.rand(N)]) - g3 = np.array([0.3*np.random.rand(N), 0.3 * - np.random.rand(N), 0.3*np.random.rand(N)]) - - g_total = np.concatenate((g1, g2, g3), axis=1) - x, y, z = g_total - - fig = plt.figure() - ax = fig.gca(projection='3d') - ax.scatter(x, y, z) - - kernel = compute_kde(g_total) - plot_kde(kernel, [-0.5, 1.5], [-0.5, 1.5], [0.05], [0, 1]) - plot_kde(kernel, [-0.5, 1.5], [-0.5, 1.5], [0.15], [0, 1]) - plot_kde(kernel, [-0.5, 1.5], [-0.5, 1.5], [0.25], [0, 1]) - plot_kde(kernel, [-0.5, 1.5], [-0.5, 1.5], [0.35], [0, 1]) - plot_kde(kernel, [-0.5, 1.5], [-0.5, 1.5], [0.45], [0, 1]) - plot_kde(kernel, [-0.5, 1.5], [-0.5, 1.5], [0.55], [0, 1]) - - np.random.seed(42) - p1 = box_prob_MC(kernel, [0, -0.5, 0.3], [1.5, 1.5, 0.6], 100000) - np.random.seed(42) - p2 = box_prob_MC(kernel, [0, -0.5, 0.3], [0.6, 1.5, 0.6], 100000) - np.random.seed(42) - p3 = box_prob_MC(kernel, [0.6, -0.5, 0.3], [1.5, 1.5, 0.6], 100000) - - print(p1) - print(p3) - print(p1-(p2+p3)) - - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/__init__.py b/katoptron/Juelich/__init__.py deleted file mode 100644 index 14a7f2a3..00000000 --- a/katoptron/Juelich/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf-8 -*- -# katoptron.Juelich MODULE initialization file diff --git a/katoptron/Juelich/broken/M1.py b/katoptron/Juelich/broken/M1.py deleted file mode 100644 index c3a57826..00000000 --- a/katoptron/Juelich/broken/M1.py +++ /dev/null @@ -1,315 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - from fwk.wutils import parseargs - args = parseargs() - - from PyTrilinos import Teuchos - import numpy as np - - precondList = Teuchos.ParameterList() - precondList = Teuchos.ParameterList() - precondSubList = Teuchos.ParameterList() - precondSubSubList = Teuchos.ParameterList() - precondSubSubList['fact: iluk level-of-fill'] = 2 - precondSubList['Prec Type'] = "RILUK" - precondSubList['Overlap'] = 1 - precondSubList['Ifpack2 Settings'] = precondSubSubList - precondList['Ifpack2'] = precondSubList - - mueluParams = Teuchos.ParameterList() - #mueluParamsSub1 = Teuchos.ParameterList() - #mueluParamsSub1['PDE equations'] = 4 - #mueluParams['Matrix'] = mueluParamsSub1 - mueluParams['number of equations'] = 4 - mueluParams['max levels'] = 2 - mueluParams['multigrid algorithm'] = "unsmoothed" - mueluParams['smoother: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - - mueluParamsSub2['relaxation: type'] = "Symmetric Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 4 - mueluParamsSub2['relaxation: damping factor'] = 1.25 - - mueluParams['coarse: type'] = "RELAXATION" - - mueluParamsSub3 = Teuchos.ParameterList() - - mueluParamsSub3['relaxation: type'] = "Symmetric Gauss-Seidel" - mueluParamsSub3['relaxation: sweeps'] = 4 - mueluParamsSub3['relaxation: damping factor'] = 1.25 - - mueluParams['smoother: params'] = mueluParamsSub2 - mueluParams['coarse: params'] = mueluParamsSub3 - - solverList = Teuchos.ParameterList() - solverList['type'] = "BlockGmres" - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 100 - solverList['ifpackParams'] = precondList - solverList['mueluParams'] = mueluParams - - solverList['Use preconditioner'] = True - - solverList['Maximum active set iteration'] = 10 - - solverList['Print Teuchos timers'] = False - #solverList['Write matrix and vectors'] = True - #solverList['Write txt files'] = True - - geo_name = 'M1_FEM_7.msh' - mesh_name = 'M1_FEM_7.msh' - - import shlex - import subprocess - import os - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - #solverList["MueLu xml file name"] = file_dir + '/finest_level_prec_2.xml' - solverList["MueLu xml file name"] = file_dir + \ - '/finest_level_prec_simple_heat.xml' - #solverList["MueLu xml file name"] = file_dir + '/nested_multigrid_2_lvls_chebyshev_heat.xml' - #solverList["MueLu xml file name"] = file_dir + '/nested_multigrid_2_lvls_chebyshev.xml' - - if rank == 0: - command_line = 'gmsh -3 ' + file_dir + '/mesh/' + geo_name + \ - ' -o ' + work_dir + '/' + mesh_name + ' -part ' + str(siz) - print(command_line) - tmp = shlex.split(command_line) - fileout = open('gmsh.log', 'w') - p = subprocess.Popen(tmp, stdin=subprocess.PIPE, stdout=fileout, - stderr=fileout, env=os.environ, shell=False, close_fds=True) - retcode = p.wait() - for i in range(1, siz): - comm.send(1, dest=i, tag=11) - else: - data = comm.recv(source=0, tag=11) - - if siz == 1: - msh = gmsh.MeshLoader(mesh_name, work_dir).execute() - else: - msh = gmsh.MeshLoader(mesh_name, work_dir).myrank_execute(rank) - - pbl = m.Problem(msh, comm) - - ensemble_size = 1 - - E = 330000 * np.ones(ensemble_size) - nu = 0.36 * np.ones(ensemble_size) - k = 0.114 - d = 0.5E-05 - - E_rhodium = 379000 * np.ones(ensemble_size) - nu_rhodium = 0.26 * np.ones(ensemble_size) - k_rhodium = 0.150 - d_rhodium = 0.781E-05 - - E_WCu = 280000 * np.ones(ensemble_size) - nu_WCu = 0.26 * np.ones(ensemble_size) - k_WCu = 0.180 - d_WCu = 0.88E-05 - - E_SS = 180000 * np.ones(ensemble_size) - nu_SS = 0.26 * np.ones(ensemble_size) - k_SS = 0.020 - d_SS = 1.6E-05 - - E_CuCrZr = 130000 * np.ones(ensemble_size) - nu_CuCrZr = 0.26 * np.ones(ensemble_size) - k_CuCrZr = 0.280 - d_CuCrZr = 1.6E-05 - - E_I718 = 180000 * np.ones(ensemble_size) - nu_I718 = 0.26 * np.ones(ensemble_size) - k_I718 = 0.020 - d_I718 = 1.4E-05 - - m.Medium(pbl, "Mirror", "Rhodium", E_rhodium, - nu_rhodium, k_rhodium, d_rhodium) - m.Medium(pbl, "Substrate", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Shaft 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 3", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Holder", "SS", E_SS, nu_SS, k_SS, d_SS) - - m.Medium(pbl, "Spacer 1-2", "CuCrZr", E_CuCrZr, - nu_CuCrZr, k_CuCrZr, d_CuCrZr) - m.Medium(pbl, "Spacer 3", "CuCrZr", E_CuCrZr, - nu_CuCrZr, k_CuCrZr, d_CuCrZr) - - m.Medium(pbl, "Spacer 1-2 part 2", "CuCrZr", - E_CuCrZr, nu_CuCrZr, k_CuCrZr, d_CuCrZr) - m.Medium(pbl, "Spacer 3 part 2", "CuCrZr", - E_CuCrZr, nu_CuCrZr, k_CuCrZr, d_CuCrZr) - - m.Medium(pbl, "Washer 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Nut 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Dirichlet(pbl, "Holder Clamping", "Clamped", 1, - 0., 1, 0., 1, 0., 0, 0., ensemble_size) - - m.Dirichlet(pbl, "Cooling top", "Clamped", 0, 0., - 0, 0., 0, 0., 1, 70., ensemble_size) - m.Dirichlet(pbl, "Cooling bot", "Clamped", 0, 0., - 0, 0., 0, 0., 1, 70., ensemble_size) - - norm1 = tbox.Vector3d(0, 0, -1) - norm2 = tbox.Vector3d(0, 0, 1) - - cont1 = m.Contact(pbl, "Nut 1 to Holder", "contact", norm1, -0.3) - cont1.setMaster(pbl, "Holder to Nut 1", norm1) - - cont2 = m.Contact(pbl, "Nut 2 to Holder", "contact", norm1, -0.3) - cont2.setMaster(pbl, "Holder to Nut 2", norm1) - - cont3 = m.Contact(pbl, "Nut 3 to Holder", "contact", norm1, -0.3) - cont3.setMaster(pbl, "Holder to Nut 3", norm1) - - cont4 = m.Contact(pbl, "Spacer 1-2 to Substrate", "contact", norm1, 0.) - cont4.setMaster(pbl, "Substrate to Spacer 1-2", norm1) - - cont5 = m.Contact(pbl, "Spacer 3 to Substrate", "contact", norm1, 0.) - cont5.setMaster(pbl, "Substrate to Spacer 3", norm1) - - cont6 = m.Contact(pbl, "Spacer 1-2 part 2 to Holder", "contact", norm1, 0.) - cont6.setMaster(pbl, "Holder to Spacer 1-2 part 2", norm1) - - cont7 = m.Contact(pbl, "Spacer 3 part 2 to Holder", "contact", norm1, 0.) - cont7.setMaster(pbl, "Holder to Spacer 3 part 2", norm1) - - cont8 = m.Contact(pbl, "Spacer 1-2 to Spacer 1-2 part 2", - "contact", norm1, 0.) - cont8.setMaster(pbl, "Spacer 1-2 part 2 to Spacer 1-2", norm1) - - cont9 = m.Contact(pbl, "Spacer 3 to Spacer 3 part 2", "contact", norm1, 0.) - cont9.setMaster(pbl, "Spacer 3 part 2 to Spacer 3", norm1) - - cont10 = m.Contact(pbl, "Spacer 1-2 to Washer 1", "contact", norm1, 0.) - cont10.setMaster(pbl, "Washer 1 to Spacer 1-2", norm1) - # cont10.setInitialyOpen() - - cont11 = m.Contact(pbl, "Washer 1 to Spacer 1-2 part 2", - "contact", norm1, 0.) - cont11.setMaster(pbl, "Spacer 1-2 part 2 to Washer 1", norm1) - # cont11.setInitialyOpen() - - cont12 = m.Contact(pbl, "Washer 1 to Shaft 1", "contact", norm1, 0.) - cont12.setMaster(pbl, "Shaft 1 to Washer 1", norm1) - # cont12.setInitialyOpen() - - cont13 = m.Contact(pbl, "Spacer 1-2 to Washer 2", "contact", norm1, 0.) - cont13.setMaster(pbl, "Washer 2 to Spacer 1-2", norm1) - # cont13.setInitialyOpen() - - cont14 = m.Contact(pbl, "Washer 2 to Spacer 1-2 part 2", - "contact", norm1, 0.) - cont14.setMaster(pbl, "Spacer 1-2 part 2 to Washer 2", norm1) - # cont14.setInitialyOpen() - - cont15 = m.Contact(pbl, "Shaft 2 to Washer 2", "contact", norm1, 0.) - cont15.setMaster(pbl, "Washer 2 to Shaft 2", norm1) - # cont15.setInitialyOpen() - - cont16 = m.Contact(pbl, "Spacer 3 to Washer 3", "contact", norm1, 0.) - cont16.setMaster(pbl, "Washer 3 to Spacer 3", norm1) - # cont16.setInitialyOpen() - - cont17 = m.Contact(pbl, "Washer 3 to Spacer 3 part 2", - "contact", norm1, 0.) - cont17.setMaster(pbl, "Spacer 3 part 2 to Washer 3", norm1) - # cont17.setInitialyOpen() - - cont18 = m.Contact(pbl, "Washer 3 to Shaft 3", "contact", norm1, 0.) - cont18.setMaster(pbl, "Shaft 3 to Washer 3", norm1) - # cont18.setInitialyOpen() - - #m.Dirichlet(pbl, "Nut 1 to Holder", "Clamped",1,0.,1,0.,1,0.,1,100.,ensemble_size) - #m.Dirichlet(pbl, "Nut 2 to Holder", "Clamped",1,0.,1,0.,1,0.,1,100.,ensemble_size) - #m.Dirichlet(pbl, "Nut 3 to Holder", "Clamped",1,0.,1,0.,1,0.,1,100.,ensemble_size) - - #m.Dirichlet(pbl, "Holder to Nut 1", "Clamped",1,0.,1,0.,1,0.,1,100.,ensemble_size) - #m.Dirichlet(pbl, "Holder to Nut 2", "Clamped",1,0.,1,0.,1,0.,1,100.,ensemble_size) - #m.Dirichlet(pbl, "Holder to Nut 3", "Clamped",1,0.,1,0.,1,0.,1,100.,ensemble_size) - - #m.Dirichlet(pbl, "Washer 1 to Spacer 1-2", "Clamped",1,0.,1,0.,1,0.,1,70.,ensemble_size) - #m.Dirichlet(pbl, "Washer 2 to Spacer 1-2", "Clamped",1,0.,1,0.,1,0.,1,70.,ensemble_size) - #m.Dirichlet(pbl, "Washer 3 to Spacer 3", "Clamped",1,0.,1,0.,1,0.,1,70.,ensemble_size) - - #m.Dirichlet(pbl, "Spacer 1-2 to Substrate", "Clamped",1,0.,1,0.,1,0.,1,70.,ensemble_size) - #m.Dirichlet(pbl, "Spacer 3 to Substrate", "Clamped",1,0.,1,0.,1,0.,1,70.,ensemble_size) - - #m.Dirichlet(pbl, "Spacer 1-2 part 2 to Holder", "Clamped",1,0.,1,0.,1,0.,1,70.,ensemble_size) - #m.Dirichlet(pbl, "Spacer 3 part 2 to Holder", "Clamped",1,0.,1,0.,1,0.,1,70.,ensemble_size) - - zero = np.zeros(ensemble_size) - hf = (70/0.0121)*0.001 * np.ones(ensemble_size) - - m.Neumann(pbl, "Mirror surface", "moved", 0, zero, - 0, zero, 0, zero, 1, hf, ensemble_size) - m.Source(pbl, "Mirror", "ihg", 2.45*1000) - m.Source(pbl, "Substrate", "ihg", 2.45*1000) - m.Source(pbl, "Holder", "ihg", 0.7*1000) - - m.Dirichlet(pbl, "XY Clamping", "Clamped", 1, 0., - 1, 0., 0, 0., 0, 0., ensemble_size) - #m.Dirichlet(pbl, "Mirror surface", "Clamped",0,0.,0,0.,1,-0.1,1,300.,ensemble_size) - - slv = m.IterativeSolver(pbl, args.k, solverList, 4, ensemble_size) - - if not args.nogui: - if rank == 0: - all_msh = gmsh.MeshLoader(mesh_name, work_dir).execute() - import katoptron.viewer as v - gui = v.MeshViewer(pbl, slv, all_msh) - gui.vmin = 0 - gui.vmax = 1 - gui.start() - else: - slv.start() - else: - slv.start() - - from fwk.testing import * - tests = CTests() - tests.add(CTest('mean(Tbottom)', 0, 0)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/broken/M1_assembly.py b/katoptron/Juelich/broken/M1_assembly.py deleted file mode 100644 index de619728..00000000 --- a/katoptron/Juelich/broken/M1_assembly.py +++ /dev/null @@ -1,236 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - from fwk.wutils import parseargs - args = parseargs() - - from PyTrilinos import Teuchos - import numpy as np - - precondList = Teuchos.ParameterList() - precondList = Teuchos.ParameterList() - precondSubList = Teuchos.ParameterList() - precondSubSubList = Teuchos.ParameterList() - precondSubSubList['fact: iluk level-of-fill'] = 2 - precondSubList['Prec Type'] = "RILUK" - precondSubList['Overlap'] = 1 - precondSubList['Ifpack2 Settings'] = precondSubSubList - precondList['Ifpack2'] = precondSubList - - mueluParams = Teuchos.ParameterList() - #mueluParamsSub1 = Teuchos.ParameterList() - #mueluParamsSub1['PDE equations'] = 4 - #mueluParams['Matrix'] = mueluParamsSub1 - mueluParams['number of equations'] = 4 - mueluParams['max levels'] = 1 - mueluParams['multigrid algorithm'] = "unsmoothed" - mueluParams['smoother: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - - mueluParamsSub2['relaxation: type'] = "Symmetric Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 4 - mueluParamsSub2['relaxation: damping factor'] = 1.25 - - mueluParams['coarse: type'] = "RELAXATION" - - mueluParamsSub3 = Teuchos.ParameterList() - - mueluParamsSub3['relaxation: type'] = "Symmetric Gauss-Seidel" - mueluParamsSub3['relaxation: sweeps'] = 4 - mueluParamsSub3['relaxation: damping factor'] = 1.25 - - mueluParams['smoother: params'] = mueluParamsSub2 - mueluParams['coarse: params'] = mueluParamsSub3 - - solverList = Teuchos.ParameterList() - solverList['type'] = "BlockGmres" - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 100 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 100 - solverList['ifpackParams'] = precondList - solverList['mueluParams'] = mueluParams - - solverList['Use preconditioner'] = True - - solverList['Maximum active set iteration'] = 10 - - solverList['Print Teuchos timers'] = True - #solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - geo_name = 'MIRROR_1_ASSEMBLY_5.msh' - mesh_name = 'MIRROR_1_ASSEMBLY_5.msh' - - import shlex - import subprocess - import os - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - #solverList["MueLu xml file name"] = file_dir + '/finest_level_prec_2.xml' - solverList["MueLu xml file name"] = file_dir + \ - '/nested_multigrid_2_lvls_old.xml' - #solverList["MueLu xml file name"] = file_dir + '/nested_multigrid_2_lvls_chebyshev_heat.xml' - #solverList["MueLu xml file name"] = file_dir + '/nested_multigrid_2_lvls_chebyshev.xml' - - if rank == 0: - command_line = 'gmsh -3 ' + file_dir + '/mesh/' + geo_name + \ - ' -o ' + work_dir + '/' + mesh_name + ' -part ' + str(siz) - print(command_line) - tmp = shlex.split(command_line) - fileout = open('gmsh.log', 'w') - p = subprocess.Popen(tmp, stdin=subprocess.PIPE, stdout=fileout, - stderr=fileout, env=os.environ, shell=False, close_fds=True) - retcode = p.wait() - for i in range(1, siz): - comm.send(1, dest=i, tag=11) - else: - data = comm.recv(source=0, tag=11) - - if siz == 1: - msh = gmsh.MeshLoader(mesh_name, work_dir).execute() - else: - msh = gmsh.MeshLoader(mesh_name, work_dir).myrank_execute(rank) - - pbl = m.Problem(msh, comm) - - ensemble_size = 1 - - E = 330000 * np.ones(ensemble_size) - nu = 0.36 * np.ones(ensemble_size) - k = 0.114 - d = 0.5E-05 - - E_rhodium = 379000 * np.ones(ensemble_size) - nu_rhodium = 0.26 * np.ones(ensemble_size) - k_rhodium = 0.150 - d_rhodium = 0.781E-05 - - E_WCu = 280000 * np.ones(ensemble_size) - nu_WCu = 0.26 * np.ones(ensemble_size) - k_WCu = 0.180 - d_WCu = 0.88E-05 - - E_SS = 180000 * np.ones(ensemble_size) - nu_SS = 0.26 * np.ones(ensemble_size) - k_SS = 0.020 - d_SS = 1.6E-05 - - E_CuCrZr = 130000 * np.ones(ensemble_size) - nu_CuCrZr = 0.26 * np.ones(ensemble_size) - k_CuCrZr = 0.280 - d_CuCrZr = 1.6E-05 - - E_I718 = 180000 * np.ones(ensemble_size) - nu_I718 = 0.26 * np.ones(ensemble_size) - k_I718 = 0.020 - d_I718 = 1.4E-05 - - m.Medium(pbl, "Mirror", "SS", E_rhodium, nu_rhodium, k_rhodium, d_rhodium) - m.Medium(pbl, "Substrate", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - m.Medium(pbl, "Holder", "SS", E_SS, nu_SS, k_SS, d_SS) - m.Medium(pbl, "Holder 2", "SS", E_SS, nu_SS, k_SS, d_SS) - - m.Medium(pbl, "Pipe 1", "SS", E_SS, nu_SS, k_SS, d_SS) - m.Medium(pbl, "Pipe 2", "SS", E_SS, nu_SS, k_SS, d_SS) - m.Medium(pbl, "Pipe 3", "SS", E_SS, nu_SS, k_SS, d_SS) - m.Medium(pbl, "Pipe 4", "SS", E_SS, nu_SS, k_SS, d_SS) - - m.Medium(pbl, "Washer 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Shaft 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Bolt 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Bolt 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Bolt 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Pin 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Pin 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Pin 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Nut 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Spacer 1", "CuCrZr", E_CuCrZr, - nu_CuCrZr, k_CuCrZr, d_CuCrZr) - m.Medium(pbl, "Spacer 2", "CuCrZr", E_I718, nu_CuCrZr, k_CuCrZr, d_CuCrZr) - m.Medium(pbl, "Spacer 3", "CuCrZr", E_I718, nu_CuCrZr, k_CuCrZr, d_CuCrZr) - - m.Dirichlet(pbl, "Holder 2 Clamping", "Clamped", 1, - 0., 1, 0., 1, 0., 1, 70., ensemble_size) - - m.Dirichlet(pbl, "Holder to bolt 1", "Clamped", 0, - 0., 0, 0., 0, 0., 1, 140., ensemble_size) - m.Dirichlet(pbl, "Holder to bolt 2", "Clamped", 0, - 0., 0, 0., 0, 0., 1, 140., ensemble_size) - m.Dirichlet(pbl, "Holder to bolt 3", "Clamped", 0, - 0., 0, 0., 0, 0., 1, 140., ensemble_size) - - m.Dirichlet(pbl, "Bolt 1 to holder", "Clamped", 1, - 0., 1, 0., 1, 0., 1, 140., ensemble_size) - m.Dirichlet(pbl, "Bolt 2 to holder", "Clamped", 0, - 0., 0, 0., 0, 0., 1, 140., ensemble_size) - m.Dirichlet(pbl, "Bolt 3 to holder", "Clamped", 0, - 0., 0, 0., 0, 0., 1, 140., ensemble_size) - - m.Dirichlet(pbl, "Mirror surface", "Clamped", 0, 0., - 0, 0., 0, 0., 1, 210., ensemble_size) - - slv = m.IterativeSolver(pbl, args.k, solverList, 4, ensemble_size) - - if not args.nogui: - if rank == 0: - all_msh = gmsh.MeshLoader(mesh_name, work_dir).execute() - import katoptron.viewer as v - gui = v.MeshViewer(pbl, slv, all_msh) - gui.vmin = 0 - gui.vmax = 1 - gui.start() - else: - slv.start() - else: - slv.start() - - from fwk.testing import * - tests = CTests() - tests.add(CTest('mean(Tbottom)', 0, 0)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/broken/M1_assembly_fused_all.py b/katoptron/Juelich/broken/M1_assembly_fused_all.py deleted file mode 100644 index 2fad06b1..00000000 --- a/katoptron/Juelich/broken/M1_assembly_fused_all.py +++ /dev/null @@ -1,354 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - from fwk.wutils import parseargs - args = parseargs() - - from PyTrilinos import Teuchos - import numpy as np - - mueluParams = Teuchos.ParameterList() - #mueluParamsSub1 = Teuchos.ParameterList() - #mueluParamsSub1['PDE equations'] = 4 - #mueluParams['Matrix'] = mueluParamsSub1 - mueluParams['number of equations'] = 4 - mueluParams['max levels'] = 5 - mueluParams['multigrid algorithm'] = "unsmoothed" - mueluParams['smoother: type'] = "RELAXATION" - mueluParams['coarse: max size'] = 3000 - - mueluParamsSub2 = Teuchos.ParameterList() - - mueluParamsSub2['relaxation: type'] = "Symmetric Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 5 - mueluParamsSub2['relaxation: damping factor'] = 1.25 - - mueluParams['coarse: type'] = "Klu" - mueluParams['verbosity'] = "low" - - mueluParamsSub3 = Teuchos.ParameterList() - - mueluParamsSub3['relaxation: type'] = "Symmetric Gauss-Seidel" - mueluParamsSub3['relaxation: sweeps'] = 4 - mueluParamsSub3['relaxation: damping factor'] = 1.25 - - mueluParams['smoother: params'] = mueluParamsSub2 - #mueluParams['coarse: params'] = mueluParamsSub3 - - solverList = Teuchos.ParameterList() - solverList['type'] = "BlockGmres" - solverList['Convergence Tolerance'] = 10**(-7) - solverList['Maximum Iterations'] = 2000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 100 - solverList['mueluParams'] = mueluParams - - solverList['Use preconditioner'] = True - - solverList['Maximum active set iteration'] = 10 - - solverList['Print Teuchos timers'] = True - #solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - geo_name = 'MIRROR_1_ASSEMBLY_fused_all.msh' - mesh_name = 'MIRROR_1_ASSEMBLY_fused_all.msh' - - import shlex - import subprocess - import os - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - #solverList["MueLu xml file name"] = file_dir + '/finest_level_prec_2.xml' - solverList["MueLu xml file name"] = file_dir + \ - '/nested_multigrid_2_lvls_old.xml' - #solverList["MueLu xml file name"] = file_dir + '/nested_multigrid_2_lvls_chebyshev_heat.xml' - #solverList["MueLu xml file name"] = file_dir + '/nested_multigrid_2_lvls_chebyshev.xml' - - if rank == 0: - command_line = 'gmsh -3 ' + file_dir + '/mesh/' + geo_name + \ - ' -o ' + work_dir + '/' + mesh_name + ' -part ' + str(siz) - print(command_line) - tmp = shlex.split(command_line) - fileout = open('gmsh.log', 'w') - p = subprocess.Popen(tmp, stdin=subprocess.PIPE, stdout=fileout, - stderr=fileout, env=os.environ, shell=False, close_fds=True) - retcode = p.wait() - for i in range(1, siz): - comm.send(1, dest=i, tag=11) - else: - data = comm.recv(source=0, tag=11) - - if siz == 1: - msh = gmsh.MeshLoader(mesh_name, work_dir).execute() - else: - msh = gmsh.MeshLoader(mesh_name, work_dir).myrank_execute(rank) - - pbl = m.Problem(msh, comm) - - # Distance in the mesh are represented in meters - - ensemble_size = 1 - - # 379 000 MPa = 379 GPa = 379E9 Pa - E_rhodium = 379E9 * np.ones(ensemble_size) - nu_rhodium = 0.26 * np.ones(ensemble_size) - # 0.150 kW/(m K) = 150 W/(m K) - k_rhodium = 150 - d_rhodium = 0.781E-05 - - E_WCu = 280E9 * np.ones(ensemble_size) - nu_WCu = 0.26 * np.ones(ensemble_size) - k_WCu = 180 - d_WCu = 0.88E-05 - - E_SS = 180E9 * np.ones(ensemble_size) - nu_SS = 0.26 * np.ones(ensemble_size) - k_SS = 20 - d_SS = 1.6E-05 - - E_CuCrZr = 130E9 * np.ones(ensemble_size) - nu_CuCrZr = 0.26 * np.ones(ensemble_size) - k_CuCrZr = 280 - d_CuCrZr = 1.6E-05 - - E_I718 = 180E9 * np.ones(ensemble_size) - nu_I718 = 0.26 * np.ones(ensemble_size) - k_I718 = 20 - d_I718 = 1.4E-05 - - m.Medium(pbl, "Mirror", "rhodium", E_rhodium, - nu_rhodium, k_rhodium, d_rhodium) - m.Medium(pbl, "Substrate", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - m.Medium(pbl, "Holder", "SS", E_SS, nu_SS, k_SS, d_SS) - - m.Medium(pbl, "Holder 2", "SS", E_SS, nu_SS, k_SS, d_SS) - - m.Medium(pbl, "Pipe 1", "SS", E_SS, nu_SS, k_SS, d_SS) - m.Medium(pbl, "Pipe 2", "SS", E_SS, nu_SS, k_SS, d_SS) - m.Medium(pbl, "Pipe 3", "SS", E_SS, nu_SS, k_SS, d_SS) - - m.Medium(pbl, "Washer 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Shaft 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Bolt 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Bolt 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Bolt 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Nut 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Spacer 1 part 1", "CuCrZr", - E_CuCrZr, nu_CuCrZr, k_CuCrZr, d_CuCrZr) - m.Medium(pbl, "Spacer 2 part 1", "CuCrZr", - E_CuCrZr, nu_CuCrZr, k_CuCrZr, d_CuCrZr) - m.Medium(pbl, "Spacer 3 part 1", "CuCrZr", - E_CuCrZr, nu_CuCrZr, k_CuCrZr, d_CuCrZr) - - m.Medium(pbl, "Spacer 1 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 2 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 3 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - m.Dirichlet(pbl, "Holder x clamping", "Clamped", 1, - 0., 0, 0., 0, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder y-z clamping", "Clamped", 0, - 0., 1, 0., 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Cooling channels", "Clamped", 0, - 0., 0, 0., 0, 0., 1, 70., ensemble_size) - - zero = np.zeros(ensemble_size) - hf = (70/0.0121) * np.ones(ensemble_size) # 70 W / (0.0121 m^2) - - m.Neumann(pbl, "Mirror surface", "heat fluxes", 0, - zero, 0, zero, 0, zero, 1, hf, ensemble_size) - - m.Source(pbl, "Mirror", "ihg", 70E6) - m.Source(pbl, "Substrate", "ihg", 2.45E6) - m.Source(pbl, "Holder", "ihg", 0.7E6) - m.Source(pbl, "Holder 2", "ihg", 0.7E6) - m.Source(pbl, "Pipe 1", "ihg", 0.7E6) - m.Source(pbl, "Pipe 2", "ihg", 0.7E6) - m.Source(pbl, "Pipe 3", "ihg", 0.7E6) - - m.Source(pbl, "Spacer 1 part 1", "ihg", 0.7E6) - m.Source(pbl, "Spacer 2 part 1", "ihg", 0.7E6) - m.Source(pbl, "Spacer 3 part 1", "ihg", 0.7E6) - - m.Source(pbl, "Spacer 1 part 2", "ihg", 2.45E6) - m.Source(pbl, "Spacer 2 part 2", "ihg", 2.45E6) - m.Source(pbl, "Spacer 3 part 2", "ihg", 2.45E6) - - m.Source(pbl, "Shaft 1", "ihg", 0.7E6) - m.Source(pbl, "Shaft 2", "ihg", 0.7E6) - m.Source(pbl, "Shaft 3", "ihg", 0.7E6) - - m.Source(pbl, "Bolt 1", "ihg", 0.7E6) - m.Source(pbl, "Bolt 2", "ihg", 0.7E6) - m.Source(pbl, "Bolt 3", "ihg", 0.7E6) - - m.Source(pbl, "Nut 1", "ihg", 0.7E6) - m.Source(pbl, "Nut 2", "ihg", 0.7E6) - m.Source(pbl, "Nut 3", "ihg", 0.7E6) - - m.Source(pbl, "Washer 1", "ihg", 0.7E6) - m.Source(pbl, "Washer 2", "ihg", 0.7E6) - m.Source(pbl, "Washer 3", "ihg", 0.7E6) - - slv = m.IterativeSolver(pbl, args.k, solverList, 4, ensemble_size) - - if not args.nogui: - if rank == 0: - all_msh = gmsh.MeshLoader(mesh_name, work_dir).execute() - import katoptron.viewer as v - gui = v.MeshViewer(pbl, slv, all_msh) - gui.vmin = 0 - gui.vmax = 1 - gui.start() - else: - slv.start() - else: - slv.start() - ''' - - ## Extract results - if rank == 0: - import katoptron.utilities as u - - tag_name = "Mirror surface" - name_sol = "x_mm.txt" - - DOFperNode = 4 - - if siz > 1: - x,y,z,tri,sol = u.extract_2D_all_rotated(msh2, tag_name, DOFperNode, ensemble_size, name_sol,[0,1]) - else: - x,y,z,tri,sol = u.extract_2D_all_rotated(msh, tag_name, DOFperNode, ensemble_size, name_sol,[0,1]) - - Zernike_coeff, Zernike_functions, theta, rho = u.compute_Zernike(x,y,z,tri,sol[:,2],10,np.array([-0.015,0.005])) - - colors = {0:(0,0.4470,0.7410), 1:(0.8500,0.3250,0.0980), 2:(0.9290,0.6940,0.1250), 3:(0.4940,0.1840,0.5560), 4:(0.4660,0.6740,0.1880), 5:(0.3010,0.7450,0.9330), 6:(0.6350,0.0780,0.1840), 7:(0,0.4470,0.7410)} - - import matplotlib.pyplot as plt - #plt.style.use('ggplot') - - plt_linewidth = 4.0 - - print max(z) - print min(z) - - print max(sol[:,2]) - print min(sol[:,2]) - - print Zernike_coeff - - print u.check_optical_tolerance(Zernike_coeff, Zernike_functions, sol[:,2],"m") - - - for which_dof in range(0,DOFperNode): - levels = np.linspace(min(sol[:,which_dof]), max(sol[:,which_dof]), 15) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('jet') - plt.tricontour(x, y, tri, sol[:,which_dof], levels, linestyles='-', - colors='black', linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, sol[:,which_dof], levels) - #plt.triplot(x, y, tri) - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - - cb = fig.colorbar(axtri, orientation="horizontal") - if which_dof == 0: - cb.set_label('displacement along x [m]', rotation=0) - plt.savefig("ux.pdf", transparent=True, bbox_inches='tight', pad_inches=0.05) - elif which_dof == 1: - cb.set_label('displacement along y [m]', rotation=0) - plt.savefig("uy.pdf", transparent=True, bbox_inches='tight', pad_inches=0.05) - elif which_dof == 2: - cb.set_label('displacement along z [m]', rotation=0) - plt.savefig("uz.pdf", transparent=True, bbox_inches='tight', pad_inches=0.05) - elif which_dof == 3: - cb.set_label('Temperature [C]', rotation=0) - plt.savefig("T.pdf", transparent=True, bbox_inches='tight', pad_inches=0.05) - - #plt.minorticks_on() - #plt.gca().set_xticklabels([]) - #plt.gca().set_yticklabels([]) - #plt.gca().set_axis_off() - #plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0) - #plt.margins(0,0) - #plt.gca().xaxis.set_major_locator(plt.NullLocator()) - #plt.gca().yaxis.set_major_locator(plt.NullLocator()) - - zernike_fit = np.dot(Zernike_functions,Zernike_coeff) - - levels = np.linspace(min(zernike_fit), max(zernike_fit), 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('jet') - plt.tricontour(x, y, tri, zernike_fit, levels, linestyles='-', - colors='black', linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, zernike_fit, levels) - #plt.triplot(x, y, tri) - plt.gca().set_aspect('equal') - - cb = fig.colorbar(axtri) - - levels = np.linspace(min(sol[:,2]-zernike_fit), max(sol[:,2]-zernike_fit), 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('jet') - plt.tricontour(x, y, tri, sol[:,2]-zernike_fit, levels, linestyles='-', - colors='black', linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, sol[:,2]-zernike_fit, levels) - #plt.triplot(x, y, tri) - plt.gca().set_aspect('equal') - - cb = fig.colorbar(axtri) - - - - plt.show() - ''' - from fwk.testing import * - tests = CTests() - tests.add(CTest('mean(Tbottom)', 0, 0)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/broken/M1_assembly_fused_mm.py b/katoptron/Juelich/broken/M1_assembly_fused_mm.py deleted file mode 100644 index e0d0f5f2..00000000 --- a/katoptron/Juelich/broken/M1_assembly_fused_mm.py +++ /dev/null @@ -1,355 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - from fwk.wutils import parseargs - args = parseargs() - - from PyTrilinos import Teuchos - import numpy as np - - mueluParams = Teuchos.ParameterList() - #mueluParamsSub1 = Teuchos.ParameterList() - #mueluParamsSub1['PDE equations'] = 4 - #mueluParams['Matrix'] = mueluParamsSub1 - mueluParams['number of equations'] = 4 - mueluParams['max levels'] = 1 - mueluParams['multigrid algorithm'] = "unsmoothed" - mueluParams['smoother: type'] = "RELAXATION" - mueluParams['coarse: max size'] = 3000 - - mueluParamsSub2 = Teuchos.ParameterList() - - mueluParamsSub2['relaxation: type'] = "Symmetric Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 5 - mueluParamsSub2['relaxation: damping factor'] = 1.25 - - mueluParams['coarse: type'] = "Klu" - mueluParams['verbosity'] = "low" - - mueluParamsSub3 = Teuchos.ParameterList() - - mueluParamsSub3['relaxation: type'] = "Symmetric Gauss-Seidel" - mueluParamsSub3['relaxation: sweeps'] = 4 - mueluParamsSub3['relaxation: damping factor'] = 1.25 - - mueluParams['smoother: params'] = mueluParamsSub2 - #mueluParams['coarse: params'] = mueluParamsSub3 - - solverList = Teuchos.ParameterList() - solverList['type'] = "BlockGmres" - solverList['Convergence Tolerance'] = 10**(-7) - solverList['Maximum Iterations'] = 2000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - solverList['mueluParams'] = mueluParams - - solverList['Use preconditioner'] = True - - solverList['Maximum active set iteration'] = 10 - - solverList['Print Teuchos timers'] = True - #solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - geo_name = 'MIRROR_1_ASSEMBLY_fused_mm.msh' - mesh_name = 'MIRROR_1_ASSEMBLY_fused_mm.msh' - - import shlex - import subprocess - import os - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - #solverList["MueLu xml file name"] = file_dir + '/finest_level_prec_2.xml' - solverList["MueLu xml file name"] = file_dir + \ - '/nested_multigrid_2_lvls_old.xml' - #solverList["MueLu xml file name"] = file_dir + '/nested_multigrid_2_lvls_chebyshev_heat.xml' - #solverList["MueLu xml file name"] = file_dir + '/nested_multigrid_2_lvls_chebyshev.xml' - - if rank == 0: - command_line = 'gmsh -3 ' + file_dir + '/mesh/' + geo_name + \ - ' -o ' + work_dir + '/' + mesh_name + ' -part ' + str(siz) - print(command_line) - tmp = shlex.split(command_line) - fileout = open('gmsh.log', 'w') - p = subprocess.Popen(tmp, stdin=subprocess.PIPE, stdout=fileout, - stderr=fileout, env=os.environ, shell=False, close_fds=True) - retcode = p.wait() - for i in range(1, siz): - comm.send(1, dest=i, tag=11) - else: - data = comm.recv(source=0, tag=11) - - if siz == 1: - msh = gmsh.MeshLoader(mesh_name, work_dir).execute() - else: - msh = gmsh.MeshLoader(mesh_name, work_dir).myrank_execute(rank) - - pbl = m.Problem(msh, comm) - - # Distance in the mesh are represented in minimeters - - ensemble_size = 1 - - # 379 000 MPa = 379 GPa = 379E9 Pa - E_rhodium = 379000 * np.ones(ensemble_size) - nu_rhodium = 0.26 * np.ones(ensemble_size) - # 0.150 kW/(m K) = 150 W/(m K) = 0.150 W/(mm K) - k_rhodium = 0.150 - d_rhodium = 0.781E-05 - - E_WCu = 280000 * np.ones(ensemble_size) - nu_WCu = 0.298 * np.ones(ensemble_size) - k_WCu = 0.180 - d_WCu = 0.88E-05 - - E_SS = 200000 * np.ones(ensemble_size) - nu_SS = 0.3 * np.ones(ensemble_size) - k_SS = 0.0153 - d_SS = 1.57E-05 - - E_CuCrZr = 118000 * np.ones(ensemble_size) - nu_CuCrZr = 0.33 * np.ones(ensemble_size) - k_CuCrZr = 0.345 - d_CuCrZr = 1.8E-05 - - E_I718 = 183000 * np.ones(ensemble_size) - nu_I718 = 0.31 * np.ones(ensemble_size) - k_I718 = 0.0158 - d_I718 = 1.38E-05 - - T_ref = 22. - - m.Medium(pbl, "Mirror", "rhodium", E_rhodium, - nu_rhodium, k_rhodium, d_rhodium) - m.Medium(pbl, "Substrate", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - m.Medium(pbl, "Holder", "SS", E_SS, nu_SS, k_SS, d_SS) - - m.Medium(pbl, "Washer 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Shaft 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Nut 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Spacer 1 part 1", "CuCrZr", - E_CuCrZr, nu_CuCrZr, k_CuCrZr, d_CuCrZr) - m.Medium(pbl, "Spacer 2 part 1", "CuCrZr", - E_CuCrZr, nu_CuCrZr, k_CuCrZr, d_CuCrZr) - m.Medium(pbl, "Spacer 3 part 1", "CuCrZr", - E_CuCrZr, nu_CuCrZr, k_CuCrZr, d_CuCrZr) - - m.Medium(pbl, "Spacer 1 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 2 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 3 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - if 0: - m.Dirichlet(pbl, "Holder z clamping", "Clamped", 0, - 0., 0, 0., 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder x-y clamping", "Clamped", 1, - 0., 1, 0., 0, 0., 0, 0., ensemble_size) - else: - m.Dirichlet(pbl, "Holder z clamping points", "Clamped", - 0, 0., 0, 0., 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder y clamping points", "Clamped", - 0, 0., 1, 0., 0, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder x clamping points", "Clamped", - 1, 0., 0, 0., 0, 0., 0, 0., ensemble_size) - - m.Dirichlet(pbl, "Cooling channels", "Clamped", 0, 0., - 0, 0., 0, 0., 1, 70.-T_ref, ensemble_size) - - zero = np.zeros(ensemble_size) - hf = ((70 / (0.0121*1000**2))) * \ - np.ones(ensemble_size) # 70 W / (0.0121 m^2) - - m.Neumann(pbl, "Mirror surface", "heat fluxes", 0, - zero, 0, zero, 0, zero, 1, hf, ensemble_size) - - m.Source(pbl, "Mirror", "ihg", 70E-03) - m.Source(pbl, "Substrate", "ihg", 2.45E-03) - m.Source(pbl, "Holder", "ihg", 0.7E-03) - - m.Source(pbl, "Spacer 1 part 1", "ihg", 0.6E-03) - m.Source(pbl, "Spacer 2 part 1", "ihg", 0.6E-03) - m.Source(pbl, "Spacer 3 part 1", "ihg", 0.6E-03) - - m.Source(pbl, "Spacer 1 part 2", "ihg", 2.45E-03) - m.Source(pbl, "Spacer 2 part 2", "ihg", 2.45E-03) - m.Source(pbl, "Spacer 3 part 2", "ihg", 2.45E-03) - - m.Source(pbl, "Shaft 1", "ihg", 0.8E-03) - m.Source(pbl, "Shaft 2", "ihg", 0.8E-03) - m.Source(pbl, "Shaft 3", "ihg", 0.8E-03) - - m.Source(pbl, "Nut 1", "ihg", 0.8E-03) - m.Source(pbl, "Nut 2", "ihg", 0.8E-03) - m.Source(pbl, "Nut 3", "ihg", 0.8E-03) - - m.Source(pbl, "Washer 1", "ihg", 0.8E-03) - m.Source(pbl, "Washer 2", "ihg", 0.8E-03) - m.Source(pbl, "Washer 3", "ihg", 0.8E-03) - - slv = m.IterativeSolver(pbl, args.k, solverList, 4, ensemble_size) - - slv.start() - - ''' - ## Extract results - if rank == 0: - import katoptron.utilities as u - - tag_name = "Mirror surface" - name_sol = "x_mm.txt" - - DOFperNode = 4 - - if siz > 1: - x,y,z,tri,sol = u.extract_2D_all(msh2, tag_name, DOFperNode, ensemble_size, name_sol) - else: - x,y,z,tri,sol = u.extract_2D_all(msh, tag_name, DOFperNode, ensemble_size, name_sol) - - Zernike_coeff, Zernike_functions, theta, rho = u.compute_Zernike(x,y,z,tri,sol[:,2],10,np.array([-0.015,0.005])) - - colors = {0:(0,0.4470,0.7410), 1:(0.8500,0.3250,0.0980), 2:(0.9290,0.6940,0.1250), 3:(0.4940,0.1840,0.5560), 4:(0.4660,0.6740,0.1880), 5:(0.3010,0.7450,0.9330), 6:(0.6350,0.0780,0.1840), 7:(0,0.4470,0.7410)} - - import matplotlib.pyplot as plt - from matplotlib import cm - #plt.style.use('ggplot') - - plt_linewidth = 4.0 - - print max(z) - print min(z) - - print max(sol[:,2]) - print min(sol[:,2]) - - print Zernike_coeff - - print u.check_optical_tolerance(Zernike_coeff, Zernike_functions, sol[:,2],"m") - - - for which_dof in range(0,DOFperNode): - levels = np.linspace(min(sol[:,which_dof]), max(sol[:,which_dof]), 15) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('jet') - plt.tricontour(x, y, tri, sol[:,which_dof], levels, linestyles='-', - colors='black', linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, sol[:,which_dof], levels, cmap='coolwarm') - #plt.triplot(x, y, tri) - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - - - - #coolwarm - - #cb = fig.colorbar(axtri, orientation="horizontal") - #x = np.linspace(0.0, 1.0, 15) - #rgb = cm.get_cmap('coolwarm')(x)[np.newaxis, :, :3] - #print rgb - - if which_dof == 0: - #cb.set_label('displacement along x [m]', rotation=0) - plt.savefig("ux.pdf", transparent=True, bbox_inches='tight', pad_inches=0.05) - print "ux" - print max(sol[:,which_dof]) - print min(sol[:,which_dof]) - elif which_dof == 1: - #cb.set_label('displacement along y [m]', rotation=0) - plt.savefig("uy.pdf", transparent=True, bbox_inches='tight', pad_inches=0.05) - print "uy" - print max(sol[:,which_dof]) - print min(sol[:,which_dof]) - elif which_dof == 2: - #cb.set_label('displacement along z [m]', rotation=0) - plt.savefig("uz.pdf", transparent=True, bbox_inches='tight', pad_inches=0.05) - print "uz" - print max(sol[:,which_dof]) - print min(sol[:,which_dof]) - elif which_dof == 3: - #cb.set_label('Temperature [C]', rotation=0) - plt.savefig("T.pdf", transparent=True, bbox_inches='tight', pad_inches=0.05) - print "T" - print max(sol[:,which_dof]) - print min(sol[:,which_dof]) - - #plt.minorticks_on() - #plt.gca().set_xticklabels([]) - #plt.gca().set_yticklabels([]) - #plt.gca().set_axis_off() - #plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0) - #plt.margins(0,0) - #plt.gca().xaxis.set_major_locator(plt.NullLocator()) - #plt.gca().yaxis.set_major_locator(plt.NullLocator()) - - zernike_fit = np.dot(Zernike_functions,Zernike_coeff) - - levels = np.linspace(min(zernike_fit), max(zernike_fit), 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('jet') - plt.tricontour(x, y, tri, zernike_fit, levels, linestyles='-', - colors='black', linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, zernike_fit, levels) - #plt.triplot(x, y, tri) - plt.gca().set_aspect('equal') - - cb = fig.colorbar(axtri) - - levels = np.linspace(min(sol[:,2]-zernike_fit), max(sol[:,2]-zernike_fit), 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('jet') - plt.tricontour(x, y, tri, sol[:,2]-zernike_fit, levels, linestyles='-', - colors='black', linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, sol[:,2]-zernike_fit, levels) - #plt.triplot(x, y, tri) - plt.gca().set_aspect('equal') - - cb = fig.colorbar(axtri) - - - - plt.show() - ''' - from fwk.testing import * - tests = CTests() - tests.add(CTest('mean(Tbottom)', 0, 0)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/broken/M1_assembly_mm.py b/katoptron/Juelich/broken/M1_assembly_mm.py deleted file mode 100644 index a73619ac..00000000 --- a/katoptron/Juelich/broken/M1_assembly_mm.py +++ /dev/null @@ -1,454 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh - - -def main(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print("info: MPI found") - except: - comm = None - rank = 0 - siz = 1 - name = "noname" - print("info: MPI not found => MPI disabled") - - from fwk.wutils import parseargs - args = parseargs() - - from PyTrilinos import Teuchos - import numpy as np - - mueluParams = Teuchos.ParameterList() - #mueluParamsSub1 = Teuchos.ParameterList() - #mueluParamsSub1['PDE equations'] = 4 - #mueluParams['Matrix'] = mueluParamsSub1 - mueluParams['number of equations'] = 4 - mueluParams['max levels'] = 5 - mueluParams['multigrid algorithm'] = "unsmoothed" - mueluParams['smoother: type'] = "RELAXATION" - mueluParams['coarse: max size'] = 3000 - - mueluParamsSub2 = Teuchos.ParameterList() - - mueluParamsSub2['relaxation: type'] = "Symmetric Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 5 - mueluParamsSub2['relaxation: damping factor'] = 1.25 - - mueluParams['coarse: type'] = "Klu" - mueluParams['verbosity'] = "low" - - mueluParamsSub3 = Teuchos.ParameterList() - - mueluParamsSub3['relaxation: type'] = "Symmetric Gauss-Seidel" - mueluParamsSub3['relaxation: sweeps'] = 4 - mueluParamsSub3['relaxation: damping factor'] = 1.25 - - mueluParams['smoother: params'] = mueluParamsSub2 - #mueluParams['coarse: params'] = mueluParamsSub3 - - solverList = Teuchos.ParameterList() - solverList['type'] = "BlockGmres" - solverList['Convergence Tolerance'] = 10**(-7) - solverList['Maximum Iterations'] = 2000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 100 - solverList['mueluParams'] = mueluParams - - solverList['Use preconditioner'] = True - - solverList['Maximum active set iteration'] = 10 - - solverList['Print Teuchos timers'] = True - #solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - geo_name = 'MIRROR_1_ASSEMBLY_mm.msh' - mesh_name = 'MIRROR_1_ASSEMBLY_mm.msh' - - import shlex - import subprocess - import os - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - #solverList["MueLu xml file name"] = file_dir + '/finest_level_prec_2.xml' - #solverList["MueLu xml file name"] = file_dir + '/finest_level_prec_simple_heat.xml' - solverList["MueLu xml file name"] = file_dir + \ - '/nested_multigrid_2_lvls_chebyshev_heat.xml' - #solverList["MueLu xml file name"] = file_dir + '/nested_multigrid_2_lvls_old.xml' - #solverList["MueLu xml file name"] = file_dir + '/nested_multigrid_2_lvls_chebyshev_heat.xml' - #solverList["MueLu xml file name"] = file_dir + '/nested_multigrid_2_lvls_chebyshev.xml' - - if rank == 0: - command_line = 'gmsh -3 ' + file_dir + '/mesh/' + geo_name + \ - ' -o ' + work_dir + '/' + mesh_name + ' -part ' + str(siz) - print(command_line) - tmp = shlex.split(command_line) - fileout = open('gmsh.log', 'w') - p = subprocess.Popen(tmp, stdin=subprocess.PIPE, stdout=fileout, - stderr=fileout, env=os.environ, shell=False, close_fds=True) - retcode = p.wait() - for i in range(1, siz): - comm.send(1, dest=i, tag=11) - else: - data = comm.recv(source=0, tag=11) - - if siz == 1: - msh = gmsh.MeshLoader(mesh_name, work_dir).execute() - else: - msh = gmsh.MeshLoader(mesh_name, work_dir).myrank_execute(rank) - - pbl = m.Problem(msh, comm) - - # Distance in the mesh are represented in minimeters - - ensemble_size = 1 - - # 379 000 MPa = 379 GPa = 379E9 Pa - E_rhodium = 379000 * np.ones(ensemble_size) - nu_rhodium = 0.26 * np.ones(ensemble_size) - # 0.150 kW/(m K) = 150 W/(m K) = 0.150 W/(mm K) - k_rhodium = 0.150 - d_rhodium = 0.781E-05 - - E_WCu = 280000 * np.ones(ensemble_size) - nu_WCu = 0.26 * np.ones(ensemble_size) - k_WCu = 0.180 - d_WCu = 0.88E-05 - - E_SS = 180000 * np.ones(ensemble_size) - nu_SS = 0.26 * np.ones(ensemble_size) - k_SS = 0.020 - d_SS = 1.6E-05 - - E_CuCrZr = 130000 * np.ones(ensemble_size) - nu_CuCrZr = 0.26 * np.ones(ensemble_size) - k_CuCrZr = 0.280 - d_CuCrZr = 1.6E-05 - - E_I718 = 180000 * np.ones(ensemble_size) - nu_I718 = 0.26 * np.ones(ensemble_size) - k_I718 = 0.020 - d_I718 = 1.4E-05 - - T_ref = 22. - - m.Medium(pbl, "Mirror", "rhodium", E_rhodium, - nu_rhodium, k_rhodium, d_rhodium) - m.Medium(pbl, "Substrate", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - m.Medium(pbl, "Holder", "SS", E_SS, nu_SS, k_SS, d_SS) - - m.Medium(pbl, "Washer 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Shaft 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Nut 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Spacer 1 part 1", "CuCrZr", - E_CuCrZr, nu_CuCrZr, k_CuCrZr, d_CuCrZr) - m.Medium(pbl, "Spacer 2 part 1", "CuCrZr", - E_CuCrZr, nu_CuCrZr, k_CuCrZr, d_CuCrZr) - m.Medium(pbl, "Spacer 3 part 1", "CuCrZr", - E_CuCrZr, nu_CuCrZr, k_CuCrZr, d_CuCrZr) - - m.Medium(pbl, "Spacer 1 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 2 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 3 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - if 1: - m.Dirichlet(pbl, "Holder z clamping", "Clamped", 0, - 0., 0, 0., 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder x-y clamping", "Clamped", 1, - 0., 1, 0., 0, 0., 0, 0., ensemble_size) - else: - m.Dirichlet(pbl, "Holder z clamping points", "Clamped", - 0, 0., 0, 0., 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder y clamping points", "Clamped", - 0, 0., 1, 0., 0, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder x clamping points", "Clamped", - 1, 0., 0, 0., 0, 0., 0, 0., ensemble_size) - - m.Dirichlet(pbl, "Cooling channels", "Clamped", 0, 0., - 0, 0., 0, 0., 1, 70.-T_ref, ensemble_size) - - zero = np.zeros(ensemble_size) - hf = ((70 / (0.0121*1000**2))) * \ - np.ones(ensemble_size) # 70 W / (0.0121 m^2) - - m.Neumann(pbl, "Mirror surface", "heat fluxes", 0, - zero, 0, zero, 0, zero, 1, hf, ensemble_size) - - m.Source(pbl, "Mirror", "ihg", 70E-03) - m.Source(pbl, "Substrate", "ihg", 2.45E-03) - m.Source(pbl, "Holder", "ihg", 0.7E-03) - - m.Source(pbl, "Spacer 1 part 1", "ihg", 0.7E-03) - m.Source(pbl, "Spacer 2 part 1", "ihg", 0.7E-03) - m.Source(pbl, "Spacer 3 part 1", "ihg", 0.7E-03) - - m.Source(pbl, "Spacer 1 part 2", "ihg", 2.45E-03) - m.Source(pbl, "Spacer 2 part 2", "ihg", 2.45E-03) - m.Source(pbl, "Spacer 3 part 2", "ihg", 2.45E-03) - - m.Source(pbl, "Shaft 1", "ihg", 0.7E-03) - m.Source(pbl, "Shaft 2", "ihg", 0.7E-03) - m.Source(pbl, "Shaft 3", "ihg", 0.7E-03) - - m.Source(pbl, "Nut 1", "ihg", 0.7E-03) - m.Source(pbl, "Nut 2", "ihg", 0.7E-03) - m.Source(pbl, "Nut 3", "ihg", 0.7E-03) - - m.Source(pbl, "Washer 1", "ihg", 0.7E-03) - m.Source(pbl, "Washer 2", "ihg", 0.7E-03) - m.Source(pbl, "Washer 3", "ihg", 0.7E-03) - - norm1 = tbox.Vector3d(0, 0, -1) - norm2 = tbox.Vector3d(0, 0, 1) - - # Bolt 1 - cont = m.Contact(pbl, "Bolt 1 to holder", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - # cont.setInitialyOpen() - cont.setMaster(pbl, "Holder to bolt 1", norm1) - - cont = m.Contact(pbl, "Spacer 1 to holder", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Holder to spacer 1", norm1) - - cont = m.Contact(pbl, "Bolt 1 to washer 1", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Washer 1 to bolt 1", norm1) - - cont = m.Contact(pbl, "Spacer 1 to washer 1 part 1", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Washer 1 to spacer 1 part 1", norm1) - - cont = m.Contact(pbl, "Spacer 1 to washer 1 part 2", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Washer 1 to spacer 1 part 2", norm1) - - cont = m.Contact(pbl, "Spacer 1 to substrate", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Substrate to spacer 1", norm1) - - # Bolt 2 - cont = m.Contact(pbl, "Bolt 2 to holder", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Holder to bolt 2", norm1) - - cont = m.Contact(pbl, "Spacer 2 to holder", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Holder to spacer 2", norm1) - - cont = m.Contact(pbl, "Bolt 2 to washer 2", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Washer 2 to bolt 2", norm1) - - cont = m.Contact(pbl, "Spacer 2 to washer 2 part 1", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Washer 2 to spacer 2 part 1", norm1) - - cont = m.Contact(pbl, "Spacer 2 to washer 2 part 2", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Washer 2 to spacer 2 part 2", norm1) - - cont = m.Contact(pbl, "Spacer 2 to substrate", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Substrate to spacer 2", norm1) - - # Bolt 3 - cont = m.Contact(pbl, "Bolt 3 to holder", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Holder to bolt 3", norm1) - - cont = m.Contact(pbl, "Spacer 3 to holder", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Holder to spacer 3", norm1) - - cont = m.Contact(pbl, "Bolt 3 to washer 3", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Washer 3 to bolt 3", norm1) - - cont = m.Contact(pbl, "Spacer 3 to washer 3 part 1", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Washer 3 to spacer 3 part 1", norm1) - - cont = m.Contact(pbl, "Spacer 3 to washer 3 part 2", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Washer 3 to spacer 3 part 2", norm1) - - cont = m.Contact(pbl, "Spacer 3 to substrate", "contact", norm1, 0.) - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Substrate to spacer 3", norm1) - - slv = m.IterativeSolver(pbl, args.k, solverList, 4, ensemble_size) - - slv.start() - - ''' - ## Extract results - if rank == 0: - import katoptron.utilities as u - - tag_name = "Mirror surface" - name_sol = "x_mm.txt" - - DOFperNode = 4 - - if siz > 1: - x,y,z,tri,sol = u.extract_2D_all(msh2, tag_name, DOFperNode, ensemble_size, name_sol) - else: - x,y,z,tri,sol = u.extract_2D_all(msh, tag_name, DOFperNode, ensemble_size, name_sol) - - Zernike_coeff, Zernike_functions, theta, rho = u.compute_Zernike(x,y,z,tri,sol[:,2],10,np.array([-0.015,0.005])) - - colors = {0:(0,0.4470,0.7410), 1:(0.8500,0.3250,0.0980), 2:(0.9290,0.6940,0.1250), 3:(0.4940,0.1840,0.5560), 4:(0.4660,0.6740,0.1880), 5:(0.3010,0.7450,0.9330), 6:(0.6350,0.0780,0.1840), 7:(0,0.4470,0.7410)} - - import matplotlib.pyplot as plt - from matplotlib import cm - #plt.style.use('ggplot') - - plt_linewidth = 4.0 - - print max(z) - print min(z) - - print max(sol[:,2]) - print min(sol[:,2]) - - print Zernike_coeff - - print u.check_optical_tolerance(Zernike_coeff, Zernike_functions, sol[:,2],"m") - - - for which_dof in range(0,DOFperNode): - levels = np.linspace(min(sol[:,which_dof]), max(sol[:,which_dof]), 15) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('jet') - plt.tricontour(x, y, tri, sol[:,which_dof], levels, linestyles='-', - colors='black', linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, sol[:,which_dof], levels, cmap='coolwarm') - #plt.triplot(x, y, tri) - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - - - - #coolwarm - - #cb = fig.colorbar(axtri, orientation="horizontal") - #x = np.linspace(0.0, 1.0, 15) - #rgb = cm.get_cmap('coolwarm')(x)[np.newaxis, :, :3] - #print rgb - - if which_dof == 0: - #cb.set_label('displacement along x [m]', rotation=0) - plt.savefig("ux.pdf", transparent=True, bbox_inches='tight', pad_inches=0.05) - print "ux" - print max(sol[:,which_dof]) - print min(sol[:,which_dof]) - elif which_dof == 1: - #cb.set_label('displacement along y [m]', rotation=0) - plt.savefig("uy.pdf", transparent=True, bbox_inches='tight', pad_inches=0.05) - print "uy" - print max(sol[:,which_dof]) - print min(sol[:,which_dof]) - elif which_dof == 2: - #cb.set_label('displacement along z [m]', rotation=0) - plt.savefig("uz.pdf", transparent=True, bbox_inches='tight', pad_inches=0.05) - print "uz" - print max(sol[:,which_dof]) - print min(sol[:,which_dof]) - elif which_dof == 3: - #cb.set_label('Temperature [C]', rotation=0) - plt.savefig("T.pdf", transparent=True, bbox_inches='tight', pad_inches=0.05) - print "T" - print max(sol[:,which_dof]) - print min(sol[:,which_dof]) - - #plt.minorticks_on() - #plt.gca().set_xticklabels([]) - #plt.gca().set_yticklabels([]) - #plt.gca().set_axis_off() - #plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0) - #plt.margins(0,0) - #plt.gca().xaxis.set_major_locator(plt.NullLocator()) - #plt.gca().yaxis.set_major_locator(plt.NullLocator()) - - zernike_fit = np.dot(Zernike_functions,Zernike_coeff) - - levels = np.linspace(min(zernike_fit), max(zernike_fit), 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('jet') - plt.tricontour(x, y, tri, zernike_fit, levels, linestyles='-', - colors='black', linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, zernike_fit, levels) - #plt.triplot(x, y, tri) - plt.gca().set_aspect('equal') - - cb = fig.colorbar(axtri) - - levels = np.linspace(min(sol[:,2]-zernike_fit), max(sol[:,2]-zernike_fit), 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('jet') - plt.tricontour(x, y, tri, sol[:,2]-zernike_fit, levels, linestyles='-', - colors='black', linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, sol[:,2]-zernike_fit, levels) - #plt.triplot(x, y, tri) - plt.gca().set_aspect('equal') - - cb = fig.colorbar(axtri) - - - - plt.show() - ''' - from fwk.testing import * - tests = CTests() - tests.add(CTest('mean(Tbottom)', 0, 0)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/broken/M1_mirror_optic.py b/katoptron/Juelich/broken/M1_mirror_optic.py deleted file mode 100644 index 7647f64d..00000000 --- a/katoptron/Juelich/broken/M1_mirror_optic.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - -from fwk.testing import * -import matplotlib.tri as tri -from mpl_toolkits.mplot3d import Axes3D -from matplotlib import cm -import matplotlib.pyplot as plt -import katoptron.utilities as u -import numpy as np -import os -import matplotlib -matplotlib.use('TkAgg') # <-- THIS MAKES IT FAST! - - -def main(): - - file_dir = os.path.dirname(__file__) - - npzfile = np.load(file_dir+'/mirror_data_1A.npz') - x_1A = npzfile['x'] - y_1A = npzfile['y'] - z_1A = npzfile['z'] - sol_1A = npzfile['sol'] - tri_1A = npzfile['tri'] - dz_1A = npzfile['dz'] - - npzfile = np.load(file_dir+'/mirror_data_1B.npz') - x_1B = npzfile['x'] - y_1B = npzfile['y'] - z_1B = npzfile['z'] - sol_1B = npzfile['sol'] - tri_1B = npzfile['tri'] - dz_1B = npzfile['dz'] - - npzfile = np.load(file_dir+'/mirror_data_2A.npz') - x_2A = npzfile['x'] - y_2A = npzfile['y'] - z_2A = npzfile['z'] - sol_2A = npzfile['sol'] - tri_2A = npzfile['tri'] - dz_2A = npzfile['dz'] - - npzfile = np.load(file_dir+'/mirror_data_2B.npz') - x_2B = npzfile['x'] - y_2B = npzfile['y'] - z_2B = npzfile['z'] - sol_2B = npzfile['sol'] - tri_2B = npzfile['tri'] - dz_2B = npzfile['dz'] - - x = x_1A - y = y_1A - tri = tri_1A - dz = dz_1A - levels = np.linspace(min(dz), max(dz), 15) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('jet') - plt.tricontour(x, y, tri, dz, levels, linestyles='-', - colors='black', linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, dz, levels, cmap='coolwarm') - plt.plot(0.0365, 0.017, 'ko') - plt.gca().set_aspect('equal') - - fig = plt.figure(figsize=(16, 9)) - ax = fig.gca(projection='3d', proj_type='ortho') - ax.plot_trisurf(x, y, dz, triangles=tri, cmap='coolwarm') - plt.show() - - optical_coefficients_1A, dz_residual_1A = u.compute_RBM_Curvature_Irreg( - x_1A, y_1A, z_1A, tri_1A, dz_1A, "m", np.array([0.0365, 0.017])) - - optical_coefficients_1B, dz_residual_1B = u.compute_RBM_Curvature_Irreg( - x_1B, y_1B, z_1B, tri_1B, dz_1B, "m", np.array([0.0365, 0.017])) - - optical_coefficients_2A, dz_residual_2A = u.compute_RBM_Curvature_Irreg( - x_2A, y_2A, z_2A, tri_2A, dz_2A, "m", np.array([0.0365, 0.017])) - - optical_coefficients_2B, dz_residual_2B = u.compute_RBM_Curvature_Irreg( - x_2B, y_2B, z_2B, tri_2B, dz_2B, "m", np.array([0.0365, 0.017])) - - print(optical_coefficients_1A) - print(optical_coefficients_1B) - print(optical_coefficients_2A) - print(optical_coefficients_2B) - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/broken/M1_optic_test.py b/katoptron/Juelich/broken/M1_optic_test.py deleted file mode 100644 index c48f6945..00000000 --- a/katoptron/Juelich/broken/M1_optic_test.py +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from fwk.testing import * -import matplotlib.tri as tri -from mpl_toolkits.mplot3d import Axes3D -from matplotlib import cm -import matplotlib.pyplot as plt -import katoptron.utilities as u -import numpy as np -import os -import matplotlib -matplotlib.use('TkAgg') # <-- THIS MAKES IT FAST! - - -def rigid_body_mode(dz, theta_x, theta_y, x, y, x_c, y_c): - dz_test = np.zeros(x.shape) - dz_test = -np.sin(theta_x)*(y-y_c)+np.cos(theta_x)*dz_test - dz_test = -np.sin(theta_y)*(x-x_c)+np.cos(theta_y)*dz_test - dz_test = dz_test + dz - return dz_test - - -def main(): - - file_dir = os.path.dirname(__file__) - - npzfile = np.load(file_dir+'/mirror_data.npz') - x = npzfile['x'] - y = npzfile['y'] - z = np.zeros(x.shape) - tri = npzfile['tri'] - dz = npzfile['dz'] - - dz_1 = 0 - dz_2 = 0.5/1000 - dz_3 = 0.87/1000 - dz_4 = (-2. / 1000) - - theta_x_1 = 0 - theta_x_2 = 0.0015 - theta_x_3 = -0.0005 - theta_x_4 = -0.0002 - - theta_y_1 = -0.2 - theta_y_2 = -0.0005 - theta_y_3 = 0.0015 - theta_y_4 = 0.0008 - - passed_1 = 0 - passed_2 = 1 - passed_3 = 1 - passed_4 = 0 - - dz_test_1 = rigid_body_mode(dz_1, theta_x_1, theta_y_1, x, y, 0.069, 0.04) - dz_test_2 = rigid_body_mode(dz_2, theta_x_2, theta_y_2, x, y, 0.069, 0.04) - dz_test_3 = rigid_body_mode(dz_3, theta_x_3, theta_y_3, x, y, 0.069, 0.04) - dz_test_4 = rigid_body_mode(dz_4, theta_x_4, theta_y_4, x, y, 0.069, 0.04) - - ''' - levels = np.linspace(min(dz), max(dz), 15) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('jet') - plt.tricontour(x, y, tri, dz, levels, linestyles='-', - colors='black', linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, dz, levels, cmap='coolwarm') - plt.plot(0.069,0.04,'ko') - plt.gca().set_aspect('equal') - - fig = plt.figure(figsize=(16,9)) - ax = fig.gca(projection='3d', proj_type = 'ortho') - ax.plot_trisurf(x,y,dz_test_1,triangles=tri, cmap='coolwarm') - ''' - # plt.show() - - optical_coefficients_1, dz_residual_1 = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz_test_1, "m", np.array([0.069, 0.04])) - - optical_coefficients_2, dz_residual_2 = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz_test_2, "m", np.array([0.069, 0.04])) - - optical_coefficients_3, dz_residual_3 = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz_test_3, "m", np.array([0.069, 0.04])) - - optical_coefficients_4, dz_residual_4 = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz_test_4, "m", np.array([0.069, 0.04])) - - tests = CTests() - measured_dz_1 = optical_coefficients_1[0] - tests.add(CTest('piston mode test 1', measured_dz_1, dz_1*1000, 0.05)) - measured_dz_2 = optical_coefficients_2[0] - tests.add(CTest('piston mode test 2', measured_dz_2, dz_2*1000, 0.05)) - measured_dz_3 = optical_coefficients_3[0] - tests.add(CTest('piston mode test 3', measured_dz_3, dz_3*1000, 0.05)) - measured_dz_4 = optical_coefficients_4[0] - tests.add(CTest('piston mode test 4', measured_dz_4, dz_4*1000, 0.05)) - - measured_ry_1 = optical_coefficients_1[1] - tests.add(CTest('y rotation test 1', measured_ry_1, theta_y_1, 0.05)) - measured_ry_2 = optical_coefficients_2[1] - tests.add(CTest('y rotation test 2', measured_ry_2, theta_y_2, 0.05)) - measured_ry_3 = optical_coefficients_3[1] - tests.add(CTest('y rotation test 3', measured_ry_3, theta_y_3, 0.05)) - measured_ry_4 = optical_coefficients_4[1] - tests.add(CTest('y rotation test 4', measured_ry_4, theta_y_4, 0.05)) - - measured_rx_1 = optical_coefficients_1[2] - tests.add(CTest('x rotation test 1', measured_rx_1, theta_x_1, 0.05)) - measured_rx_2 = optical_coefficients_2[2] - tests.add(CTest('x rotation test 2', measured_rx_2, theta_x_2, 0.05)) - measured_rx_3 = optical_coefficients_3[2] - tests.add(CTest('x rotation test 3', measured_rx_3, theta_x_3, 0.05)) - measured_rx_4 = optical_coefficients_4[2] - tests.add(CTest('x rotation test 4', measured_rx_4, theta_x_4, 0.05)) - - measured_cur_1 = optical_coefficients_1[3] - tests.add(CTest('curvature change test 1', measured_cur_1, 0., 1e-10)) - measured_cur_2 = optical_coefficients_2[3] - tests.add(CTest('curvature change test 2', measured_cur_2, 0., 1e-10)) - measured_cur_3 = optical_coefficients_3[3] - tests.add(CTest('curvature change test 3', measured_cur_3, 0., 1e-10)) - measured_cur_4 = optical_coefficients_4[3] - tests.add(CTest('curvature change test 4', measured_cur_4, 0., 1e-10)) - - measured_irr_1 = optical_coefficients_1[4] - tests.add(CTest('irregularity change test 1', measured_irr_1, 0., 1e-10)) - measured_irr_2 = optical_coefficients_2[4] - tests.add(CTest('irregularity change test 2', measured_irr_2, 0., 1e-10)) - measured_irr_3 = optical_coefficients_3[4] - tests.add(CTest('irregularity change test 3', measured_irr_3, 0., 1e-10)) - measured_irr_4 = optical_coefficients_4[4] - tests.add(CTest('irregularity change test 4', measured_irr_4, 0., 1e-10)) - - blurred_1 = u.check_optical_tolerance(optical_coefficients_1, 'mm') - blurred_2 = u.check_optical_tolerance(optical_coefficients_2, 'mm') - blurred_3 = u.check_optical_tolerance(optical_coefficients_3, 'mm') - blurred_4 = u.check_optical_tolerance(optical_coefficients_4, 'mm') - tests.add(CTest('checl optical tolerance test 1', blurred_1, passed_1)) - tests.add(CTest('checl optical tolerance test 2', blurred_2, passed_2)) - tests.add(CTest('checl optical tolerance test 3', blurred_3, passed_3)) - tests.add(CTest('checl optical tolerance test 4', blurred_4, passed_4)) - - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/broken/M1_run.sh b/katoptron/Juelich/broken/M1_run.sh deleted file mode 100755 index 89d65119..00000000 --- a/katoptron/Juelich/broken/M1_run.sh +++ /dev/null @@ -1,4 +0,0 @@ -cd ~/dev/waves -python run.py -k 4 katoptron/tests/M1_assembly_fused_2.py -cd ~/dev/waves -python run.py -k 4 katoptron/tests/M1_assembly_fused_CuCrZr_holder_2.py diff --git a/katoptron/Juelich/mesh/contact_mirror_assembly_mm.brep b/katoptron/Juelich/mesh/contact_mirror_assembly_mm.brep deleted file mode 100644 index ca7538ed..00000000 --- a/katoptron/Juelich/mesh/contact_mirror_assembly_mm.brep +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc50b0325e534597e5c9910a18cbd71e5d5e515ebc09dae745057113e4c055f5 -size 797874 diff --git a/katoptron/Juelich/mesh/contact_mirror_assembly_mm.geo b/katoptron/Juelich/mesh/contact_mirror_assembly_mm.geo deleted file mode 100644 index bac97b4d..00000000 --- a/katoptron/Juelich/mesh/contact_mirror_assembly_mm.geo +++ /dev/null @@ -1,367 +0,0 @@ -// This .geo has been tested with gmsh 3.0.6 and 4.4.1 binaries for Mac and Linux - -Macro Clear_all - allVolumes[] = Volume "*"; - Recursive Delete { Volume{allVolumes[] } ; } - allSurfaces[] = Surface "*"; - Recursive Delete { Surface{allSurfaces[] } ; } - allPoints[] = Point "*"; - Recursive Delete { Point{allPoints[] } ; } -Return - -Macro Compute_next_avaible_point_id - allPoints[] = Point "*" ; - NallPoints = #allPoints[] ; - Printf("NallPoints %f",NallPoints); - next_avaible_point_id = 0; - compute_next_avaible_point_id_verbose = 0; - For i In {0:NallPoints-1} - If(compute_next_avaible_point_id_verbose) - Printf("Compute_next_avaible_point_id %g, %g",i,allPoints[i]); - EndIf - If(allPoints[i]>= next_avaible_point_id) - next_avaible_point_id = allPoints[i] + 1; - EndIf - EndFor - Printf("Compute_next_avaible_point_id newp %g",newp); - Printf("Compute_next_avaible_point_id next_avaible_point_id %g",next_avaible_point_id); -Return - -Macro Scale_axis_mm_to_m - allPoints[] = Point "*" ; - allLines[] = Line "*" ; - allSurfaces[] = Surface "*"; - allVolumes[] = Volume "*"; - If(usePointID) - c1[] = Point{point_OO}; - EndIf - Dilate {{-c1[0],-c1[1],-c1[2]},0.001} { Volume{allVolumes[] } ; } - - allPoints[] = Point "*" ; - allLines[] = Line "*" ; - allSurfaces[] = Surface "*"; - allVolumes[] = Volume "*"; -Return - -Macro Weld_bolt - new_weld_line_loop = newreg; - Curve Loop(new_weld_line_loop) = curves_id_1[]; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, 0.026} { - Surface{new_weld_line_loop}; - }; - new_volume_1 = num[1]; - num[] = Extrude {0, 0, -0.012} { - Surface{new_weld_line_loop}; - }; - new_volume_2 = num[1]; - new_weld_line_loop = newreg; - Curve Loop(new_weld_line_loop) = curves_id_2[]; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, 0.002} { - Surface{new_weld_line_loop}; - }; - new_volume_3 = num[1]; - new_weld_line_loop = newreg; - Curve Loop(new_weld_line_loop) = curves_id_3[]; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, -0.006} { - Surface{new_weld_line_loop}; - }; - new_volume_4 = num[1]; - num[] = BooleanUnion{ Volume{volume_id_1}; Delete; }{ Volume{volume_id_2}; Volume{volume_id_3}; Volume{volume_id_4}; Volume{volume_id_5}; Volume{volume_id_6}; Volume{volume_id_7}; Volume{volume_id_8}; Volume{volume_id_9}; Volume{new_volume_1}; Volume{new_volume_2}; Volume{new_volume_3}; Volume{new_volume_4}; Delete; }; - new_volume_1 = num[0]; -Return - -Macro Weld_tube - c1[] = Point{pipe_p1}; - c2[] = Point{pipe_p2}; - center1[] = {(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2}; - pipe_radius = Sqrt((c1[0]-center1[0])^2+(c1[1]-center1[1])^2+(c1[2]-center1[2])^2); - - c1[] = Point{weld_p1}; - c2[] = Point{weld_p5}; - center1[] = {(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2}; - weld_radius = Sqrt((c1[0]-center1[0])^2+(c1[1]-center1[1])^2+(c1[2]-center1[2])^2); - - new_weld_p1 = newp; - Point(new_weld_p1) = {(pipe_radius/weld_radius)*(c1[0]-center1[0])+center1[0],(pipe_radius/weld_radius)*(c1[1]-center1[1])+center1[1],(pipe_radius/weld_radius)*(c1[2]-center1[2])+center1[2]}; - new_weld_line1 = newreg; Line(new_weld_line1) = {new_weld_p1, weld_p2}; - new_weld_line2 = newreg; Line(new_weld_line2) = {weld_p2, weld_p3}; - new_weld_line3 = newreg; Line(new_weld_line3) = {weld_p3, weld_p4}; - new_weld_line4 = newreg; Line(new_weld_line4) = {weld_p4, new_weld_p1}; - - new_weld_line_loop = newreg; Line Loop(new_weld_line_loop) = {new_weld_line1,new_weld_line2,new_weld_line3,new_weld_line4}; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - - c1[]=Point{weld_p3}; - c2[]=Point{weld_p4}; - - Extrude {{c2[0]-c1[0],c2[1]-c1[1],c2[2]-c1[2]}, {center1[0], center1[1], center1[2]}, Pi} { - Surface{new_weld_line_loop}; - } - Extrude {{c2[0]-c1[0],c2[1]-c1[1],c2[2]-c1[2]}, {center1[0], center1[1], center1[2]}, -Pi} { - Surface{new_weld_line_loop}; - } -Return - -Macro Compute_cross_and_theta - norm_1 = Sqrt(vec_1[0]^2+vec_1[1]^2+vec_1[2]^2); - norm_2 = Sqrt(vec_2[0]^2+vec_2[1]^2+vec_2[2]^2); - - cross[] = {vec_1[1]*vec_2[2]-vec_1[2]*vec_2[1],vec_1[2]*vec_2[0]-vec_1[0]*vec_2[2],vec_1[0]*vec_2[1]-vec_1[1]*vec_2[0]}; - norm_cross = Sqrt(cross[0]^2+cross[1]^2+cross[2]^2); - - dot = vec_1[0]*vec_2[0] + vec_1[1]*vec_2[1] + vec_1[2]*vec_2[2]; - - theta = Acos(dot/(norm_1*norm_2)); -Return - -Macro Rotate_Axis - allVolumes[] = Volume "*"; - If(usePointID) - c1[] = Point{point_OX_1}; - c2[] = Point{point_OX_2}; - Printf("Rotate_Axis point_OX_1 c1 (%g,%g,%g)",c1[0],c1[1],c1[2]); - Printf("Rotate_Axis point_OX_2 c2 (%g,%g,%g)",c2[0],c2[1],c2[2]); - EndIf - - OX[] = {c2[0]-c1[0],c2[1]-c1[1],c2[2]-c1[2]}; - vec_1[] = OX[]; - vec_2[] = {1,0,0}; - - Call Compute_cross_and_theta; - - Rotate {{cross[0],cross[1],cross[2]}, {0, 0, 0}, theta} { Volume{allVolumes[] } ; } - - allVolumes[] = Volume "*"; - If(usePointID) - c3[] = Point{point_OY_1}; - c4[] = Point{point_OY_2}; - Printf("Rotate_Axis point_OY_1 c3 (%g,%g,%g)",c3[0],c3[1],c3[2]); - Printf("Rotate_Axis point_OY_2 c4 (%g,%g,%g)",c4[0],c4[1],c4[2]); - EndIf - - OY[] = {c4[0]-c3[0],c4[1]-c3[1],c4[2]-c3[2]}; - vec_1[] = OY[]; - vec_2[] = {0,1,0}; - - Call Compute_cross_and_theta; - Rotate {{cross[0],cross[1],cross[2]}, {0, 0, 0}, theta} { Volume{allVolumes[] } ; } - -Return - -Macro Translate_Axis - allVolumes[] = Volume "*"; - If(usePointID) - c1[] = Point{point_OO}; - Printf("Translate_Axis point_OO c1 (%g,%g,%g)",c1[0],c1[1],c1[2]); - EndIf - Translate {-c1[0],-c1[1],-c1[2]} { Volume{allVolumes[] } ; } - allVolumes[] = Volume "*"; -Return - -Macro Contact_disk - c1[] = Point{point_disk_R_1}; - c2[] = Point{point_disk_R_2}; - - center[] = {(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2}; - - R = mR * Sqrt((c1[0]-center[0])^2+(c1[1]-center[1])^2+(c1[2]-center[2])^2); - - c1[] = Point{point_surface_disk_1}; - c2[] = Point{point_surface_disk_2}; - - new_disk = newreg; - Disk(new_disk) = {(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2, R, R}; - - Printf("c1 (%g,%g,%g)",c1[0],c1[1],c1[2]); - Printf("c2 (%g,%g,%g)",c2[0],c2[1],c2[2]); - Printf("Center (%g,%g,%g) radius %g",(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2, R) ; - - BooleanFragments{ Surface{new_disk}; Delete; }{ Volume{volume_id}; Delete; } -Return - -Macro Add_Optical_Axis - If(usePointID) - p1[] = Point{point_mirror_x}; - p2[] = Point{point_mirror_y}; - Printf("Add_Optical_Axis p1 (%g,%g,%g)",p1[0],p1[1],p1[2]); - Printf("Add_Optical_Axis p2 (%g,%g,%g)",p2[0],p2[1],p2[2]); - EndIf - - Printf("Add_Optical_Axis OA (%g,%g,%g)",p1[0]+Delta_x,p2[1]+Delta_y,p1[2]); - - Call Compute_next_avaible_point_id; - OA = next_avaible_point_id; - Point(OA) = {p1[0]+Delta_x, p2[1]+Delta_y, p1[2], 1}; - new_disk = newreg; - Disk(new_disk) = {p1[0]+Delta_x, p2[1]+Delta_y, p1[2], R, R}; - - BooleanFragments{ Point{OA}; Surface{new_disk}; Delete; }{ Volume{Mirror_id}; Delete; } - BooleanFragments{ Point{OA}; Delete; }{ Volume{Mirror_id}; Delete; } -Return - -SetFactory("OpenCASCADE"); - -rerun = 0; - -If(!FileExists("contact_mirror_assembly_mm.brep") || rerun) - v() = ShapeFromFile("mirror_assembly.stp"); - - For k In {20:23:1} - Recursive Delete { Volume{k}; } - EndFor - - For k In {27:62:1} - Recursive Delete { Volume{k}; } - EndFor - - volumes1[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,18,24,25,26}; - BooleanFragments{ Volume{volumes1[] }; Delete; }{} - - volumes2[] = {16,19}; - BooleanFragments{ Volume{volumes2[] }; Delete; }{} - - usePointID = 0; - - // Realign the axis - - If(usePointID) - point_OX_1 = 835; - point_OX_2 = 834; - - point_OY_1 = 938; - point_OY_2 = 940; - Else - c1[] = {6492.32979087,-145.832273844,4445.62173365}; - c2[] = {6411.66078991,-103.544497493,4385.74472425}; - - c3[] = {-7270.05243185,1092.57096931,2726.17090744}; - c4[] = {-7270.05243185,1128.49789026,2747.92536333}; - EndIf - - Call Rotate_Axis; - - If(usePointID) - point_OO = 938; - Else - c1[] = {-7294.05,2346.64,1780.06}; - EndIf - - Call Translate_Axis; - - Recursive Delete { Volume{3,17,18}; } - - mR = 1.25; - point_disk_R_1 = 4848; - point_disk_R_2 = 4849; - point_surface_disk_1 = 4760; - point_surface_disk_2 = 4758; - volume_id = 19; - Call Contact_disk; - - mR = 1.25; - point_disk_R_1 = 4815; - point_disk_R_2 = 4814; - point_surface_disk_1 = 4916; - point_surface_disk_2 = 4914; - volume_id = 19; - Call Contact_disk; - - mR = 1.25; - point_disk_R_1 = 4780; - point_disk_R_2 = 4781; - point_surface_disk_1 = 4924; - point_surface_disk_2 = 4925; - volume_id = 19; - Call Contact_disk; - - mR = 1.; - point_disk_R_1 = 4848; - point_disk_R_2 = 4849; - point_surface_disk_1 = 4332; - point_surface_disk_2 = 4330; - volume_id = 16; - Call Contact_disk; - - mR = 1.; - point_disk_R_1 = 4848; - point_disk_R_2 = 4849; - point_surface_disk_1 = 4975; - point_surface_disk_2 = 4974; - volume_id = 16; - Call Contact_disk; - - mR = 1.; - point_disk_R_1 = 4246; - point_disk_R_2 = 4245; - point_surface_disk_1 = 4968; - point_surface_disk_2 = 4967; - volume_id = 16; - Call Contact_disk; - - Save "contact_mirror_assembly_mm.brep"; - Call Clear_all; -EndIf - -Merge "contact_mirror_assembly_mm.brep"; - -Physical Volume("Mirror") = {2}; -Physical Volume("Substrate") = {1}; -Physical Volume("Washer 1") = {5}; -Physical Volume("Washer 2") = {4}; -Physical Volume("Washer 3") = {3}; - -Physical Volume("Shaft 1") = {8}; -Physical Volume("Shaft 2") = {7}; -Physical Volume("Shaft 3") = {6}; - -Physical Volume("Spacer 1 part 1") = {12}; -Physical Volume("Spacer 2 part 1") = {11}; -Physical Volume("Spacer 3 part 1") = {9}; - -Physical Volume("Spacer 1 part 2") = {14}; -Physical Volume("Spacer 2 part 2") = {13}; -Physical Volume("Spacer 3 part 2") = {10}; - -Physical Volume("Holder") = {15,16}; - -Physical Volume("Nut 1") = {18}; -Physical Volume("Nut 2") = {19}; -Physical Volume("Nut 3") = {17}; - -Physical Surface("Mirror surface") = {113}; - -Physical Surface("Cooling channels") = {508, 509, 525, 527, 523, 522, 498, 499, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 521, 520, 500, 501, 502, 503, 504, 505, 506, 507, 526, 600, 620, 621, 598, 599}; - -Physical Surface("Holder z clamping") = {563, 564, 574, 573, 546, 545}; -Physical Surface("Holder x-y clamping") = {548, 547, 570, 569, 555, 554}; - -Physical Surface("Holder to nut 1") = {644}; -Physical Surface("Holder to nut 2") = {645}; -Physical Surface("Holder to nut 3") = {643}; - -Physical Surface("Holder to spacer 1") = {372}; -Physical Surface("Holder to spacer 2") = {371}; -Physical Surface("Holder to spacer 3") = {363}; - -Physical Surface("Nut 1 to holder") = {680}; -Physical Surface("Nut 2 to holder") = {711}; -Physical Surface("Nut 3 to holder") = {649}; - -Physical Surface("Spacer 1 to holder") = {352}; -Physical Surface("Spacer 2 to holder") = {342}; -Physical Surface("Spacer 3 to holder") = {302}; - -Physical Point("Holder x-y-z clamping point") = {765}; -Physical Point("Holder z clamping point") = {743}; -Physical Point("Holder z-y clamping point") = {736}; - -Physical Point("Optical Axis") = {958}; - -Mesh.Algorithm = 6; -//Mesh.Algorithm3D = 4; -Mesh.CharacteristicLengthMin = 1.; -Mesh.CharacteristicLengthMax = 1.; -Mesh.MshFileVersion = 2.2; diff --git a/katoptron/Juelich/mesh/fused_mirror_assembly_all_mm.brep b/katoptron/Juelich/mesh/fused_mirror_assembly_all_mm.brep deleted file mode 100644 index 67f36e95..00000000 --- a/katoptron/Juelich/mesh/fused_mirror_assembly_all_mm.brep +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d0b2b76c0039cded13762bb53863c4415445213edaccec9464e2b45bea3d680 -size 2572367 diff --git a/katoptron/Juelich/mesh/fused_mirror_assembly_all_mm.geo b/katoptron/Juelich/mesh/fused_mirror_assembly_all_mm.geo deleted file mode 100644 index b6ec6110..00000000 --- a/katoptron/Juelich/mesh/fused_mirror_assembly_all_mm.geo +++ /dev/null @@ -1,694 +0,0 @@ -// This .geo has been tested with gmsh 3.0.6 and 4.4.1 binaries for Mac and Linux - -Macro Clear_all - allVolumes[] = Volume "*"; - Recursive Delete { Volume{allVolumes[] } ; } - allSurfaces[] = Surface "*"; - Recursive Delete { Surface{allSurfaces[] } ; } - allPoints[] = Point "*"; - Recursive Delete { Point{allPoints[] } ; } -Return - -Macro Compute_next_avaible_point_id - allPoints[] = Point "*" ; - NallPoints = #allPoints[] ; - Printf("NallPoints %f",NallPoints); - next_avaible_point_id = 0; - compute_next_avaible_point_id_verbose = 0; - For i In {0:NallPoints-1} - If(compute_next_avaible_point_id_verbose) - Printf("Compute_next_avaible_point_id %g, %g",i,allPoints[i]); - EndIf - If(allPoints[i]>= next_avaible_point_id) - next_avaible_point_id = allPoints[i] + 1; - EndIf - EndFor - Printf("Compute_next_avaible_point_id newp %g",newp); - Printf("Compute_next_avaible_point_id next_avaible_point_id %g",next_avaible_point_id); -Return - -Macro Scale_axis_mm_to_m - allPoints[] = Point "*" ; - allLines[] = Line "*" ; - allSurfaces[] = Surface "*"; - allVolumes[] = Volume "*"; - If(usePointID) - c1[] = Point{point_OO}; - EndIf - Dilate {{-c1[0],-c1[1],-c1[2]},0.001} { Volume{allVolumes[] } ; } - - allPoints[] = Point "*" ; - allLines[] = Line "*" ; - allSurfaces[] = Surface "*"; - allVolumes[] = Volume "*"; -Return - -Macro Weld_bolt - new_weld_line_loop = newreg; - Line Loop(new_weld_line_loop) = curves_id_1[]; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, 0.026} { - Surface{new_weld_line_loop}; - }; - new_volume_1 = num[1]; - num[] = Extrude {0, 0, -0.012} { - Surface{new_weld_line_loop}; - }; - new_volume_2 = num[1]; - new_weld_line_loop = newreg; - Line Loop(new_weld_line_loop) = curves_id_2[]; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, 0.002} { - Surface{new_weld_line_loop}; - }; - new_volume_3 = num[1]; - new_weld_line_loop = newreg; - Line Loop(new_weld_line_loop) = curves_id_3[]; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, -0.006} { - Surface{new_weld_line_loop}; - }; - new_volume_4 = num[1]; - num[] = BooleanUnion{ Volume{volume_id_1}; Delete; }{ Volume{volume_id_2}; Volume{volume_id_3}; Volume{volume_id_4}; Volume{volume_id_5}; Volume{volume_id_6}; Volume{volume_id_7}; Volume{volume_id_8}; Volume{volume_id_9}; Volume{new_volume_1}; Volume{new_volume_2}; Volume{new_volume_3}; Volume{new_volume_4}; Delete; }; - new_volume_1 = num[0]; -Return - -Macro Weld_bolt_2 - new_weld_line_loop = newreg; - Line Loop(new_weld_line_loop) = curves_id_1[]; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, 0.026} { - Surface{new_weld_line_loop}; - }; - new_volume_1 = num[1]; - num[] = Extrude {0, 0, -0.012} { - Surface{new_weld_line_loop}; - }; - new_volume_2 = num[1]; - new_weld_line_loop = newreg; - Line Loop(new_weld_line_loop) = curves_id_2[]; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, 0.002} { - Surface{new_weld_line_loop}; - }; - new_volume_3 = num[1]; - new_weld_line_loop = newreg; - Line Loop(new_weld_line_loop) = curves_id_3[]; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, -0.006} { - Surface{new_weld_line_loop}; - }; - new_volume_4 = num[1]; - new_weld_line_loop = newreg; - Line Loop(new_weld_line_loop) = curves_id_4[]; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, -6.25} { - Surface{new_weld_line_loop}; - }; - new_volume_5 = num[1]; - - Recursive Delete { Volume{volume_id_4, volume_id_5}; } - - num[] = BooleanUnion{ Volume{volume_id_1}; Delete; }{ Volume{volume_id_2}; Volume{volume_id_3}; Volume{volume_id_6}; Volume{volume_id_7}; Volume{volume_id_8}; Volume{volume_id_9}; Volume{new_volume_1}; Volume{new_volume_2}; Volume{new_volume_3}; Volume{new_volume_4}; Volume{new_volume_5}; Delete; }; - new_volume_1 = num[0]; -Return - -Macro Weld_tube - c1[] = Point{pipe_p1}; - c2[] = Point{pipe_p2}; - center1[] = {(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2}; - pipe_radius = Sqrt((c1[0]-center1[0])^2+(c1[1]-center1[1])^2+(c1[2]-center1[2])^2); - - c1[] = Point{weld_p1}; - c2[] = Point{weld_p5}; - center1[] = {(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2}; - weld_radius = Sqrt((c1[0]-center1[0])^2+(c1[1]-center1[1])^2+(c1[2]-center1[2])^2); - - new_weld_p1 = newp; - Point(new_weld_p1) = {(pipe_radius/weld_radius)*(c1[0]-center1[0])+center1[0],(pipe_radius/weld_radius)*(c1[1]-center1[1])+center1[1],(pipe_radius/weld_radius)*(c1[2]-center1[2])+center1[2]}; - new_weld_line1 = newreg; Line(new_weld_line1) = {new_weld_p1, weld_p2}; - new_weld_line2 = newreg; Line(new_weld_line2) = {weld_p2, weld_p3}; - new_weld_line3 = newreg; Line(new_weld_line3) = {weld_p3, weld_p4}; - new_weld_line4 = newreg; Line(new_weld_line4) = {weld_p4, new_weld_p1}; - - new_weld_line_loop = newreg; Line Loop(new_weld_line_loop) = {new_weld_line1,new_weld_line2,new_weld_line3,new_weld_line4}; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - - c1[]=Point{weld_p3}; - c2[]=Point{weld_p4}; - - Extrude {{c2[0]-c1[0],c2[1]-c1[1],c2[2]-c1[2]}, {center1[0], center1[1], center1[2]}, Pi} { - Surface{new_weld_line_loop}; - } - Extrude {{c2[0]-c1[0],c2[1]-c1[1],c2[2]-c1[2]}, {center1[0], center1[1], center1[2]}, -Pi} { - Surface{new_weld_line_loop}; - } -Return - -Macro Compute_cross_and_theta - norm_1 = Sqrt(vec_1[0]^2+vec_1[1]^2+vec_1[2]^2); - norm_2 = Sqrt(vec_2[0]^2+vec_2[1]^2+vec_2[2]^2); - - cross[] = {vec_1[1]*vec_2[2]-vec_1[2]*vec_2[1],vec_1[2]*vec_2[0]-vec_1[0]*vec_2[2],vec_1[0]*vec_2[1]-vec_1[1]*vec_2[0]}; - norm_cross = Sqrt(cross[0]^2+cross[1]^2+cross[2]^2); - - dot = vec_1[0]*vec_2[0] + vec_1[1]*vec_2[1] + vec_1[2]*vec_2[2]; - - theta = Acos(dot/(norm_1*norm_2)); -Return - -Macro Rotate_Axis - allVolumes[] = Volume "*"; - If(usePointID) - c1[] = Point{point_OX_1}; - c2[] = Point{point_OX_2}; - Printf("Rotate_Axis point_OX_1 c1 (%g,%g,%g)",c1[0],c1[1],c1[2]); - Printf("Rotate_Axis point_OX_2 c2 (%g,%g,%g)",c2[0],c2[1],c2[2]); - EndIf - - OX[] = {c2[0]-c1[0],c2[1]-c1[1],c2[2]-c1[2]}; - vec_1[] = OX[]; - vec_2[] = {1,0,0}; - - Call Compute_cross_and_theta; - - Rotate {{cross[0],cross[1],cross[2]}, {0, 0, 0}, theta} { Volume{allVolumes[] } ; } - - allVolumes[] = Volume "*"; - If(usePointID) - c3[] = Point{point_OY_1}; - c4[] = Point{point_OY_2}; - Printf("Rotate_Axis point_OY_1 c3 (%g,%g,%g)",c3[0],c3[1],c3[2]); - Printf("Rotate_Axis point_OY_2 c4 (%g,%g,%g)",c4[0],c4[1],c4[2]); - EndIf - - OY[] = {c4[0]-c3[0],c4[1]-c3[1],c4[2]-c3[2]}; - vec_1[] = OY[]; - vec_2[] = {0,1,0}; - - Call Compute_cross_and_theta; - - Rotate {{cross[0],cross[1],cross[2]}, {0, 0, 0}, theta} { Volume{allVolumes[] } ; } - -Return - -Macro Rotate_Axis_x - allVolumes[] = Volume "*"; - If(usePointID) - c1[] = Point{point_OX_1}; - c2[] = Point{point_OX_2}; - Printf("Rotate_Axis point_OX_1 c1 (%g,%g,%g)",c1[0],c1[1],c1[2]); - Printf("Rotate_Axis point_OX_2 c2 (%g,%g,%g)",c2[0],c2[1],c2[2]); - EndIf - - OX[] = {c2[0]-c1[0],c2[1]-c1[1],0.}; - vec_1[] = OX[]; - vec_2[] = {1,0,0}; - - Call Compute_cross_and_theta; - - Rotate {{cross[0],cross[1],cross[2]}, {0, 0, 0}, theta} { Volume{allVolumes[] } ; } - -Return - -Macro Rotate_Axis_1 - allVolumes[] = Volume "*"; - If(usePointID) - c1[] = Point{point_OX_1}; - c2[] = Point{point_OX_2}; - Printf("Rotate_Axis point_OX_1 c1 (%g,%g,%g)",c1[0],c1[1],c1[2]); - Printf("Rotate_Axis point_OX_2 c2 (%g,%g,%g)",c2[0],c2[1],c2[2]); - EndIf - - OX[] = {c2[0]-c1[0],c2[1]-c1[1],c2[2]-c1[2]}; - vec_1[] = OX[]; - vec_2[] = {1,0,0}; - - Call Compute_cross_and_theta; - - Rotate {{cross[0],cross[1],cross[2]}, {0, 0, 0}, theta} { Volume{allVolumes[] } ; } - - allVolumes[] = Volume "*"; - If(usePointID) - c3[] = Point{point_OY_1}; - c4[] = Point{point_OY_2}; - Printf("Rotate_Axis point_OY_1 c3 (%g,%g,%g)",c3[0],c3[1],c3[2]); - Printf("Rotate_Axis point_OY_2 c4 (%g,%g,%g)",c4[0],c4[1],c4[2]); - EndIf - - OY[] = {c4[0]-c3[0],c4[1]-c3[1],c4[2]-c3[2]}; - vec_1[] = OY[]; - vec_2[] = {0,1,0}; - - Call Compute_cross_and_theta; - - //Rotate {{cross[0],cross[1],cross[2]}, {0, 0, 0}, theta} { Volume{allVolumes[] } ; } - -Return - -Macro Translate_Axis - allVolumes[] = Volume "*"; - If(usePointID) - c1[] = Point{point_OO}; - Printf("Translate_Axis point_OO c1 (%g,%g,%g)",c1[0],c1[1],c1[2]); - EndIf - Translate {-c1[0],-c1[1],-c1[2]} { Volume{allVolumes[] } ; } - allVolumes[] = Volume "*"; -Return - -Macro Contact_disk - c1[] = Point{point_disk_R_1}; - c2[] = Point{point_disk_R_2}; - - center[] = {(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2}; - - R = Sqrt((c1[0]-center[0])^2+(c1[1]-center[1])^2+(c1[2]-center[2])^2); - - c1[] = Point{point_surface_disk_1}; - c2[] = Point{point_surface_disk_2}; - - new_disk = newreg; - Disk(new_disk) = {(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2, R, R}; - - Printf("c1 (%g,%g,%g)",c1[0],c1[1],c1[2]); - Printf("c2 (%g,%g,%g)",c2[0],c2[1],c2[2]); - Printf("Center (%g,%g,%g) radius %g",(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2, R) ; - - BooleanFragments{ Surface{new_disk}; Delete; }{ Volume{volume_id}; Delete; } -Return - -Macro Add_Optical_Axis - If(usePointID) - p1[] = Point{point_mirror_x}; - p2[] = Point{point_mirror_y}; - Printf("Add_Optical_Axis p1 (%g,%g,%g)",p1[0],p1[1],p1[2]); - Printf("Add_Optical_Axis p2 (%g,%g,%g)",p2[0],p2[1],p2[2]); - EndIf - - Printf("Add_Optical_Axis OA (%g,%g,%g)",p1[0]+Delta_x,p2[1]+Delta_y,p1[2]); - - Call Compute_next_avaible_point_id; - OA = next_avaible_point_id; - Point(OA) = {p1[0]+Delta_x, p2[1]+Delta_y, p1[2], 1}; - new_disk = newreg; - Disk(new_disk) = {p1[0]+Delta_x, p2[1]+Delta_y, p1[2], R, R}; - - BooleanFragments{ Point{OA}; Surface{new_disk}; Delete; }{ Volume{Mirror_id}; Delete; } - //BooleanFragments{ Point{OA}; Delete; }{ Volume{Mirror_id}; Delete; } -Return - -SetFactory("OpenCASCADE"); - -rerun = 0; - -If(!FileExists("fused_mirror_assembly_all_mm.brep") || rerun) - v() = ShapeFromFile("mirror_assembly.stp"); - - BooleanFragments{ Volume{1,2,3,7,8,9,17,18,24,25,26,27}; Delete; }{} - - BooleanFragments{ Volume{13,15}; Delete; }{} - BooleanFragments{ Volume{12,14}; Delete; }{} - BooleanFragments{ Volume{10,11}; Delete; }{} - - // Fuse pipe 1 - weld_p1 = 1477; - weld_p2 = 1478; - weld_p3 = 1473; - weld_p4 = 1471; - weld_p5 = 1475; - - pipe_p1 = 898; - pipe_p2 = 900; - - Call Weld_tube ; - - weld_p1 = 885; - weld_p2 = 886; - weld_p3 = 884; - weld_p4 = 882; - weld_p5 = 887; - - pipe_p1 = 907; - pipe_p2 = 908; - - Call Weld_tube ; - - Recursive Delete { Volume{20,32}; } - - // Fuse pipe 2 - weld_p1 = 893; - weld_p2 = 894; - weld_p3 = 892; - weld_p4 = 890; - weld_p5 = 895; - - pipe_p1 = 932; - pipe_p2 = 931; - - Call Weld_tube ; - - weld_p1 = 1483; - weld_p2 = 1484; - weld_p3 = 1482; - weld_p4 = 1480; - weld_p5 = 1485; - - pipe_p1 = 922; - pipe_p2 = 924; - - Call Weld_tube ; - Recursive Delete { Volume{21,33}; } - - // Fuse pipe 3 - weld_p1 = 1501; - weld_p2 = 1502; - weld_p3 = 1497; - weld_p4 = 1495; - weld_p5 = 1499; - - pipe_p1 = 1440; - pipe_p2 = 1439; - - Call Weld_tube ; - - Recursive Delete { Volume{35}; } - - // Fuse pipe 4 - weld_p1 = 1493; - weld_p2 = 1494; - weld_p3 = 1489; - weld_p4 = 1487; - weld_p5 = 1491; - - pipe_p1 = 1456; - pipe_p2 = 1455; - - Call Weld_tube ; - - Recursive Delete { Volume{34}; } - - usePointID = 0; - - // Realign the axis - If(usePointID) - point_OX_1 = 1928; - point_OX_2 = 1929; - - point_OY_1 = 1925; - point_OY_2 = 1927; - Else - c1[] = {6450.86,-90.1101,4467.16}; - c2[] = {6425.67,-76.908,4448.46}; - - c3[] = {-7294.05,1085.32,2738.15}; - c4[] = {-7294.05,1121.25,2759.9}; - EndIf - - Call Rotate_Axis; - - If(usePointID) - point_OO = 2008; - Else - c1[] = {-7294.05,2346.64,1780.06}; - EndIf - - Call Translate_Axis; - - c1[] = Point{7521}; - c2[] = Point{7519}; - Dilate {{(c1[0]+c2[0])/2.,(c1[1]+c2[1])/2.,(c1[2]+c2[2])/2.}, {0.98, 0.98, 0.98}} { Volume{37} ; } - - c1[] = Point{7538}; - c2[] = Point{7545}; - Dilate {{(c1[0]+c2[0])/2.,(c1[1]+c2[1])/2.,(c1[2]+c2[2])/2.}, {0.98, 0.98, 1.}} { Volume{38} ; } - - /* - c1[] = Point{7713}; - c2[] = Point{7715}; - Dilate {{(c1[0]+c2[0])/2.,(c1[1]+c2[1])/2.,(c1[2]+c2[2])/2.}, {1.1, 1.1, 1.1}} { Volume{51} ; } - - c1[] = Point{7777}; - c2[] = Point{7779}; - Dilate {{(c1[0]+c2[0])/2.,(c1[1]+c2[1])/2.,(c1[2]+c2[2])/2.}, {1.1, 1.1, 1.1}} { Volume{56} ; } - - c1[] = Point{7501}; - c2[] = Point{7506}; - Dilate {{(c1[0]+c2[0])/2.,(c1[1]+c2[1])/2.,(c1[2]+c2[2])/2.}, {1.1, 1.1, 1.1}} { Volume{36} ; } - - c1[] = Point{7736}; - c2[] = Point{7737}; - Dilate {{(c1[0]+c2[0])/2.,(c1[1]+c2[1])/2.,(c1[2]+c2[2])/2.}, {1.2, 1.2, 1.}} { Volume{53} ; } - - c1[] = Point{7855}; - c2[] = Point{7855}; - Dilate {{(c1[0]+c2[0])/2.,(c1[1]+c2[1])/2.,(c1[2]+c2[2])/2.}, {1.2, 1.2, 1.}} { Volume{62} ; } - - c1[] = Point{7620}; - c2[] = Point{7619}; - Dilate {{(c1[0]+c2[0])/2.,(c1[1]+c2[1])/2.,(c1[2]+c2[2])/2.}, {1.2, 1.2, 1.}} { Volume{44} ; } -*/ - curves_id_1[] = {12528, 12529, 12519, 12525}; - curves_id_2[] = {12475, 12482, 12470, 12469}; - curves_id_3[] = {12399, 12396}; - curves_id_4[] = {12484, 12485}; - volume_id_1 = 45; - volume_id_2 = 50; - volume_id_3 = 51; - volume_id_4 = 48; - volume_id_5 = 49; - volume_id_6 = 52; - volume_id_7 = 53; - volume_id_8 = 46; - volume_id_9 = 47; - Call Weld_bolt_2; - - new_weld_line_loop = newreg; - Line Loop(new_weld_line_loop) = { 13117, 13118, 13119, 13120, 13121, 13122, 13123, 13124}; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, 5} { - Surface{new_weld_line_loop}; - }; - new_volume_2 = num[1]; - num[] = Extrude {0, 0, -11} { - Surface{new_weld_line_loop}; - }; - new_volume_3 = num[1]; - - new_weld_line_loop = newreg; - Line Loop(new_weld_line_loop) = {13089, 13080, 13079, 13078}; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, 2} { - Surface{new_weld_line_loop}; - }; - new_volume_4 = num[1]; - - BooleanUnion{ Volume{new_volume_1}; Delete; }{ Volume{new_volume_2}; Volume{new_volume_3}; Volume{new_volume_4}; Delete; } - - curves_id_1[] = {13014, 13027, 13028, 13017}; - curves_id_2[] = {12349, 12355, 12362, 12350}; - curves_id_3[] = {12978, 12975}; - curves_id_4[] = {12364, 12365}; - volume_id_1 = 36; - volume_id_2 = 37; - volume_id_3 = 38; - volume_id_4 = 42; - volume_id_5 = 43; - volume_id_6 = 39; - volume_id_7 = 44; - volume_id_8 = 40; - volume_id_9 = 41; - Call Weld_bolt_2; - - new_weld_line_loop = newreg; - Line Loop(new_weld_line_loop) = {13235, 13236, 13237, 13240, 13241, 13242}; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, 20} { - Surface{new_weld_line_loop}; - }; - new_volume_2 = num[1]; - num[] = Extrude {0, 0, -5} { - Surface{new_weld_line_loop}; - }; - new_volume_3 = num[1]; - - new_weld_line_loop = newreg; - Line Loop(new_weld_line_loop) = {13218, 13220, 13223, 13224}; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, 2} { - Surface{new_weld_line_loop}; - }; - new_volume_4 = num[1]; - num[] = Extrude {0, 0, -0.07} { - Surface{new_weld_line_loop}; - }; - new_volume_5 = num[1]; - - BooleanUnion{ Volume{79}; Delete; }{ Volume{80}; Volume{new_volume_2}; Volume{new_volume_3}; Volume{new_volume_4}; Volume{new_volume_5}; Delete; } - BooleanUnion{ Volume{79}; Delete; }{ Volume{80}; Delete; } - - curves_id_1[] = {12619, 12622, 12628, 12629}; - curves_id_2[] = {12652, 12658, 12665, 12653}; - curves_id_3[] = {12583, 12580}; - curves_id_4[] = {12668, 12667}; - volume_id_1 = 54; - volume_id_2 = 55; - volume_id_3 = 56; - volume_id_4 = 57; - volume_id_5 = 58; - volume_id_6 = 61; - volume_id_7 = 62; - volume_id_8 = 59; - volume_id_9 = 60; - //Call Weld_bolt_2; - - c1[] = Point{7855}; - c2[] = Point{7853}; - - c3[] = Point{7761}; - - c4[] = Point{7776}; - c5[] = Point{7778}; - - dz = c3[2]-c1[2]; - - center[] = {(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2}; - - D = Sqrt((c4[0]-c5[0])^2+(c4[1]-c5[1])^2+(c4[2]-c5[2])^2); - R = D/2.; - - Recursive Delete { Volume{56}; } - - Cylinder(56) = {center[0],center[1],center[2], 0, 0, dz, R, 2*Pi}; - - Call Weld_bolt_2; - - //+ - //BooleanUnion{ Volume{24}; Delete; }{ Volume{25}; Delete; } - - /* - new_weld_line_loop = newreg; - Line Loop(new_weld_line_loop) = {13449, 13448, 13447, 13446, 13445, 13444, 13443, 13442}; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, 20} { - Surface{new_weld_line_loop}; - }; - new_volume_2 = num[1]; - num[] = Extrude {0, 0, -7} { - Surface{new_weld_line_loop}; - }; - new_volume_3 = num[1]; - - new_weld_line_loop = newreg; - Line Loop(new_weld_line_loop) = {13418, 13423, 13408, 13434, 13417, 13399}; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, 5} { - Surface{new_weld_line_loop}; - }; - new_volume_4 = num[1]; - BooleanUnion{ Volume{81}; Delete; }{ Volume{82}; Volume{83}; Delete; } - BooleanUnion{ Volume{80}; Delete; }{ Volume{81}; Delete; } - //BooleanUnion{ Volume{82}; Delete; }{ Volume{83}; Delete; } - */ - - - //BooleanUnion{ Volume{new_volume_1}; Delete; }{ Volume{new_volume_2}; Volume{new_volume_3}; Volume{new_volume_4}; Delete; } - - Recursive Delete { Volume{3,17,18}; } - Recursive Delete { Volume{64, 65}; } - - BooleanUnion{ Volume{31}; Delete; }{ Volume{77}; Volume{76}; Delete; } - BooleanUnion{ Volume{30}; Delete; }{ Volume{75}; Volume{74}; Delete; } - BooleanUnion{ Volume{23}; Delete; }{ Volume{73}; Volume{72}; Volume{71}; Volume{70}; Delete; } - BooleanUnion{ Volume{22}; Delete; }{ Volume{69}; Volume{68}; Volume{67}; Volume{66}; Delete; } - - allVolumes[] = Volume "*"; - BooleanFragments{ Volume{allVolumes[] }; Delete; }{} - - Recursive Delete { Volume{81}; } - - If(usePointID) - point_mirror_x = 945; - point_mirror_y = 943; - Else - p1[] = {129.5,10,5.5}; - p2[] = {99.5,-20,5.5}; - EndIf - - Delta_x = -70; - Delta_y = 37; - - Mirror_id = 2; - R = 1.; - - //Call Add_Optical_Axis; - - // Realign the axis - If(usePointID) - point_OX_1 = 9207; - point_OX_2 = 9239; - - point_OY_1 = 10843; - point_OY_2 = 10845; - Else - c1[] = {-135.485,130.067,53.5926}; - c2[] = {-119.545,121.737,54.3284}; - - c3[] = {-177.978,53.1314,60.3884}; - c4[] = {-177.978,-46.8634,61.4069}; - EndIf - - Call Rotate_Axis_x; - - Save "fused_mirror_assembly_all_mm.brep"; - Call Clear_all; -EndIf - -Merge "fused_mirror_assembly_all_mm.brep"; - -Physical Volume("Mirror") = {2}; -Physical Volume("Substrate") = {1}; -Physical Volume("Washer 1") = {5}; -Physical Volume("Washer 2") = {4}; -Physical Volume("Washer 3") = {3}; - -Physical Volume("Shaft 1") = {8}; -Physical Volume("Shaft 2") = {7}; -Physical Volume("Shaft 3") = {6}; - -Physical Volume("Spacer 1 part 1") = {12}; -Physical Volume("Spacer 2 part 1") = {11}; -Physical Volume("Spacer 3 part 1") = {9}; - -Physical Volume("Spacer 1 part 2") = {14}; -Physical Volume("Spacer 2 part 2") = {13}; -Physical Volume("Spacer 3 part 2") = {10}; - -Physical Volume("Holder") = {15,16}; - -Physical Volume("Nut 1") = {17}; -Physical Volume("Nut 2") = {18}; -Physical Volume("Nut 3") = {21}; - -Physical Volume("Holder 2") = {19,20}; - -Physical Volume("Pipes") = {24, 25, 26, 27}; - -Physical Volume("Bolts") = {22, 23, 28}; - -Physical Surface("Mirror surface") = {113}; - -Physical Surface("Cooling channels") = {521, 497, 522, 526, 525, 520, 518, 517, 516, 499, 500, 501, 509, 510, 511, 498, 502, 519, 503, 512, 524, 508, 507, 506, 515, 514, 505, 513, 504}; -Physical Surface("Cooling channels") += {621, 620, 642, 619, 641}; -Physical Surface("Cooling channels") += {878, 850, 803, 793, 845, 800, 795, 796, 799, 879, 876, 851, 849, 864, 865, 848, 863, 842, 784, 812, 785, 786, 811, 859, 875, 858, 841, 873, 874, 840, 787, 789, 808, 810, 788, 790, 807, 791, 839, 806, 805, 860, 870, 838, 866, 868, 869, 846, 797, 802, 801, 794, 855, 809, 877, 854, 872, 871, 852, 862, 844, 853, 847, 861, 856, 857, 867, 843, 804, 792}; -Physical Surface("Cooling channels") += {970, 900, 965, 902, 904, 880, 901, 881, 903, 899, 974, 973, 967, 966, 969, 968, 971, 972}; -Physical Surface("Cooling channels") += {1184, 1185, 1188, 1189, 1198, 1197, 1202, 1201, 1200, 1199, 1226, 1225, 1229, 1227, 1213, 1212, 1217, 1157, 1156, 1152, 1153, 1148, 1149, 1174, 1173, 1170, 1169, 1165, 1166, 1162, 1161, 1144, 1145, 1216, 1228, 1223, 1224, 1221, 1222, 1230, 1196, 1195, 1194, 1193}; - -Physical Surface("Holder x") = {736, 915, 954}; -Physical Point("Holder yz") = {978}; -Physical Point("Holder z") = {988}; - -Mesh.Algorithm = 6; -//Mesh.Algorithm3D = 4; -Mesh.CharacteristicLengthMin = 1.; -Mesh.CharacteristicLengthMax = 1.; -Mesh.MshFileVersion = 2.2; diff --git a/katoptron/Juelich/mesh/fused_mirror_assembly_mm.brep b/katoptron/Juelich/mesh/fused_mirror_assembly_mm.brep deleted file mode 100644 index 04fea149..00000000 --- a/katoptron/Juelich/mesh/fused_mirror_assembly_mm.brep +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2747b151adb714224c128182267ce0437c3b776f0d00eb1770036fd270934e56 -size 808561 diff --git a/katoptron/Juelich/mesh/fused_mirror_assembly_mm.geo b/katoptron/Juelich/mesh/fused_mirror_assembly_mm.geo deleted file mode 100644 index e042e679..00000000 --- a/katoptron/Juelich/mesh/fused_mirror_assembly_mm.geo +++ /dev/null @@ -1,324 +0,0 @@ -// This .geo has been tested with gmsh 3.0.6 and 4.4.1 binaries for Mac and Linux - -Macro Clear_all - allVolumes[] = Volume "*"; - Recursive Delete { Volume{allVolumes[] } ; } - allSurfaces[] = Surface "*"; - Recursive Delete { Surface{allSurfaces[] } ; } - allPoints[] = Point "*"; - Recursive Delete { Point{allPoints[] } ; } -Return - -Macro Compute_next_avaible_point_id - allPoints[] = Point "*" ; - NallPoints = #allPoints[] ; - Printf("NallPoints %f",NallPoints); - next_avaible_point_id = 0; - compute_next_avaible_point_id_verbose = 0; - For i In {0:NallPoints-1} - If(compute_next_avaible_point_id_verbose) - Printf("Compute_next_avaible_point_id %g, %g",i,allPoints[i]); - EndIf - If(allPoints[i]>= next_avaible_point_id) - next_avaible_point_id = allPoints[i] + 1; - EndIf - EndFor - Printf("Compute_next_avaible_point_id newp %g",newp); - Printf("Compute_next_avaible_point_id next_avaible_point_id %g",next_avaible_point_id); -Return - -Macro Scale_axis_mm_to_m - allPoints[] = Point "*" ; - allLines[] = Line "*" ; - allSurfaces[] = Surface "*"; - allVolumes[] = Volume "*"; - If(usePointID) - c1[] = Point{point_OO}; - EndIf - Dilate {{-c1[0],-c1[1],-c1[2]},0.001} { Volume{allVolumes[] } ; } - - allPoints[] = Point "*" ; - allLines[] = Line "*" ; - allSurfaces[] = Surface "*"; - allVolumes[] = Volume "*"; -Return - -Macro Weld_bolt - new_weld_line_loop = newreg; - Curve Loop(new_weld_line_loop) = curves_id_1[]; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, 0.026} { - Surface{new_weld_line_loop}; - }; - new_volume_1 = num[1]; - num[] = Extrude {0, 0, -0.012} { - Surface{new_weld_line_loop}; - }; - new_volume_2 = num[1]; - new_weld_line_loop = newreg; - Curve Loop(new_weld_line_loop) = curves_id_2[]; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, 0.002} { - Surface{new_weld_line_loop}; - }; - new_volume_3 = num[1]; - new_weld_line_loop = newreg; - Curve Loop(new_weld_line_loop) = curves_id_3[]; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - num[] = Extrude {0, 0, -0.006} { - Surface{new_weld_line_loop}; - }; - new_volume_4 = num[1]; - num[] = BooleanUnion{ Volume{volume_id_1}; Delete; }{ Volume{volume_id_2}; Volume{volume_id_3}; Volume{volume_id_4}; Volume{volume_id_5}; Volume{volume_id_6}; Volume{volume_id_7}; Volume{volume_id_8}; Volume{volume_id_9}; Volume{new_volume_1}; Volume{new_volume_2}; Volume{new_volume_3}; Volume{new_volume_4}; Delete; }; - new_volume_1 = num[0]; -Return - -Macro Weld_tube - c1[] = Point{pipe_p1}; - c2[] = Point{pipe_p2}; - center1[] = {(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2}; - pipe_radius = Sqrt((c1[0]-center1[0])^2+(c1[1]-center1[1])^2+(c1[2]-center1[2])^2); - - c1[] = Point{weld_p1}; - c2[] = Point{weld_p5}; - center1[] = {(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2}; - weld_radius = Sqrt((c1[0]-center1[0])^2+(c1[1]-center1[1])^2+(c1[2]-center1[2])^2); - - new_weld_p1 = newp; - Point(new_weld_p1) = {(pipe_radius/weld_radius)*(c1[0]-center1[0])+center1[0],(pipe_radius/weld_radius)*(c1[1]-center1[1])+center1[1],(pipe_radius/weld_radius)*(c1[2]-center1[2])+center1[2]}; - new_weld_line1 = newreg; Line(new_weld_line1) = {new_weld_p1, weld_p2}; - new_weld_line2 = newreg; Line(new_weld_line2) = {weld_p2, weld_p3}; - new_weld_line3 = newreg; Line(new_weld_line3) = {weld_p3, weld_p4}; - new_weld_line4 = newreg; Line(new_weld_line4) = {weld_p4, new_weld_p1}; - - new_weld_line_loop = newreg; Line Loop(new_weld_line_loop) = {new_weld_line1,new_weld_line2,new_weld_line3,new_weld_line4}; - Plane Surface(new_weld_line_loop) = {new_weld_line_loop}; - - c1[]=Point{weld_p3}; - c2[]=Point{weld_p4}; - - Extrude {{c2[0]-c1[0],c2[1]-c1[1],c2[2]-c1[2]}, {center1[0], center1[1], center1[2]}, Pi} { - Surface{new_weld_line_loop}; - } - Extrude {{c2[0]-c1[0],c2[1]-c1[1],c2[2]-c1[2]}, {center1[0], center1[1], center1[2]}, -Pi} { - Surface{new_weld_line_loop}; - } -Return - -Macro Compute_cross_and_theta - norm_1 = Sqrt(vec_1[0]^2+vec_1[1]^2+vec_1[2]^2); - norm_2 = Sqrt(vec_2[0]^2+vec_2[1]^2+vec_2[2]^2); - - cross[] = {vec_1[1]*vec_2[2]-vec_1[2]*vec_2[1],vec_1[2]*vec_2[0]-vec_1[0]*vec_2[2],vec_1[0]*vec_2[1]-vec_1[1]*vec_2[0]}; - norm_cross = Sqrt(cross[0]^2+cross[1]^2+cross[2]^2); - - dot = vec_1[0]*vec_2[0] + vec_1[1]*vec_2[1] + vec_1[2]*vec_2[2]; - - theta = Acos(dot/(norm_1*norm_2)); -Return - -Macro Rotate_Axis - allVolumes[] = Volume "*"; - If(usePointID) - c1[] = Point{point_OX_1}; - c2[] = Point{point_OX_2}; - Printf("Rotate_Axis point_OX_1 c1 (%g,%g,%g)",c1[0],c1[1],c1[2]); - Printf("Rotate_Axis point_OX_2 c2 (%g,%g,%g)",c2[0],c2[1],c2[2]); - EndIf - - OX[] = {c2[0]-c1[0],c2[1]-c1[1],c2[2]-c1[2]}; - vec_1[] = OX[]; - vec_2[] = {1,0,0}; - - Call Compute_cross_and_theta; - - Rotate {{cross[0],cross[1],cross[2]}, {0, 0, 0}, theta} { Volume{allVolumes[] } ; } - - allVolumes[] = Volume "*"; - If(usePointID) - c3[] = Point{point_OY_1}; - c4[] = Point{point_OY_2}; - Printf("Rotate_Axis point_OY_1 c3 (%g,%g,%g)",c3[0],c3[1],c3[2]); - Printf("Rotate_Axis point_OY_2 c4 (%g,%g,%g)",c4[0],c4[1],c4[2]); - EndIf - - OY[] = {c4[0]-c3[0],c4[1]-c3[1],c4[2]-c3[2]}; - vec_1[] = OY[]; - vec_2[] = {0,1,0}; - - Call Compute_cross_and_theta; - Rotate {{cross[0],cross[1],cross[2]}, {0, 0, 0}, theta} { Volume{allVolumes[] } ; } - -Return - -Macro Translate_Axis - allVolumes[] = Volume "*"; - If(usePointID) - c1[] = Point{point_OO}; - Printf("Translate_Axis point_OO c1 (%g,%g,%g)",c1[0],c1[1],c1[2]); - EndIf - Translate {-c1[0],-c1[1],-c1[2]} { Volume{allVolumes[] } ; } - allVolumes[] = Volume "*"; -Return - -Macro Contact_disk - c1[] = Point{point_disk_R_1}; - c2[] = Point{point_disk_R_2}; - - center[] = {(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2}; - - R = Sqrt((c1[0]-center[0])^2+(c1[1]-center[1])^2+(c1[2]-center[2])^2); - - c1[] = Point{point_surface_disk_1}; - c2[] = Point{point_surface_disk_2}; - - new_disk = newreg; - Disk(new_disk) = {(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2, R, R}; - - Printf("c1 (%g,%g,%g)",c1[0],c1[1],c1[2]); - Printf("c2 (%g,%g,%g)",c2[0],c2[1],c2[2]); - Printf("Center (%g,%g,%g) radius %g",(c1[0]+c2[0])/2, (c1[1]+c2[1])/2, (c1[2]+c2[2])/2, R) ; - - BooleanFragments{ Surface{new_disk}; Delete; }{ Volume{volume_id}; Delete; } -Return - -Macro Add_Optical_Axis - If(usePointID) - p1[] = Point{point_mirror_x}; - p2[] = Point{point_mirror_y}; - Printf("Add_Optical_Axis p1 (%g,%g,%g)",p1[0],p1[1],p1[2]); - Printf("Add_Optical_Axis p2 (%g,%g,%g)",p2[0],p2[1],p2[2]); - EndIf - - Printf("Add_Optical_Axis OA (%g,%g,%g)",p1[0]+Delta_x,p2[1]+Delta_y,p1[2]); - - Call Compute_next_avaible_point_id; - OA = next_avaible_point_id; - Point(OA) = {p1[0]+Delta_x, p2[1]+Delta_y, p1[2], 1}; - new_disk = newreg; - Disk(new_disk) = {p1[0]+Delta_x, p2[1]+Delta_y, p1[2], R, R}; - - BooleanFragments{ Point{OA}; Surface{new_disk}; Delete; }{ Volume{Mirror_id}; Delete; } - //BooleanFragments{ Point{OA}; Delete; }{ Volume{Mirror_id}; Delete; } -Return - -SetFactory("OpenCASCADE"); - -rerun = 0; - -If(!FileExists("fused_mirror_assembly_mm.brep") || rerun) - v() = ShapeFromFile("mirror_assembly.stp"); - - For k In {20:23:1} - Recursive Delete { Volume{k}; } - EndFor - - For k In {27:62:1} - Recursive Delete { Volume{k}; } - EndFor - - allVolumes[] = Volume "*"; - BooleanFragments{ Volume{allVolumes[] }; Delete; }{} - - usePointID = 0; - - // Realign the axis - - If(usePointID) - point_OX_1 = 835; - point_OX_2 = 834; - - point_OY_1 = 938; - point_OY_2 = 940; - Else - c1[] = {6450.86,-90.1101,4467.16}; - c2[] = {6425.67,-76.908,4448.46}; - - c3[] = {-7294.05,1085.32,2738.15}; - c4[] = {-7294.05,1121.25,2759.9}; - EndIf - - Call Rotate_Axis; - - If(usePointID) - point_OO = 938; - Else - c1[] = {-7294.05,2346.64,1780.06}; - EndIf - - Call Translate_Axis; - - usePointID = 1; - - If(usePointID) - point_mirror_x = 4046; - point_mirror_y = 4045; - Else - p1[] = {129.5,10,5.1462499}; - p2[] = {99.5,-20,5.1462499}; - EndIf - - Delta_x = -70; - Delta_y = 37; - - Mirror_id = 2; - R = 1.; - - //Call Add_Optical_Axis; - - Recursive Delete { Volume{3,17,18}; } - - Save "fused_mirror_assembly_mm.brep"; - Call Clear_all; -EndIf - -Merge "fused_mirror_assembly_mm.brep"; - -Physical Volume("Mirror") = {2}; -Physical Volume("Substrate") = {1}; -Physical Volume("Washer 1") = {5}; -Physical Volume("Washer 2") = {4}; -Physical Volume("Washer 3") = {3}; - -Physical Volume("Shaft 1") = {8}; -Physical Volume("Shaft 2") = {7}; -Physical Volume("Shaft 3") = {6}; - -Physical Volume("Spacer 1 part 1") = {12}; -Physical Volume("Spacer 2 part 1") = {11}; -Physical Volume("Spacer 3 part 1") = {9}; - -Physical Volume("Spacer 1 part 2") = {14}; -Physical Volume("Spacer 2 part 2") = {13}; -Physical Volume("Spacer 3 part 2") = {10}; - -Physical Volume("Holder") = {15,16}; - -Physical Volume("Nut 1") = {18}; -Physical Volume("Nut 2") = {19}; -Physical Volume("Nut 3") = {17}; - -Physical Surface("Mirror surface") = {113}; -//Physical Surface("Disk around optical axis") = {738}; - -Physical Surface("Cooling channels") = {524, 525, 526, 597, 598, 599, 619, 620}; - -For k In {497:522} - Physical Surface("Cooling channels") += {k}; -EndFor - -Physical Surface("Holder z clamping") = {544, 545, 562, 563, 572, 573}; -Physical Surface("Holder x-y clamping") = {553, 554, 546, 547, 568, 569}; - -Physical Point("Holder x-y-z clamping point") = {762}; -Physical Point("Holder z clamping point") = {740}; -Physical Point("Holder z-y clamping point") = {733}; - -Physical Point("Optical Axis") = {958}; - - -Mesh.Algorithm = 6; -//Mesh.Algorithm3D = 4; -Mesh.CharacteristicLengthMin = 1.5; -Mesh.CharacteristicLengthMax = 1.5; -Mesh.MshFileVersion = 2.2; diff --git a/katoptron/Juelich/post_process/AB.py b/katoptron/Juelich/post_process/AB.py deleted file mode 100755 index f988bc64..00000000 --- a/katoptron/Juelich/post_process/AB.py +++ /dev/null @@ -1,111 +0,0 @@ - - -import numpy as np -import os -from katoptron.Juelich.post_process.vtk_post_process_2 import post_process -from katoptron.Juelich.post_process.vtk_post_process_2 import post_process_mirror - - -def cuts(filename, filename_ref, dz1, T1, dz2, T2, remove_ref=False): - p_cut = np.array([5.971051450397588, 20.29345703125, -26.85714554786682]) - n_cut = np.array([1., 0., 0.]) - - directory = 'cut_1' - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - post_process(filename=filename, - filename_ref=filename_ref, - remove_ref=remove_ref, - p_cut=p_cut, - scale_u=1. / 1000., - scale_T=1., - n_cut=n_cut, - T_range=T1, - dz_range=dz1) - - os.chdir('..') - - directory = 'cut_2' - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - p_cut = np.array( - [24.91341173426381, 4.525806024554082, -26.975820456076352]) - n_cut = np.array([0.20170202470821563, -0.9790050766051117, 0.]) - - post_process(filename=filename, - filename_ref=filename_ref, - remove_ref=remove_ref, - p_cut=p_cut, - scale_u=1. / 1000., - scale_T=1., - n_cut=n_cut, - T_range=T2, - dz_range=dz2) - - os.chdir('..') - - -def cuts_all_N(N, case_id, ref_case_id, case_name, remove_ref, T1, Z1, T2, Z2): - file_dir = os.path.dirname(__file__) - for i in range(0, N): - directory = 'point_' + str(i) + '_' + case_name - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - base_dir = file_dir + '/../../../workspace/katoptron_Juelich_tests_M1_assembly_fused/MPI_2/' + case_id + '/1/' + str( - i) - base_dir_ref = file_dir + '/../../../workspace/katoptron_Juelich_tests_M1_assembly_fused/MPI_2/' + ref_case_id + '/1/' + str( - i) - cuts(base_dir + '/fused_mirror_assembly_mm_part_2_ast1_s0.pvtu', - base_dir_ref + '/fused_mirror_assembly_mm_part_2_ast1_s0.pvtu', - dz1[i, :], T1[i, :], dz2[i, :], T2[i, :], remove_ref=remove_ref) - post_process_mirror(filename=base_dir + '/mirror_data_all.npz', - filename_ref=base_dir_ref + '/mirror_data_all.npz', - remove_ref=remove_ref) - os.chdir('..') - - -if __name__ == "__main__": - - N = 2 - - T1 = np.zeros((N, 2)) - dz1 = np.zeros((N, 2)) - - T2 = np.zeros((N, 2)) - dz2 = np.zeros((N, 2)) - - T1[0, :] = [70, 120.00236433] - T1[1, :] = [70, 160.19321603] - - T2[0, :] = [70, 120.00236433] - T2[1, :] = [70, 160.19321603] - - #cuts_all_N(N, 'A2', 'A2_baking', 'A', False, T, Z) - #cuts_all_N(N, 'B2', 'B2_baking', 'B', False, T, Z) - - dz1[0, :] = [5e-07, 2e-05] - dz1[1, :] = [-1.5e-06, 4e-05] - - dz2[0, :] = [-2.5e-05, 2.1e-05] - dz2[1, :] = [-5e-05, 5e-05] - ''' - dz1[0, :] = [5e-07, 1.5e-05] - dz1[1, :] = [-1.5e-06, 4e-05] - - dz2[0, :] = [-2.5e-05, 1.6e-05] - dz2[1, :] = [-5e-05, 5e-05] - ''' - cuts_all_N(N, 'A2', 'A2_baking', 'A_diff', True, T1, dz1, T2, dz2) - ''' - dz1[0, :] = [1.9e-06, 2e-05] - dz1[1, :] = [1e-06, 4e-05] - - dz2[0, :] = [-2.1e-05, 2.1e-05] - dz2[1, :] = [-5e-05, 5e-05] - ''' - cuts_all_N(N, 'B2', 'B2_baking', 'B_diff', True, T1, dz1, T2, dz2) diff --git a/katoptron/Juelich/post_process/__init__.py b/katoptron/Juelich/post_process/__init__.py deleted file mode 100644 index e8aed8a0..00000000 --- a/katoptron/Juelich/post_process/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf-8 -*- -# katoptron.Juelich.post_process MODULE initialization file diff --git a/katoptron/Juelich/post_process/vtk_post_process.py b/katoptron/Juelich/post_process/vtk_post_process.py deleted file mode 100644 index 33b7bb92..00000000 --- a/katoptron/Juelich/post_process/vtk_post_process.py +++ /dev/null @@ -1,328 +0,0 @@ -import vtk -import numpy as np -from numpy import zeros -import matplotlib.pyplot as plt -#from mpl_toolkits.mplot3d import Axes3D -#import matplotlib2tikz -from numpy import linalg as LA - - -def SaveFigureAsImage(fileName, fig=None, **kwargs): - ''' Save a Matplotlib figure as an image without borders or frames. - Args: - fileName (str): String that ends in .png etc. - - fig (Matplotlib figure instance): figure you want to save as the image - Keyword Args: - orig_size (tuple): width, height of the original image used to maintain - aspect ratio. - ''' - fig_size = fig.get_size_inches() - w, h = fig_size[0], fig_size[1] - fig.patch.set_alpha(0) - if 'orig_size' in kwargs: # Aspect ratio scaling if required - w, h = kwargs['orig_size'] - w2, h2 = fig_size[0], fig_size[1] - fig.set_size_inches([((w2 / w)) * w, ((w2 / w)) * h]) - fig.set_dpi(((w2 / w)) * fig.get_dpi()) - a = fig.gca() - a.set_frame_on(False) - a.set_xticks([]) - a.set_yticks([]) - plt.axis('off') - plt.xlim(0, h) - plt.ylim(w, 0) - fig.savefig(fileName, transparent=True, bbox_inches='tight', - pad_inches=0) - - -def compute_integrated_F(volume_id, - component_id, - cut_origin_x, - cut_origin_y, - cut_origin_z, - cut_normal_x, - cut_normal_y, - cut_normal_z, - reader, - plot_results=False): - - thresh = vtk.vtkThreshold() - thresh.ThresholdBetween(volume_id - 0.5, volume_id + 0.5) - thresh.SetInputConnection(reader.GetOutputPort()) - thresh.SetInputArrayToProcess(0, 0, 0, - vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS, - "volume_id") - thresh.Update() - - plane = vtk.vtkPlane() - plane.SetOrigin(cut_origin_x, cut_origin_y, cut_origin_z) - plane.SetNormal(cut_normal_x, cut_normal_y, cut_normal_z) - - cutter = vtk.vtkCutter() - cutter.SetCutFunction(plane) - cutter.SetInputConnection(thresh.GetOutputPort()) - cutter.Update() - - data = cutter.GetOutput() - - triangles = data.GetPolys().GetData() - points = data.GetPoints() - - stress = data.GetCellData().GetArray('sigma') - - ntri = (triangles.GetNumberOfTuples() // 4) - npts = points.GetNumberOfPoints() - nstress = stress.GetNumberOfTuples() - - tri = zeros((ntri, 3), dtype=int) - x = zeros(npts) - y = zeros(npts) - z = zeros(npts) - - sigma_vector = zeros(nstress) - - sigma_vector_node = zeros(npts) - area_node = zeros(npts) - - for i in range(0, ntri): - tri[i, 0] = triangles.GetTuple(4 * i + 1)[0] - tri[i, 1] = triangles.GetTuple(4 * i + 2)[0] - tri[i, 2] = triangles.GetTuple(4 * i + 3)[0] - - for i in range(npts): - pt = points.GetPoint(i) - x[i] = pt[0] - y[i] = pt[1] - z[i] = pt[2] - - for i in range(0, nstress): - sigma = stress.GetTuple(i) - sigma_vector[i] = sigma[component_id] - - if plot_results: - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - #plt.triplot(x, y, tri) - axtri = plt.tripcolor(x, y, tri, sigma_vector) - #plt.scatter(x, y) - plt.gca().set_aspect('equal') - cb = fig.colorbar(axtri, orientation="horizontal") - - F = 0. - total_area = 0. - for i in range(0, ntri): - cross = np.cross( - np.array([ - x[tri[i, 1]] - x[tri[i, 0]], y[tri[i, 1]] - y[tri[i, 0]], - z[tri[i, 1]] - z[tri[i, 0]] - ]), - np.array([ - x[tri[i, 2]] - x[tri[i, 0]], y[tri[i, 2]] - y[tri[i, 0]], - z[tri[i, 2]] - z[tri[i, 0]] - ])) - area = (LA.norm(cross) / 2) - F = F + area * sigma_vector[i] - total_area = total_area + area - for j in range(0, 3): - sigma_vector_node[tri[i, j]] = sigma_vector_node[ - tri[i, j]] + area * sigma_vector[i] - area_node[tri[i, j]] = area_node[tri[i, j]] + area - - for i in range(npts): - sigma_vector_node[i] = (sigma_vector_node[i] / area_node[i]) - - if plot_results: - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - #plt.triplot(x, y, tri) - axtri = plt.tricontourf(x, y, tri, sigma_vector_node) - #plt.scatter(x, y) - plt.gca().set_aspect('equal') - cb = fig.colorbar(axtri, orientation="horizontal") - - return F - - -def post_process(): - filename = 'MIRROR_1_ASSEMBLY_fused_2_ast1_s0_0.vtu' - - reader = vtk.vtkXMLUnstructuredGridReader() - reader.SetFileName(filename) - reader.Update() - - #data1 = reader.GetOutput() - - thresh = vtk.vtkThreshold() - thresh.ThresholdBetween(8.5, 11.5) - thresh.SetInputConnection(reader.GetOutputPort()) - thresh.SetInputArrayToProcess(0, 0, 0, - vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS, - "volume_id") - thresh.Update() - - plane = vtk.vtkPlane() - plane.SetOrigin(-0.0156128890812397, 0.020816631615161896, - -0.009049303388172896) - plane.SetNormal(0, 0, 1) - - cutter = vtk.vtkFiltersCorePython.vtkCutter() - cutter.SetCutFunction(plane) - cutter.SetInputConnection(thresh.GetOutputPort()) - cutter.Update() - - data = cutter.GetOutput() - - triangles = data.GetPolys().GetData() - points = data.GetPoints() - - mapper = vtk.vtkCellDataToPointData() - mapper.AddInputData(data) - mapper.Update() - - vels = mapper.GetOutput().GetPointData().GetArray('z') # .GetArray(1) - - stress = data.GetCellData().GetArray('sigma') - stress_VM = data.GetCellData().GetArray('von Mises') - - ntri = (triangles.GetNumberOfTuples() // 4) - npts = points.GetNumberOfPoints() - nvls = points.GetNumberOfPoints() # vels.GetNumberOfTuples() - - nstress = stress.GetNumberOfTuples() - - tri = zeros((ntri, 3), dtype=int) - x = zeros(npts) - y = zeros(npts) - z = zeros(npts) - ux = zeros(nvls) - - sigma_vector_node = zeros(npts) - area_node = zeros(npts) - - sigma_zz = zeros(nstress) - - for i in range(0, ntri): - tri[i, 0] = triangles.GetTuple(4 * i + 1)[0] - tri[i, 1] = triangles.GetTuple(4 * i + 2)[0] - tri[i, 2] = triangles.GetTuple(4 * i + 3)[0] - - for i in range(npts): - pt = points.GetPoint(i) - x[i] = pt[0] - y[i] = pt[1] - z[i] = pt[2] - - for i in range(0, nvls): - U = vels.GetTuple(i) - ux[i] = U[0] - - for i in range(0, nstress): - sigma = stress.GetTuple(i) - sigma_zz[i] = sigma[8] - - for i in range(0, ntri): - cross = np.cross( - np.array([ - x[tri[i, 1]] - x[tri[i, 0]], y[tri[i, 1]] - y[tri[i, 0]], - z[tri[i, 1]] - z[tri[i, 0]] - ]), - np.array([ - x[tri[i, 2]] - x[tri[i, 0]], y[tri[i, 2]] - y[tri[i, 0]], - z[tri[i, 2]] - z[tri[i, 0]] - ])) - area = (LA.norm(cross) / 2) - for j in range(0, 3): - sigma_vector_node[ - tri[i, j]] = sigma_vector_node[tri[i, j]] + area * sigma_zz[i] - area_node[tri[i, j]] = area_node[tri[i, j]] + area - - for i in range(npts): - sigma_vector_node[i] = (sigma_vector_node[i] / area_node[i]) - - #tmp = stress.GetTuple(0) - - levels = np.linspace(min(ux), max(ux), 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - plt.tricontour(x, - y, - tri, - ux, - levels, - linestyles='-', - colors='black', - linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, ux, levels) - plt.gca().set_aspect('equal') - - # plt.minorticks_on() - # plt.gca().set_xticklabels([]) - # plt.gca().set_yticklabels([]) - # plt.gca().set_axis_off() - #plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0) - # plt.margins(0,0) - # plt.gca().xaxis.set_major_locator(plt.NullLocator()) - # plt.gca().yaxis.set_major_locator(plt.NullLocator()) - # plt.axis('off') - #plt.tricontour(x, y, tri, ux, 16) - # plt.show - #plt.savefig("Ux.pdf", transparent=True, bbox_inches='tight', pad_inches=-0.05) - - # matplotlib2tikz.save('test.tex') - - cb = fig.colorbar(axtri, orientation="horizontal") - - levels = np.linspace(min(sigma_zz), max(sigma_zz), 16) - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - axtri = plt.tripcolor(x, y, tri, sigma_zz, levels) - print("sigma_zz_unsmooth.pdf") - print(levels) - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("sigma_zz_unsmooth.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - #cb = fig.colorbar(axtri, orientation="horizontal") - - levels = np.linspace(min(sigma_vector_node), max(sigma_vector_node), 16) - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - axtri = plt.tricontourf(x, y, tri, sigma_vector_node, levels) - print("sigma_zz_smooth.pdf") - print(levels) - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("sigma_zz_smooth.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - #cb = fig.colorbar(axtri, orientation="horizontal") - - F_zz_1 = compute_integrated_F(9, 8, 0.0529999991413206, 0.0440000002272427, - -0.0413666241463175, 0, 0, 1, reader) - F_zz_2 = compute_integrated_F(10, 8, 0.0529999991413206, - 0.0440000002272427, -0.0413666241463175, 0, - 0, 1, reader) - F_zz_3 = compute_integrated_F(11, 8, 0.0529999991413206, - 0.0440000002272427, -0.0413666241463175, 0, - 0, 1, reader) - - print(F_zz_1) - print(F_zz_2) - print(F_zz_3) - - # plt.show() diff --git a/katoptron/Juelich/post_process/vtk_post_process_2.py b/katoptron/Juelich/post_process/vtk_post_process_2.py deleted file mode 100644 index 0a77c7d3..00000000 --- a/katoptron/Juelich/post_process/vtk_post_process_2.py +++ /dev/null @@ -1,961 +0,0 @@ -import vtk -import numpy as np -from numpy import zeros -import matplotlib.pyplot as plt -#from mpl_toolkits.mplot3d import Axes3D -#import matplotlib2tikz -from numpy import linalg as LA -import matplotlib.tri as mtri -import katoptron.utilities as u - - -def SaveFigureAsImage(fileName, fig=None, **kwargs): - ''' Save a Matplotlib figure as an image without borders or frames. - Args: - fileName (str): String that ends in .png etc. - - fig (Matplotlib figure instance): figure you want to save as the image - Keyword Args: - orig_size (tuple): width, height of the original image used to maintain - aspect ratio. - ''' - fig_size = fig.get_size_inches() - w, h = fig_size[0], fig_size[1] - fig.patch.set_alpha(0) - if 'orig_size' in kwargs: # Aspect ratio scaling if required - w, h = kwargs['orig_size'] - w2, h2 = fig_size[0], fig_size[1] - fig.set_size_inches([((w2 / w)) * w, ((w2 / w)) * h]) - fig.set_dpi(((w2 / w)) * fig.get_dpi()) - a = fig.gca() - a.set_frame_on(False) - a.set_xticks([]) - a.set_yticks([]) - plt.axis('off') - plt.xlim(0, h) - plt.ylim(w, 0) - fig.savefig(fileName, transparent=True, bbox_inches='tight', - pad_inches=0) - - -def compute_integrated_F(volume_id, component_id, cut_origin_x, cut_origin_y, - cut_origin_z, cut_normal_x, cut_normal_y, - cut_normal_z, reader): - - thresh = vtk.vtkThreshold() - thresh.ThresholdBetween(volume_id - 0.5, volume_id + 0.5) - thresh.SetInputConnection(reader.GetOutputPort()) - thresh.SetInputArrayToProcess(0, 0, 0, - vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS, - "volume_id") - thresh.Update() - - plane = vtk.vtkPlane() - plane.SetOrigin(cut_origin_x, cut_origin_y, cut_origin_z) - plane.SetNormal(cut_normal_x, cut_normal_y, cut_normal_z) - - cutter = vtk.vtkFiltersCorePython.vtkCutter() - cutter.SetCutFunction(plane) - cutter.SetInputConnection(thresh.GetOutputPort()) - cutter.Update() - - data = cutter.GetOutput() - - triangles = data.GetPolys().GetData() - points = data.GetPoints() - - stress = data.GetCellData().GetArray('sigma') - - ntri = (triangles.GetNumberOfTuples() // 4) - npts = points.GetNumberOfPoints() - nstress = stress.GetNumberOfTuples() - - tri = zeros((ntri, 3), dtype=int) - x = zeros(npts) - y = zeros(npts) - z = zeros(npts) - - sigma_vector = zeros(nstress) - - sigma_vector_node = zeros(npts) - area_node = zeros(npts) - - for i in range(0, ntri): - tri[i, 0] = triangles.GetTuple(4 * i + 1)[0] - tri[i, 1] = triangles.GetTuple(4 * i + 2)[0] - tri[i, 2] = triangles.GetTuple(4 * i + 3)[0] - - for i in range(npts): - pt = points.GetPoint(i) - x[i] = pt[0] - y[i] = pt[1] - z[i] = pt[2] - - for i in range(0, nstress): - sigma = stress.GetTuple(i) - sigma_vector[i] = sigma[component_id] - - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - #plt.triplot(x, y, tri) - axtri = plt.tripcolor(x, y, tri, sigma_vector) - #plt.scatter(x, y) - plt.gca().set_aspect('equal') - cb = fig.colorbar(axtri, orientation="horizontal") - - F = 0. - - for i in range(0, ntri): - cross = np.cross( - np.array([ - x[tri[i, 1]] - x[tri[i, 0]], y[tri[i, 1]] - y[tri[i, 0]], - z[tri[i, 1]] - z[tri[i, 0]] - ]), - np.array([ - x[tri[i, 2]] - x[tri[i, 0]], y[tri[i, 2]] - y[tri[i, 0]], - z[tri[i, 2]] - z[tri[i, 0]] - ])) - area = (LA.norm(cross) / 2) - F = F + area * sigma_vector[i] - for j in range(0, 3): - sigma_vector_node[tri[i, j]] = sigma_vector_node[ - tri[i, j]] + area * sigma_vector[i] - area_node[tri[i, j]] = area_node[tri[i, j]] + area - - for i in range(npts): - sigma_vector_node[i] = (sigma_vector_node[i] / area_node[i]) - - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - #plt.triplot(x, y, tri) - axtri = plt.tricontourf(x, y, tri, sigma_vector_node) - #plt.scatter(x, y) - plt.gca().set_aspect('equal') - cb = fig.colorbar(axtri, orientation="horizontal") - - return F - - -def post_process( - filename='MIRROR_1_ASSEMBLY_fused_2_ast1_s0_0.vtu', - filename_ref='MIRROR_1_ASSEMBLY_fused_2_ast1_s0_0.vtu', - remove_ref=False, - scale_u=1., - scale_T=1., - T_0=22., - p_cut=np.array( - [-0.0156128890812397, 0.020816631615161896, - 0.0006999988108873367]), - n_cut=np.array([1, 0, 0]), - T_range=np.array([0., 0.]), - dz_range=np.array([0., 0.]), -): - if remove_ref: - if filename_ref[-4:] == ".vtu": - reader = vtk.vtkXMLUnstructuredGridReader() - elif filename_ref[-5:] == ".pvtu": - reader = vtk.vtkXMLPUnstructuredGridReader() - - reader.SetFileName(filename_ref) - reader.Update() - - plane = vtk.vtkPlane() - plane.SetOrigin(p_cut[0], p_cut[1], p_cut[2]) - plane.SetNormal(n_cut[0], n_cut[1], n_cut[2]) - - theta = np.arctan(n_cut[1] * 1. / n_cut[0]) - - cutter = vtk.vtkFiltersCorePython.vtkCutter() - cutter.SetCutFunction(plane) - cutter.SetInputConnection(reader.GetOutputPort()) - cutter.Update() - - data = cutter.GetOutput() - - triangles = data.GetPolys().GetData() - points = data.GetPoints() - - mapper = vtk.vtkCellDataToPointData() - mapper.AddInputData(data) - mapper.Update() - - u = mapper.GetOutput().GetPointData().GetArray('displacement') - - ntri = (triangles.GetNumberOfTuples() // 4) - npts = points.GetNumberOfPoints() - - dx_ref = zeros(npts) - dy_ref = zeros(npts) - dz_ref = zeros(npts) - - for i in range(0, npts): - dx_ref[i] = scale_u * u.GetTuple(i)[0] - dy_ref[i] = scale_u * u.GetTuple(i)[1] - dz_ref[i] = scale_u * u.GetTuple(i)[2] - - if filename[-4:] == ".vtu": - reader = vtk.vtkXMLUnstructuredGridReader() - elif filename[-5:] == ".pvtu": - reader = vtk.vtkXMLPUnstructuredGridReader() - - reader.SetFileName(filename) - reader.Update() - - #data1 = reader.GetOutput() - ''' - thresh = vtk.vtkThreshold() - thresh.ThresholdBetween(8.5,11.5) - thresh.SetInputConnection(reader.GetOutputPort()) - thresh.SetInputArrayToProcess(0, 0, 0, vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS, "volume_id") - thresh.Update() - ''' - plane = vtk.vtkPlane() - plane.SetOrigin(p_cut[0], p_cut[1], p_cut[2]) - plane.SetNormal(n_cut[0], n_cut[1], n_cut[2]) - - theta = np.arctan(n_cut[1] * 1. / n_cut[0]) - - cutter = vtk.vtkFiltersCorePython.vtkCutter() - cutter.SetCutFunction(plane) - cutter.SetInputConnection(reader.GetOutputPort()) - cutter.Update() - - data = cutter.GetOutput() - - triangles = data.GetPolys().GetData() - points = data.GetPoints() - - mapper = vtk.vtkCellDataToPointData() - mapper.AddInputData(data) - mapper.Update() - - T = mapper.GetOutput().GetPointData().GetArray('T') - u = mapper.GetOutput().GetPointData().GetArray('displacement') - stress_VM_pt = mapper.GetOutput().GetPointData().GetArray('von Mises') - - stress = data.GetCellData().GetArray('sigma') - stress_VM = data.GetCellData().GetArray('von Mises') - volume_id = data.GetCellData().GetArray('volume_id') - - ntri = (triangles.GetNumberOfTuples() // 4) - npts = points.GetNumberOfPoints() - nvls = points.GetNumberOfPoints() # T.GetNumberOfTuples() - - nstress = stress.GetNumberOfTuples() - - tri = zeros((ntri, 3), dtype=int) - x = zeros(npts) - y = zeros(npts) - z = zeros(npts) - dx = zeros(npts) - dy = zeros(npts) - dz = zeros(npts) - T_vec = zeros(nvls) - - sigma_vector_node = zeros(npts) - sigma_vector_node_filtered = zeros(npts) - area_node = zeros(npts) - - sigma_zz = zeros(nstress) - sigma_zz_filtered = zeros(nstress) - volume_id_vec = zeros(nstress) - volume_id_vec_2 = zeros(nstress) - - level_zz = np.linspace(-1e8, 1e8, 16) - - for i in range(0, ntri): - tri[i, 0] = triangles.GetTuple(4 * i + 1)[0] - tri[i, 1] = triangles.GetTuple(4 * i + 2)[0] - tri[i, 2] = triangles.GetTuple(4 * i + 3)[0] - - for i in range(npts): - pt = points.GetPoint(i) - x[i] = scale_u * pt[0] - y[i] = scale_u * pt[1] - z[i] = scale_u * pt[2] - - for i in range(0, nvls): - T_tmp = T.GetTuple(i) - T_vec[i] = scale_T * T_tmp[0] + T_0 - - dx[i] = scale_u * u.GetTuple(i)[0] - dy[i] = scale_u * u.GetTuple(i)[1] - dz[i] = scale_u * u.GetTuple(i)[2] - - sigma_vector_node_filtered[i] = scale_u**2 * stress_VM_pt.GetTuple( - i)[0] - - if remove_ref: - dx -= dx_ref - dy -= dy_ref - dz -= dz_ref - - print('T') - print(np.amin(T_vec)) - print(np.amax(T_vec)) - - print('u') - print(np.amin(dx)) - print(np.amax(dx)) - print(np.amin(dy)) - print(np.amax(dy)) - print(np.amin(dz)) - print(np.amax(dz)) - - for i in range(0, nstress): - sigma = stress.GetTuple(i) - sigma_zz[i] = scale_u**2 * sigma[8] - - volume_id_vec[i] = volume_id.GetTuple(i)[0] - - if sigma_zz[i] <= level_zz[0]: - sigma_zz_filtered[i] = level_zz[0] - elif sigma_zz[i] >= level_zz[15]: - sigma_zz_filtered[i] = level_zz[15] - else: - sigma_zz_filtered[i] = sigma_zz[i] - - volume_id_vec_tmp = volume_id_vec - - volume_id_vec_tmp[np.where(volume_id_vec == 4)] = 3 - volume_id_vec_tmp[np.where(volume_id_vec == 5)] = 3 - - volume_id_vec_tmp[np.where(volume_id_vec == 7)] = 6 - volume_id_vec_tmp[np.where(volume_id_vec == 8)] = 6 - - volume_id_vec_tmp[np.where(volume_id_vec == 10)] = 9 - volume_id_vec_tmp[np.where(volume_id_vec == 11)] = 9 - - volume_id_vec_tmp[np.where(volume_id_vec == 13)] = 12 - volume_id_vec_tmp[np.where(volume_id_vec == 14)] = 12 - - volume_id_vec_tmp[np.where(volume_id_vec == 16)] = 15 - volume_id_vec_tmp[np.where(volume_id_vec == 17)] = 15 - - volume_id_vec_tmp[np.where(volume_id_vec >= 19)] = 19 - #volume_id_vec_tmp[np.where( volume_id_vec ==17 )] = 15 - - indices_volume_id = np.argsort(volume_id_vec_tmp) - - current_i = 0 - volume_id_vec_2[indices_volume_id[0]] = current_i - for i in range(1, len(volume_id_vec)): - if volume_id_vec_tmp[indices_volume_id[i - 1]] != volume_id_vec_tmp[ - indices_volume_id[i]]: - current_i = current_i + 1 - volume_id_vec_2[indices_volume_id[i]] = current_i - - for i in range(0, ntri): - cross = np.cross( - np.array([ - x[tri[i, 1]] - x[tri[i, 0]], y[tri[i, 1]] - y[tri[i, 0]], - z[tri[i, 1]] - z[tri[i, 0]] - ]), - np.array([ - x[tri[i, 2]] - x[tri[i, 0]], y[tri[i, 2]] - y[tri[i, 0]], - z[tri[i, 2]] - z[tri[i, 0]] - ])) - area = (LA.norm(cross) / 2) - for j in range(0, 3): - sigma_vector_node[ - tri[i, j]] = sigma_vector_node[tri[i, j]] + area * sigma_zz[i] - area_node[tri[i, j]] = area_node[tri[i, j]] + area - - for i in range(npts): - sigma_vector_node[i] = (sigma_vector_node[i] / area_node[i]) - ''' - if sigma_vector_node[i] <= level_zz[0]: - sigma_vector_node_filtered[i] = level_zz[0] - elif sigma_vector_node[i] >= level_zz[15]: - sigma_vector_node_filtered[i] = level_zz[15] - else: - sigma_vector_node_filtered[i] = sigma_vector_node[i] - ''' - #tmp = stress.GetTuple(0) - - if T_range[0] == T_range[1]: - T_range[0] = min(T_vec) - T_range[1] = max(T_vec) - level = np.linspace(T_range[0], T_range[1], 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - plt.tricontour(np.cos(theta) * y - np.sin(theta) * x, - -z, - tri, - T_vec, - level, - linestyles='-', - colors='black', - linewidths=0.5) - axtri = plt.tricontourf( - np.cos(theta) * y - np.sin(theta) * x, -z, tri, T_vec, level) - f = open("T.txt", "w+") - print(str(level[0]) + ', ' + str(level[3]) + ', ' + str( - level[6]) + ', ' + str(level[9]) + ', ' + str(level[12]) + ', ' + str( - level[15]), file=f) - f.close() - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("T.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - level = np.linspace(min(dx), max(dx), 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - plt.tricontour(np.cos(theta) * y - np.sin(theta) * x, - -z, - tri, - dx, - level, - linestyles='-', - colors='black', - linewidths=0.5) - axtri = plt.tricontourf( - np.cos(theta) * y - np.sin(theta) * x, -z, tri, dx, level) - f = open("dx.txt", "w+") - print(str(level[0]) + ', ' + str(level[3]) + ', ' + str( - level[6]) + ', ' + str(level[9]) + ', ' + str(level[12]) + ', ' + str( - level[15]), file=f) - f.close() - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("dx.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - level = np.linspace(min(dy), max(dy), 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - plt.tricontour(np.cos(theta) * y - np.sin(theta) * x, - -z, - tri, - dy, - level, - linestyles='-', - colors='black', - linewidths=0.5) - axtri = plt.tricontourf( - np.cos(theta) * y - np.sin(theta) * x, -z, tri, dy, level) - f = open("dy.txt", "w+") - print(str(level[0]) + ', ' + str(level[3]) + ', ' + str( - level[6]) + ', ' + str(level[9]) + ', ' + str(level[12]) + ', ' + str( - level[15]), file=f) - f.close() - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("dy.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - if dz_range[0] == dz_range[1]: - dz_range[0] = min(dz) - dz_range[1] = max(dz) - level = np.linspace(dz_range[0], dz_range[1], 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - plt.tricontour(np.cos(theta) * y - np.sin(theta) * x, - -z, - tri, - dz, - level, - linestyles='-', - colors='black', - linewidths=0.5) - axtri = plt.tricontourf( - np.cos(theta) * y - np.sin(theta) * x, -z, tri, dz, level) - f = open("dz.txt", "w+") - print(str(level[0]) + ', ' + str(level[3]) + ', ' + str( - level[6]) + ', ' + str(level[9]) + ', ' + str(level[12]) + ', ' + str( - level[15]), file=f) - f.close() - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("dz.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - plt.close() - ''' - #plt.minorticks_on() - #plt.gca().set_xticklabels([]) - #plt.gca().set_yticklabels([]) - #plt.gca().set_axis_off() - #plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0) - #plt.margins(0,0) - #plt.gca().xaxis.set_major_locator(plt.NullLocator()) - #plt.gca().yaxis.set_major_locator(plt.NullLocator()) - #plt.axis('off') - #plt.tricontour(x, y, tri, T_vec, 16) - #plt.show - #plt.savefig("T_vec.pdf", transparent=True, bbox_inches='tight', pad_inches=-0.05) - - #matplotlib2tikz.save('test.tex') - - cb = fig.colorbar(axtri, orientation="horizontal") - - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - axtri = plt.tripcolor(np.cos(theta)*y-np.sin(theta)*x, -z, tri, volume_id_vec_2) - f = open("volume_id.txt", "w+") - print >> f, str(level[0]) + ', ' + str(level[3]) + ', ' + str(level[6]) + ', ' + str(level[9]) + ', ' + str(level[12]) + ', ' + str(level[15]) - f.close() - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("volume_id.png", - transparent=True, - bbox_inches='tight', - pad_inches=0., - dpi=2000) - plt.savefig("volume_id.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - linewidth = 2 - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - axtri = plt.tripcolor(np.cos(theta)*y-np.sin(theta)*x, -z, tri, volume_id_vec_2) - plt.plot([0.00606, 0.01513], [0.018, 0.018], 'g-', lw=linewidth) - plt.plot([0.03085, 0.03993], [0.018, 0.018], 'g-', lw=linewidth) - plt.plot([0.04805, 0.05714], [0.018, 0.018], 'g-', lw=linewidth) - plt.plot([0.07285, 0.08194], [0.018, 0.018], 'g-', lw=linewidth) - - plt.plot([0.00301297, 0.0862297], [-2.60656e-05, -2.60656e-05], - 'r-', - lw=linewidth) - - plt.plot([0.01513, 0.01718, 0.01718], [0.018, 0.018, 0.007833], - 'r-', - lw=linewidth) - plt.plot([0.02881, 0.02881, 0.03085], [0.007833, 0.018, 0.018], - 'r-', - lw=linewidth) - plt.plot([0.05714, 0.0591934, 0.0591934], [0.018, 0.018, 0.007833], - 'r-', - lw=linewidth) - plt.plot([0.0708286, 0.0708286, 0.07285], [0.007833, 0.018, 0.018], - 'r-', - lw=linewidth) - - plt.plot([0.00768668, 0.00768668, 0.0136152], - [0.0299629, 0.028372, 0.028372], - 'r-', - lw=linewidth) - plt.plot([0.00768668, 0.0157517], [0.0314519, 0.0314519], - 'g-', - lw=linewidth) - plt.plot([0.0139112, 0.0163621], [0.0283628, 0.0283628], - 'g-', - lw=linewidth) - plt.plot([0.0139204, 0.0151413], [0.0253754, 0.0253754], - 'g-', - lw=linewidth) - plt.plot([0.0153632, 0.0170188], [0.0253754, 0.0253754], - 'g-', - lw=linewidth) - - plt.plot([0.0118091, 0.0138181], [0.0519943, 0.0519943], - 'g-', - lw=linewidth) - - plt.plot([0.0383327, 0.0383327, 0.0323929], - [0.0299629, 0.028372, 0.028372], - 'r-', - lw=linewidth) - plt.plot([0.0302762, 0.0383327], [0.0314519, 0.0314519], - 'g-', - lw=linewidth) - plt.plot([0.0297374, 0.032108], [0.0283628, 0.0283628], 'g-', lw=linewidth) - plt.plot([0.0289832, 0.0306937], [0.0253754, 0.0253754], - 'g-', - lw=linewidth) - plt.plot([0.0308688, 0.0321214], [0.0253754, 0.0253754], - 'g-', - lw=linewidth) - - plt.plot([0.0322022, 0.0342226], [0.0519943, 0.0519943], - 'g-', - lw=linewidth) - - plt.plot([0.0496977, 0.0496977, 0.0556013], - [0.0299629, 0.028372, 0.028372], - 'r-', - lw=linewidth) - plt.plot([0.0496977, 0.0577345], [0.0314519, 0.0314519], - 'g-', - lw=linewidth) - plt.plot([0.0559981, 0.0583794], [0.0283628, 0.0283628], - 'g-', - lw=linewidth) - plt.plot([0.0559237, 0.0571888], [0.0253754, 0.0253754], - 'g-', - lw=linewidth) - plt.plot([0.0573872, 0.0590244], [0.0253754, 0.0253754], - 'g-', - lw=linewidth) - - plt.plot([0.0538401, 0.0558245], [0.0519943, 0.0519943], - 'g-', - lw=linewidth) - - plt.plot([0.0803319, 0.0803319, 0.0743539], - [0.0299629, 0.028372, 0.028372], - 'r-', - lw=linewidth) - plt.plot([0.0722703, 0.0803815], [0.0314519, 0.0314519], - 'g-', - lw=linewidth) - plt.plot([0.0717246, 0.0741058], [0.0283628, 0.0283628], - 'g-', - lw=linewidth) - plt.plot([0.07103, 0.0726536], [0.0253754, 0.0253754], 'g-', lw=linewidth) - plt.plot([0.0728542, 0.0741013], [0.0253754, 0.0253754], - 'g-', - lw=linewidth) - - plt.plot([0.0742012, 0.0762138], [0.0519943, 0.0519943], - 'g-', - lw=linewidth) - - plt.plot([0.0171631, 0.0171631], [0.0474981, 0.0542711], - 'r-', - lw=linewidth) - plt.plot([0.0288311, 0.0288311], [0.0474981, 0.0542711], - 'r-', - lw=linewidth) - plt.plot([0.0591792, 0.0591792], [0.0474981, 0.0542711], - 'r-', - lw=linewidth) - plt.plot([0.0708312, 0.0708312], [0.0474981, 0.0542711], - 'r-', - lw=linewidth) - - f = open("volume_id_with_contact.txt", "w+") - print >> f, str(level[0]) + ', ' + str(level[3]) + ', ' + str(level[6]) + ', ' + str(level[9]) + ', ' + str(level[12]) + ', ' + str(level[15]) - f.close() - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("volume_id_with_contact.png", - transparent=True, - bbox_inches='tight', - pad_inches=0., - dpi=2000) - plt.savefig("volume_id_with_contact.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - #plt.show() - - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - axtri = plt.tripcolor(np.cos(theta)*(y+ 100 * dy)-np.sin(theta)*(x+ 100 * dx), -z - 100 * dz, tri, volume_id_vec_2) - f = open("volume_id_def.txt", "w+") - print >> f, str(level[0]) + ', ' + str(level[3]) + ', ' + str(level[6]) + ', ' + str(level[9]) + ', ' + str(level[12]) + ', ' + str(level[15]) - f.close() - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("volume_id_def.png", - transparent=True, - bbox_inches='tight', - pad_inches=0., - dpi=2000) - plt.savefig("volume_id_def.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - level = np.linspace(-1e8, 1e8, 16) - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - axtri = plt.tripcolor(np.cos(theta)*y-np.sin(theta)*x, -z, tri, sigma_zz, level) - f = open("sigma_zz_unsmooth_2.txt", "w+") - print >> f, str(level[0]) + ', ' + str(level[3]) + ', ' + str(level[6]) + ', ' + str(level[9]) + ', ' + str(level[12]) + ', ' + str(level[15]) - f.close() - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("sigma_zz_unsmooth_2.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - level = np.linspace(-1e8, 1e8, 16) - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - axtri = plt.tripcolor(np.cos(theta)*y-np.sin(theta)*x, -z, tri, sigma_zz_filtered, level) - f = open("sigma_zz_filtered.txt", "w+") - print >> f, str(level[0]) + ', ' + str(level[3]) + ', ' + str(level[6]) + ', ' + str(level[9]) + ', ' + str(level[12]) + ', ' + str(level[15]) - f.close() - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("sigma_zz_filtered.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - #cb = fig.colorbar(axtri, orientation="horizontal") - - level = np.linspace(-2e8, 2e8, 16) - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - axtri = plt.tricontourf(np.cos(theta)*y-np.sin(theta)*x, -z, tri, sigma_vector_node, level) - f = open("sigma_zz_smooth_2.txt", "w+") - print >> f, str(level[0]) + ', ' + str(level[3]) + ', ' + str(level[6]) + ', ' + str(level[9]) + ', ' + str(level[12]) + ', ' + str(level[15]) - f.close() - - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("sigma_zz_smooth_2.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - level = np.linspace(min(sigma_vector_node_filtered), - max(sigma_vector_node_filtered), 16) - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - axtri = plt.tricontourf(np.cos(theta)*y-np.sin(theta)*x, -z, tri, sigma_vector_node_filtered, level) - - f = open("sigma_vector_node_filtered.txt", "w+") - print >> f, str(level[0]) + ', ' + str(level[3]) + ', ' + str(level[6]) + ', ' + str(level[9]) + ', ' + str(level[12]) + ', ' + str(level[15]) - f.close() - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("sigma_vector_node_filtered.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - #cb = fig.colorbar(axtri, orientation="horizontal") - - - #plt.show() - ''' - - -def post_process_mirror(filename='mirror_data.npz', - filename_ref='mirror_data.npz', - remove_ref=False, - round_lim=True): - if remove_ref: - npzfile = np.load(filename_ref) - dz_ref = npzfile['dz'].flatten() - - npzfile = np.load(filename) - - x = npzfile['x'] - y = npzfile['y'] - z = npzfile['z'] - T = npzfile['T'].flatten() - tri = npzfile['tri'] - dz = npzfile['dz'].flatten() - - if remove_ref: - dz -= dz_ref - - tri2 = mtri.Triangulation(x, y, triangles=tri) - - f = open("mirror_surface_levels.txt", "w+") - - OAX, OAY = 0.0595, 0.017 - - optical_coefficients, dz_residual = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz, "m", np.array([OAX, OAY])) - np.savez('mirror_optical_results', - optical_coefficients=optical_coefficients, - dz_residual=dz_residual) - np.savetxt('mirror_optical_results.out', optical_coefficients) - ''' - level = np.linspace(min(dx), max(dx), 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - plt.tricontour(x, - y, - tri, - dx, - level, - linestyles='-', - colors='black', - linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, dx, level) - print >> f, "dx" - print >> f, level * 1000 - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("dx_m.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - level = np.linspace(min(dy), max(dy), 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - plt.tricontour(x, - y, - tri, - dy, - level, - linestyles='-', - colors='black', - linewidths=0.5) - axtri = plt.tricontourf(x, y, tri, dy, level) - print >> f, "dy" - print >> f, level * 1000 - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("dy_m.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - ''' - if round_lim: - min_T = min(T) - max_T = max(T) - else: - min_T = min(T) - max_T = max(T) - level = np.linspace(min_T, max_T, 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - plt.tricontour(tri2, - T, - level, - linestyles='-', - colors='black', - linewidths=0.5) - axtri = plt.tricontourf(tri2, T, level) - print("T", file=f) - print(level, file=f) - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("T.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - round_dz = 0.000005 - if round_lim: - min_dz = np.floor((min(dz) / round_dz)) * round_dz - max_dz = np.ceil((max(dz) / round_dz)) * round_dz - else: - min_dz = min(dz) - max_dz = max(dz) - - level = np.linspace(min_dz, max_dz, 17) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - plt.tricontour(tri2, - dz, - level, - linestyles='-', - colors='black', - linewidths=0.5) - axtri = plt.tricontourf(tri2, dz, level) - print("dz", file=f) - print(level * 1000, file=f) - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - plt.savefig("dz_m.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=-0.05) - - dz = 1000. * dz - #level = np.linspace(1000*min_dz, 1000*max_dz, 16) - # Velocity x-component - fig = plt.figure(figsize=(8, 8)) - plt.set_cmap('coolwarm') - plt.tricontour(tri2, - dz, - 1000. * level, - linestyles='-', - colors='black', - linewidths=0.5) - axtri = plt.tricontourf(tri2, dz, 1000. * level) - print("dz", file=f) - print(level * 1000, file=f) - plt.gca().set_aspect('equal') - plt.gca().set_axis_off() - plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) - plt.margins(0, 0) - plt.gca().xaxis.set_major_locator(plt.NullLocator()) - plt.gca().yaxis.set_major_locator(plt.NullLocator()) - cb = fig.colorbar(axtri, orientation="horizontal") - cb.set_label('Normal displacement [mm]', rotation=0) - plt.savefig("dz_m_2.pdf", - transparent=True, - bbox_inches='tight', - pad_inches=0.05) - f.close() diff --git a/katoptron/Juelich/samples_files/Xiao_1.npz b/katoptron/Juelich/samples_files/Xiao_1.npz deleted file mode 100644 index 7b03e3d7fc50ec5955a2e13fc9936bac99945492..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372 zcmWIWW@Zs#U|`^2Flfv5|8MBZ?*-&_05LZZm#1c?XOtA{<rP%Uek1-$THxe~fMWq` z=S_;56SE|5>4Ln;X$#jaUNCQ3d`Qrg8RGNfr%d7!D)&C4>Brh7o~|Ocgz2YLo7F5U zuB}`m40>z=KPs;<G6bMl`C0BmS^&_h2~aDG6LSl4QYp2P%MEO43Nz5s0*?ZQ%RGvF zK#LifM3`~=7U%*nXlMjcNPb7xi0)>HHU@@<#$q57$p-=6tZX1jCLk;V(r-W<1^|8> BX&V3l diff --git a/katoptron/Juelich/samples_files/Xiao_10.npz b/katoptron/Juelich/samples_files/Xiao_10.npz deleted file mode 100644 index 8f8dbe9b26245343bddee73a2d3650a677336337..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 682 zcmWIWW@Zs#U|`^2Flfv54>g#uq7}&VU}Rw62GZrJnduoN#d>)Km9yW7zmgU>c_QFg zz}k6}qUOXb$y>T0Z*tngb&D6wn-(7uG-ZbP{P-!8xP;2R&uIFwc8RB}h%I6IDdo1z zYL*q(R<0+^>-HQszZ+iaYQ5mH=I--p)9QGSEZDD6w9mL#S8>+A{W%AxZMYK0F1++` z=bLR;T`qTvbA2k*eS2)d=k&bu<ytQfEno~lajo$E*S+3AmkKaJTw9!&Tac4Vv1_^9 zAns+-`+Mx0?!wAIKGhgA?`vW=t=Ftx{UJ_t#<K!J7j8Gp15XnFyzJk#bpM^=k`MnX zrfk=`e=yOzIKFq0mlT_QbL_X}mpen+BV~lsmg{~h`%xUSCHt|Cd;7J0t9BkV50-sq z8OoWL`n|;CeEg2+7x9}8zutdoV&=n>1$MitX4ssunNi0kP~g#Ufk%-q-G5HU!;3tn z7xt-J)!%Y;Z{NeWx+8LVu<W+`Tb`EM2)t3ynG;cIZ+GzE;X5@SpKqwJkdL+XkxRR0 zx8mQ9EA_im4>>7*F_mu@&Eyf+-Z9DWM|YaxE}LsT<v0G<O}w(4-;nRv@7<gIWWJRY zh;-DRs<yj%P{QSV`{Ac+7t}BWcr!AIFyl@mz+?gj4UHfQDaD{`M2{|rHU@@<#&tj@ XQsf1Av$BCCnSiheNGk#3mw^EQ_E!wM diff --git a/katoptron/Juelich/samples_files/Xiao_11.npz b/katoptron/Juelich/samples_files/Xiao_11.npz deleted file mode 100644 index 917ecdec9eb627f14875285285a7a5f14c202a28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 720 zcmWIWW@Zs#U|`^2Flfv5w-EGA>;v)=7#SG2fpmFlW_m_Rv0h$5<?J`&ucQS|o(MP= zuy)?0s5vo9@|G^ho1C_A-QorFrp1Q@O_?D+KYq$2E}?SoGn#&^UE=8~VoR8QO1X(y z&9dU!%Jqa<@7gANwconJvKL-{j+(VweS7ky-_N{#?}SfuGC8X&{BuryVE^Hdb!(&2 zKTGladU{QHyVciQ1{u==<oW+azm@p1^ZLK1x7Dr-_%bsDpg8-I>gKB%KqoseL7ZKj zm|KvOO0l!K+#n8T(tGZEx+zNB!dk<XZG8z>LCKBvJFUL_eI3G6ms@b-RrSM_d=urj z-Mjlr_Nl?f%)hrwH<t08{<(L`9<NIZTRcT#<c^*Hdv0~`!Do*TY>S%mb=QXG=I2*p z%VMr&@=dg}zam!msi@-XvBKzz;!Vwkm*?wumYpoH+f_Bg=FFaw6?JR^1s)9-cog}9 zr<g^(`unZ?!>kJDw5qkc4<Ea&uA8R1B;mv4ZT@;Dg+4_;zGnP(n#pR&_w?@f+g(yN zGA60EkK|4-x6o*O@%v#xrNsUO@7XOcOf+<#z5k&3;@-Jct5kUECYL|`9Il@%qjvXK z=;jx-9n81$x5;ch>Bq;`_dn=N+H$K8N9)QThjW*`;L7Rzxl!%l!jP$3Ez6v2=Jc<V zQ{y-0UnUQX5Jn~uX51+Wn3%wzp%FwOr7Lue=y3_r#=y|fxE;tuirD~fRyL3%6A%^w LX%ArJGcW)Eyz3zT diff --git a/katoptron/Juelich/samples_files/Xiao_12.npz b/katoptron/Juelich/samples_files/Xiao_12.npz deleted file mode 100644 index 2ba898b0938e915cc3f3aa3488b233fc8099776c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmWIWW@Zs#U|`^2Flfv5&)guM(huZyFfuT31L^YA%=C<sV!gbA%GqzkUr7s`JP~j# zVC}p~QFCIJ<Skv0H#u$Ly2T6TO^Xi+nleLte*Bb4TtemEXEgm-yTsE~#FjAqlsb0I zYL*q(R<0+^>-e1<_eTHUVzuD1d-1G0**ConUM#)%{L}QWCP^3GZ+^F@YI2afiSE+f zwafQJYF+$t<h-ccqwY@~%e0w}&fmx_l5`=-+Rkmx2kyfQ7z0q;J#TZ!fki+!Phf($ zyErkoASab#cXPQxT+XD|>>oYL^_`0~N7%ihCsE=r0*WGD{9E7S!t>8I?)|Lm-O4ii zT2`(!Rrzf#lFiL6Z%|SmV7~R=-S|0=E_59Gep>6d+WdJ>KD>H1&ocjYlFYWH^?J9y z-M;JSbJjBQgdwYwvD<;CiGMET=gds!c9M;dTOn<G>*2c(^Y^a#QIXK)Y<N5Uzr;j` zc3IOLbG<y@k`vGWSf1^$mpkVk&Of<*Ci~_8Z__<X8)i*sK0H(5^SekszWFs<dXrQy z%j|opwNvKpw}KfFpK4|2=X5!Lc3j$i^Y)~NH6>pSDrZ#cR0;fDmiGJGreAE<8)UYv zExhye!GkOR6CL*@%sRYo!q5NnpRil5;WEv5@YJKE;<Jn6#<Db~IsNP8)cB40m(5o_ zz2Hn<@|43XpR(uwv3d01L;9<q=bCFW1%Ab-#K;|s-?k{j@0*%B`+R}Z#mmfPW$M;w zy}5a0<}-oTWA?(oB9uytRxvXKcr!AIFyl^yz;p-(4UHfQDM_MhL{9|}Z43+zjXQu$ Xq%;xW&B_LnWCFq>Al(d1HVg~^x6efG diff --git a/katoptron/Juelich/samples_files/Xiao_13.npz b/katoptron/Juelich/samples_files/Xiao_13.npz deleted file mode 100644 index a6df523a8a0cbde295076a661e3f23612888368b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 833 zcmWIWW@Zs#U|`^2Flfv57qHy-bODgJf{}rN8%UR@W~OJ96zk;`RL*`Q{z_Wl<cWY| z0c+<?ikcI%ByZ`0yvb<`*DYQ!Z(4jv(3BbC^W&#X;u0$NKBMW!+9jT@BDRF-r_`}$ zR<o?QwsJjT)|+T@+`N3BoArXr+(-7GnR!0A&vE-&s~=hG5}Db~X5RYhy4`GYhE>dh zHx|pICNmeW-M(p8nCQhX*V{fTZR_QgFiGD1^5DMMr4n1LXMdS;Z0Smu%dd}2uFvr0 zJ-mQ10L3Gx^`9?34)nwYCWuFh6LSl4QYrQbmm9<@OzW%_rx&RNEtXN4=I>>_Ch`4( zO;P2aKCdw0&=q~kFuDEXf7$EN^#+!=4hAHCm)lmC&aT$o%~)o*QXooANRR*V_q|r{ zq$*4g9sK$Fv8(nLCK;p1-`Cb&^D6q_^!RvJ)SIa7TDKnFiQDTIy*8o!$OrH1YR@bz zR-{yx-wpFD4wzd~@@o1ch4%kxo1!Cc3dv3pPrG3sGnL`_;??aZ51(m%na;r2&cbn4 z;L(MHQkjQV$-Y{UP~^B%`N-ME&&J=s?_M1wqZKEvA)CWdvf+)@JoEi_7Z<+0zUlIQ zr$-NKO1>IY&Zso_%deAk&tUp7s~xs_H%`<az3uq$N76(4xRZQU3bV9jfPT1Mx;{qy zq!7cx=sU6^&)WPdC8swXEZ-8fw(zFe$;7BHLfQ4a`t7En#dUHKuO3YJQ*i8H-A0r4 z>HIh5{+eYYQ?}vy)8i+WTX^gjF|OHcDtXR5oPTorO!mv?_qTtwJ}jrs-d62<mFK&R z%rBcK^4E%&SbkXevEFZk^_P05Rm=<l-i%Bl%(#;-F!h2#LnDYnO33IM(US^98v{c_ b<4GVBDd7Zov$BCCnSiheNbdxuEd~Yvcg<Sl diff --git a/katoptron/Juelich/samples_files/Xiao_14.npz b/katoptron/Juelich/samples_files/Xiao_14.npz deleted file mode 100644 index 66e523668233914181e04d2add4bfb80d30a1548..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898 zcmWIWW@Zs#U|`^2Flfv5fA=V#V-b*dfsuiM8%UR@W~OJ96zk;`RL*`Q{z_Wl<cWY| z0c+<?ikcI%ByZ`0yvb<`*DYQ!Z(4jv(3BbC^W&#X;u0$NKBMW!+9jT@BDRF-r<9tT z)hsKntz1u-*U8S;Yq5E*TkfzteEzQGdQWCMne6TTdt1>}-lytlW9PH)Pgiv=Q?}Xq zI853+@q+!gxdO$JQQeN}X&cP)?!D-B%-{X>&$b&IZFp{d4L{kv`eCcf<+G~)+RI-4 z6!2wc2te_Q_G$iqY)lLc3d|6%6es2u<fKyU6)rc3XPET*b5j$G4<*UY$iLU6)AOn9 z#>1OCjVz6CCfavg<0)@AdHBb*{;9kE-D0u6qThEjLGk5-1$BRqKJA^B$#+(Gzl2&I zN0GtJbF=FHRW>=7+_zqRtd+CCZdcWeJ;qmTX8fD1zEu6>t||+g+C$Zw@+WRS{BWD? zKEsDACH|D%J9X3gOOTA%$^1Jd<#{`tn?8N^uiwAhN@Lb;Q)3yg!XG!YcYmIj)Nwez z`^ZtIUz~i``2W;Ql{<Ri=ZjZ~pA0@H{Q5qp^k#jF=COxPw-)_a(%i@=eEvo3hi?BP z57Z^zmTg$qTM!U?a+}7Zkd9`Vj&Gj|BjlpWZG+7voBwOPNq_Tc?MJ?(UFq}AS3Z1k zLFwC?8|#l8RNUF6`?EJ_)?pQse;4&_j_1kvmcEG1c>Fgrb&7M@ZS}d6Ps_@5J?6`Q zDC*sO;kwepPX_y*E^gA{UCGd1_wL=z<+gKVr{t!po`1H?%I20}+Rb0LZa)lqu&TFc z-ATUq-+l9|a;LC7U%Yxh%hdLn-x*iUe>%hIy_Xn2`%TS#$D(=O$avK*58b!Mr})RW z-J5Rw@7>+(v3SuZ>FFZv>xyqbkJ;*7_~Qn{!^NxHPjWk+P5#Mzksp{`7@0(vai@J? u@&|*4Mi7OR6VNrHr!<H*28M>l(?BLtx(o1TWdlhv0bvo4{sl~)3=9DD2#ml0 diff --git a/katoptron/Juelich/samples_files/Xiao_15.npz b/katoptron/Juelich/samples_files/Xiao_15.npz deleted file mode 100644 index 34b569ca9f9493bc33f044becfde2b93142ad342..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 964 zcmWIWW@Zs#U|`^2Flfv5|FES>coT@n#K6D}q{~w?(=$qn_3{cTXTK4DB`t9BM8L6t zweu!L&52o(w{$_?<g|tB7B84LEj}b@$_(-O@lz&o36*=F(ez{O5>HnVTf+2HN^P3e zEGw?9Tu+$SO%}a0zxRBr#e&P6UGu+(+36Q%-25K(v@S=EP50*M620Ed6EdPE*FHLZ zP4lD6WvSDBnI(61RA;5l*^qI|=D7*auY;#T7T#XRD^XH%bfbv1zR#^sSFhAx+w{`q z@}$VSt7fLHlqk_U@6xJlzNT{-V*rZRCN4RWW&!lp1ZIfWiW74Sa#AVw8kZZyb4+?q zU#|b>yOF<y;qq@=nUcjZ{2rW35<X;aFEO2==TVZtz}U{haaQ2bg@kPnH(vgi!M-n= z{nw8FyDUuRe3^dp^aQSj{4NKcCf1x@d*^u2EGAj8TT{2raNA+UB4#t|`^(g>!>Vsv z-vnR#VPTLb`oG*;<>tbWuh-{nF6}I^+f_Bg=8VmZf1c92@2XF$wzhat==#>6tl)&s z%395gInM;H-1+gXZS(ZzQ-6NCTU=MS{=#*7-DE$nw$B%@9)6PeOx5A5e5uX^jspI2 zgPqetK3SYNyYS-cos)jQ5@|QR{^rrUv%F;yc25toHXdSWZ>ary{(AJ0LqA`<O8jK- zIpG)obo;9Mh4!Zweye+4mtM`zzLGDJv9{TSJzC(eqL3c{W9}0*7E^Sk85chPWxe5l z$+LK=i7f~Bf0}W>%qytpu-(Q=@6V}^W%ArZeQt-pdj8;xkzv-MMJnw60&_*!rni55 zzd35zly|&k6&VFOIvOVrK6Kd_AGWP(mh-*atHtbW4)W#A36{TqXXb+g(Z6q8H#KBD z=N`^KxqW6h*VXgY+ft&cH|}<ho^|!*;c4gi3NzdG{B2z+@n>)Pq$N)#1<U+f|L@R_ zM|&3^UNU#x*Y+)MWb~>!@+0D=K1(RG`!M0Qt~>kjc{%_0OkT<76h8Z3x147yG|Ucu zVP**MW@Hj!#+`eB83+s-8bK6NUP9N1o;D%c7#JEFZv&Y~DK)^Gl?^1x1cXIE+6I`I G85jWXB&ak1 diff --git a/katoptron/Juelich/samples_files/Xiao_16.npz b/katoptron/Juelich/samples_files/Xiao_16.npz deleted file mode 100644 index 938f63549dbea270f5ab541256661b920f975f36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1044 zcmWIWW@Zs#U|`^2Flfv5Pj$2v+70AcFflN21L^YA%=C<sV!gbA%GqzkUr7s`JP~j# zVC}p~QFCIJ<Skv0H#u$Ly2T6TO^Xi+nleLte*Bb4TtemEXEgm-yTsE~#FjAqlv=jT zYL*q(R<0+^dOx>h+O(Z{$amz@`=07Gs^O}_zU!wv-5#>u=g5N3xp%L-ykHaX{TzGu z)~lxhZYHvqOVj!eU6<ndb@|}3?TO-sFIQ@=nZHy&UBGwxsaM-K-=3Cm;ooiZ?<?!S zs?2&8d*VT9`*Mlqd2cq(-hOl8!N%&khpj6Z!g-_^0#N+;eoOtMdZ7P4Fhl%UoS0jX zlS;84x!fSWWLkH3^}evb9vtNz*8;kOwYHW2$V%OtT9z>Da8T=<<G*ws^6mSsemZ7F zU#S8A)2!6#{jHxbUOoII@!7#I{#!l1Jbcbq7_hVc>5JNMclOW1u{E;qgJgI3O-nts zpQC8Sytj}3J}hZEyzI&6iK1bg1$MitX4ssunep%2s~vakc;@j{=UhL&%5aCp7D=Cz zKhoyED&XqPpRl6v<Jtcy?F-g=M=!CuBg1F+tMqWqzP*Rn9OaKtsl6og&pP|eirWug zefWO&`U!UNV3{)CU1Hyh^SI{puai^bH|Aef@4Wxbzm}hgeA4UP&ffif|7_yC>!&1{ zcs2RHhjQ7OoZ~Nw`0~wS_uqCF_Sa4Be4piy9Qyg<RpKXu&k4U=Q+u0))7-4Cd^&sO z&IREI8+IT1@%7XEPKlbs$J4K$sTX@%@N-M<tfK5Shc*AcH?DH6k=fzHcXm(m)Hezo zi|ShsK25CY+~+^pYxythBP`u-(sn$3vf$^fS4p+$s}5(buD<SFR&9Mmyl74kmrvP? zj>36+HMBU-xrg&l4sV{te)<3J4f}RKJ*dFGOxfYq#nX-5_fzg3`+8F1PyZ%K!;{~I zWq!;Om$@zX=zYP~Z^h@f$62>GaCW-&Rc7*OxnEIx^YCl=kGJ37eruVf!v6mE!<y-v zCOxPr`D#!(qtf7S*1mu3hk_Q#%FVb@<mO*ewqt8%^V?G|LO66~Ij6UOlyo?t$mnF; zVqr2<|B1)z;*uMt)(uB*+&$R%_gS`e@?Mj6;f$JnzSpxazguF(08FQhOd`y<b0aWA tf<Z$gh(gMn=o-<JI7Ax*Lqp>eAQLIU2Y9oxfh3uLun0)^0P_R`0|2V5---YL diff --git a/katoptron/Juelich/samples_files/Xiao_17.npz b/katoptron/Juelich/samples_files/Xiao_17.npz deleted file mode 100644 index 4baa4cb0c56a5a441030c460ab19c70739bad042..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1094 zcmWIWW@Zs#U|`^2Flfv57YX?Pb{~+Jz{J474W!FcGt)CliuLjeDrdhDe<dw&@<hO~ zfVJ}`Ma_v>lDBk0-sH4}>lQDVH!VISXvz%n`SDXGaS4@spV9PV?GjH{5nICaQ!0(k zYL*q(R<0+^>rTWAzuqS;ZoT00X0LbB)8>9rnf1?Pch}Li3ptw4y{e4(b3kue#;s`g z58+;cEEl&t{5*ZF|D~>uWv6$)@x8w#B=Lgz{1+$B&YACTBAZn3;^<d#OP9;rHmjN4 z-lmpxVN<*89$~IS9n0dae#YD8CiOc?pSl13vcX<~W;TWZ6mPyiy!!DvpcfrjAl@ua z%q_@CrP!NXZV-<$t@D$eee(IDWZ6GvwI4Q~`d+57zsBOYf$GhL3@)o%tPea%tXW+i z&a3=4Ms}ZA&CJ-%$L~GNOicD`bf0y&aqV__Z_ynVXM`V>{9ife)rC8kwpxDn<(kvK zPEL*An19*-7pwC&v*#=n*md^!!HK5dChv|hV!I!_<;jwo)IH8Ge|@_vtln;IFiYph z$xp}cEqwU=WlL4NN&6+&Pg{ju4#`eCZkKWDd|zpVT)@Lg-__X8xrg&lZlB41S>9~9 z-D!XO6N>w_KIL8GuWn}+cbZniwCaB9>YX<$k{2|GC2fm}s#<io@G$doB@>~CH6>pS zenzaQWMBB}{S?!^?_&iXZg~CRsd<q29vQLE^UHqTocrd0neU=aiS82)|JFU){@vcM zAmHU1QH@>lyw4Y}Za-<?HjDjwd}Z3RmhFao_Br!@&N1LF%BZ|iT)fRoi7kG^Sqt6z zpdHRtKJiE2E(>5kE?=s>v@%v^pS7OA-OS0a9(;RnC+WVuBVYM%)h~H+J_Ql`c5H}! znlA$ntNT|1Zohxr$iObS|3>c2?J+X9uBZ5TJ@qO5ApG;^mZY8A51)?hJuY&%;idlH zP?z6-T`c5dZGGg@;&?*pOXa7RoUZ3*H~t=W&-wpcS&{2!S3fNGC@pY&y!_aWe^Zh@ z3U92d`_8tztH1ff(>vjFkMZ$|-PK&X=~yP8x6`NlSL;3$?N~JR(x(NMHyf*ObDpbD zJ6T}2t7?YLnLWM%f4S$K^_`Xc?1jLGo98e1-#U2kK&9`-zEmkT`+d5PDvvA=X}?)) zw!Z9DS6M}HNuKQVW!=rmoBU72T@GRA7x-(+q{si58JMgYnM9az=U-qJ27`u15QUVR k(KVvy2#7WYhK9!HKqgZD2=HcQ14%LgVG)qt#|+{D007MA*#H0l diff --git a/katoptron/Juelich/samples_files/Xiao_18.npz b/katoptron/Juelich/samples_files/Xiao_18.npz deleted file mode 100644 index 6c432ffb115272d435a9601fa6b91188f3880501..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1188 zcmWIWW@Zs#U|`^2Flfv5mymwA@H~(=gNcEG8%UR@W~OJ96zk;`RL*`Q{z_Wl<cWY| z0c+<?ikcI%ByZ`0yvb<`*DYQ!Z(4jv(3BbC^W&#X;u0$NKBMW!+9jT@BDRF-r&QWA zt65fDTe+SvuPdLWnrBtJlJCf++wWR*^3Qu8TCloYXX-ptP4?z_k&ou2?7TcTV^`kO zr?+=MpK4W+={N26(K&u5v6~}LZmY`IxLES_*{oUXWuHozoIb{5wpjS3%jIfIo?mwM z8b=o}|1w*a|5KsQu{dsK>MrHAGctZ1?Am9vEI-iY@-J?wpEqASbuQZ;Wf_;@;dyKU zV*rZ3uRp83`y1%z4J;6U7boTx<fKyUZ!R~8&zaWgpZUCPYnzKzN#3O2*(HarDjHU_ zAAY`BlW%kQ$H*r&9Hk$4{#Mi!)z4u*Ki}oN*4qpV`B+;YximSS|En78dDM9q$*!}g zO$oDn^F(0Vyr26c>$O_G^|zcp{KNd2?fkGR`x6h9I{LmB6-+6Zy>yGx&4+eU^)ns& zJ72f5v`?8_&wV}A+PdU@R?eTQ`}Y!`cYglYqnF87l%Hdk_pYqyM@35Wh7Wf_+OO{A zJ*m{WvcPUv)eM_6HZ$tj1PVMFF7PPwr3cN~_UkTJVZo%5)oG7Q%OWCHPT#R!?W&_{ zQr*v&rycqDn|NcEtW&k9ICt;$*1}AiIsNP8)cB44rB}t*bU%~Y|IDGigI#p4=H$1s z67ynC%ziWb*@1}SU7JJnE;OF?JoW2En+v<y*6Z5JuY?}flzcU)oKZO^;P2{l->%5b zk$PQl<jfE0>>d5iGXe`I&kftuY~N8Q$~L|I<Nw`UcP~W>KRA$ZSpV+tt2ZCcZ9IF< z((gdQ7xB53YA263)}CEA+wRp#zWeWLW`FsVsx*f`SU-g$kbiRf%<uB6{!eN?yW9BY zMLt%pqNnG*m}UL;>suVUJnKb3-?8hr>mx2is9ZXj75!uFSFUe-f3|PE-{!xeIO3Mj z(J!XvXC0+`-yhvM^=W9ytmc<fZW=3@9F`TU-xQ&}>iJWF+KR_hR_UJP^I!5${>xmE z7X~Xk9RH<7E;@Yn&6F=s6F0)c_+Q`S=XxP7t=1N|rPyoi6W$BhK3@L9`MU}GZ+Z6r z5sZiPjd#m_4os*>i<Ee^ef6<JKVQ5`{PZ{AbHcBwe|Yt_6;xPW`E2$(o7382&9;f> z4Y&FgN4(jw&G6Og_QRLH20scnT59oP-_4p|_wJ=264kV(WsjDY+sZcS^1a(L<@uuz zNy+sKwtKB|R+9Q(v+2*HO!Y~!3<2JZOd`y<O9x;90R|0?APT9hK-Y+#y&&2c7#bRX Z0GUXcEx?<V4J63~ghfDF2ACfi7ywAe9<Tra diff --git a/katoptron/Juelich/samples_files/Xiao_19.npz b/katoptron/Juelich/samples_files/Xiao_19.npz deleted file mode 100644 index 3b65de7dec83b286a38c982e2a6a6df514a3e9e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1248 zcmWIWW@Zs#U|`^2Flfv550P`>dj#a2U}9k42GZrJnduoN#d>)Km9yW7zmgU>c_QFg zz}k6}qUOXb$y>T0Z*tngb&D6wn-(7uG-ZbP{P-!8xP;2R&uIFwc8RB}h%I6IDfR4_ z)hsKntz1u-*A>?<y7Pa!g@u5(|E^8e??3EM;HjFs`uLxww|*{{`%-_m^zU>L_C0TS z>x;sUwH+B&ep#=-th8JyvBm2>dt>wVUc-#`uZv>O9!!<^qJ22(t9a^6m&^U}rdQuw z(LB6hdgS{#^;Moy7fYO-SEiR_D6*Z+ko!E-dox4xH-i};*PU2)=;70C;*RV$lMOSP z7w>0{@oN$GJ??+vLZN=K(kwQH0F<B*6-d`rVP;?uV1)!labj*kPAWJk=1z+C2riU4 zo*uG9H+$;Lr`N<zi0N{wMu~r2{qoA0XM3N89p72pcgyH(<;$dquFNGtw~nrn3lcnS zFyUR~tSQY|wh@7oB%*HghJ4!QqqOwz`NJRA{y#na{QK(4U*S3Zy!{ufI5x4iKQ&1< zOFLoi^>lXR)ELdFn=>V6O19O8M6sRqxqG#3Z(7=?JU_D~#*^1Xyk9$|YHg5LzsLXY zmRq09YSOpLcU>73_v-2^?v<<8eGC`sW}chR`m=Z8in5w%?t9G^`M!F%GS{r=%z5GY zZ)CTBFP=W5?97Y6<i97QSNHR>Ih0jCT+7eO(^TP;|K-NzAeZE{X9cM}{t9bY`M)oF z{zK7w@}FRllTMdP%syV)sH?H6<A02&;g7qwuT|#i9yYZ1ui51OYth7}eVxw?dc@6o zMEQR#c6oG3t?tkP)3>qvZ%Q%!_g`q7-D0xFc*VDC9LmT4*nB)G_j2<ogR6gTS{rKE z2!GwA$+A}X<FefDj4#y|XV!<i9X2#Qf33ij@#*@!C^r6Amd~Dd`hRnK^LMIu_wiNl zG8BaDEOV~1CZ`<w*=5i=?^t|&C-a>}LJvbkWzBwYlzna9`sB?DotC-BZsx77&xt&c z<agn2{yWo;8u2U7YYDqPs;Ykyd{y?a$+o-vWj}8$Jz5s*Rr<13qo?<^sOWQM!GAwa z?|OP#;>y1BMf&?zG`{YPn;kKmqw00>d0uBuna`h(s8{=b+jsxslgRm2<%uhux1L_P zq`>B!wf(+5`hwq=Z_(@f%y~cV%#Sq}k2D6Ys-5e~_~P81>G%F5e478~<Mb<Aj~{sQ zVTF5jztgMltG4xR-3{@c$9&z{+OOYkT3sjoZHN7tjT$|dchvna*uJCf(B)aT-m#0x z?wdAMUTOkM;^a7W?kyKN=3d%uZ8?8K!Yjpx^SP1?*1Jx<5-h^Myz`!St9FB8gqEt- zxB0iW%sF3py`UpftkWd6&Uqt?!16T}o3oANufMQ;5-Hcn$6Ed8^a@7i<=myOq}lp@ zRz8|+d+B_kbifLM?zUpXNj|;$W=qzc7ERq;VYp=K%PAXgD6V<Eu6Nml``aI^J=*_h z#(Z_Vo63Lp2Y53wi7?|XS%8HL7&J73D5P=*T_buvglJ=6XlUeSWMDwbl>y$YY#>P{ MAS?pX5iB4c05wcJ3jhEB diff --git a/katoptron/Juelich/samples_files/Xiao_2.npz b/katoptron/Juelich/samples_files/Xiao_2.npz deleted file mode 100644 index 71a2c4e6810a2df289a299ad7de8b83a334fa2d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmWIWW@Zs#U|`^2Flfv57ZlBA^8xZ^05LZZm#1c?XOtA{<rP%Uek1-$THxe~fMWq` z=S_;56SE|5>4Ln;X$#jaUNCQ3d`Qrg8RGNfr%d7!D)&C4>Brh7o~|Ocgz2Z$F{@ct zTwA$B81&c#K19B5@MC5OK(W;I?AN{FK+85jEiF#WEyziw)KV@tu(c`7dTa(9g$%*G z_XMmIC9Ur(9%KaC&&VXgjN98lhk!vtBZxu@1ayt)PKRh?U}$J81u~I565!3s29jg~ M!XhC36~tix0An_5*#H0l diff --git a/katoptron/Juelich/samples_files/Xiao_20.npz b/katoptron/Juelich/samples_files/Xiao_20.npz deleted file mode 100644 index 2924847b69b9688d103fc30e54614c80599c0121..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1332 zcmWIWW@Zs#U|`^2Flfv5k9~9F!fPP!2NMGWH;^t*%}mcIDb~v?sGR*q{FSu8$rAy` z0@lu(6g4MiN#4>0d6Ux?u3Nld-n96TpeZxN=f_W(#3fYjeMZxdwM#r*MQjPvPpN0q ztY%qpZRL8xyzcwzn`X9_lV3LY)yLmj5F+`Y(UIGJM!3KSW69=w`429fnw;!ua`xh9 zj}x`-S{Jum@Z0wyHh8nai*Nd@%LLVJI+m3#Q>)q}E+*i6d(NcYzkcQzvgv*>|M%w6 zzod4}yr1<x>r@4N_iy~OF+aG-kS$j9tMj9x1dEF$U%axv39CDIEZcr&W1^@3358kv z-ptyRzRii_;+FSr-?uv2^BTUenSI~OJ>s%K215W!m>5lY5R}i%z)-*n36tW)+=84` zaG1=UknIy(F4HC$xYOr?fTYzGHq+7uw^Uw_IkgkHCU&pgo3Oj+<<8QaxC2QaPqC=D zb+U<+>M88twAdivp5lCk#gvQ7sFg=p{Hd6rrr`2L9bJcB{8y3NSGn)cr$6(**V@my zvvrn6YhF`q*Ihls)2ha5g%dpX9FoxZCfwQExooXkR&mXu&ZlnoomcjrymO+uh-vDP z-VcWwp4Kf&jsM*l<U0Si<^Jyze%jtxcX0JZYl+Sa3zt8Ct!_~8<5Tdrnxc(ItG#SW zc1Bz2&7H9DPg-eEOtQhIy!)wDQacM}W|Z%Gcg~0J)3=3H&wo~_EQx;p^Vyn1^2O?` zJWmRf!`DByedtxT@3LsT<fJR?ZDv>3u>AIC)e`Qx5qbI9q^lxKdApLca#Y%9->r`; zn_OVS{rSk`y??jWmDSa|-%Av=GB4eKrcSm?<XhX`aJFty-e%wQnx`ClWdF3b&vZK) z<i0)iHjmBZKl<BjKBn}4nSQT6ELK#md8U2L>#VPw&8dyi5j$qOo_#SjqtgFJ>X&Qp zxHAO{>aA}4n7&=)li%SdL3;(SZM!a?^!xC`CmHj%8BA_mGW}k;`MigbGt}q3nfR}v ze&)ZFm13;Lr|N^>#4*Qi{WWjvTu0A|r*7_XY@Ot~);c_0^20vIV3+N$D#f04s#h=3 zpU7tM<?kQaBJTa0>Yr}n`{zB6-}*|x;~fjP{aahz&sVlso+tUbAMdYSE4F`|!*r_Y z>`UgAs~s}Cxs3e^Z(O>*#^#17>uQ}tuR`6GKc&=%JxuOOPn=h=Y5VbO<)wdL9?Z#< zNoj0;mizwNqo4IJ@6FBpa>Lc+J!f`ze(2Pr>ksaFCf?n@m0kI!>XSczt@whYqQ0NK zA>7r_@u6u!u+FJP{F>=s48Wmmd#OIm^7ZdOO<y<g6bFBQKOxC7<ghQ7a@g<q#HI~$ zt-acx*Lx=$>b|<jxlFkY><0H=Qk}d1oxPHAqC0)|`g6REPb*B{Zky}OI#=_POxVIb zFN^+nPy8QWxq5xZCe1#emLC$g<EE~ie<L#L({DG`BDJ#WQ=gaK(0=>LtJCBW$J8rz zC6k1_|E)Vct;YM|yw{PZBh^8k{ULH&?xlUr@_*&wh6T_6Yqwr2&<PeybeZ1}omD%h z?yJG0Eq;?1`b}7T^O5kI&%P2-S3*0P)yibVr~kWg?exVT90A^pOd`y<ODkZ31qKa` pAPTAMLf43%r6JlF7#bQy7#SFlGI)SDD;r3X2?&dT^cofr4**WNXgmM_ diff --git a/katoptron/Juelich/samples_files/Xiao_21.npz b/katoptron/Juelich/samples_files/Xiao_21.npz deleted file mode 100644 index 0238893367ebd5c935e2b2dbbab1b0ddb1262813..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1409 zcmWIWW@Zs#U|`^2Flfv5k2<|5><f@*!OXzG4W!FcGt)CliuLjeDrdhDe<dw&@<hO~ zfVJ}`Ma_v>lDBk0-sH4}>lQDVH!VISXvz%n`SDXGaS4@spV9PV?GjH{5nICaQ%dZa z)hsKntz1u-*Gc_rUHLMqlJ7;y_1<^)PDDz&Tn@}Eik*7j#vtQk>-H~tYYNn7-P>Zc z-N|t|L-V}_+UZIk4JT*Z`n2%-y$OpV7QI|$x9ohO+B}!b?`~W3qy`0bEDN8qy#AV* z=dlGx^$a`h`_3I(@P1irqHd?J@~nGT<{eC3FuTL?w(sf(CbMVtI?jKj7j2dAW^(b1 z`_DNK*lr5&MBPaG{p79LL6^(M&(>HU{(YIDdEd;c@?Dj4gfE&f1fT?t(084<&A@>9 zzzPYR;>6s7oK$e&%<ZWUm|QAzyuDNX@(#X3&MR(c$;vn{mgmxV$19yIc!o9aK*Pa0 z8-CRjA~)7>u=4S-9t>IGH?v^(QjWh$5wZc(#f5}c6w0+f>r`1Vqx-<Q&DzI~7Ttf| z-~RvCzt20bfB#yy-~Yr^&#n^wzL~*F1_7?WoE$~`H_Yu5;HYG}6%i4$LidE3n3Tr# z{UNjCU3CA7?_GM=Teq;_NSNaLrvi%Wr+lxM-#$lrwRNFA_r!UB`W&l`zD<>4ZM<xG zddItm<<tJKiSA*puRUJfD`gk_?Vi7;Wmw4X9+Np28|61?87S#WKKuRNe#V!pj}Bfb zzWVuSR@=?WM<?Z8PLKJM9$&spDsj@s#m<+l1Gbi??hWy`->1Jq(tpQlbCX&BcQQ@d z7<_d04keb*r|sV}GJL+R&&fO!eBk(_JAb6Y+dn)n&;CE-qS2Xi!v5c8)Olvb-8rjs z#d4F~XJggGZJV|(e7=oOcwKg=;k*r2S=)X0+wqz{EfkeMkz#Q(rr@>P492hTkG*F0 z)oic`j*FPuyzbwz9yP1UiDmODHeG-5ZvOto@?KfB!e{-8XI&L+R=ZPI{f4P^=bZ=7 zS_@dO@jb77sd(Yxo2beIUu|>`zp?q4@_yp(e7>pkcHRDIwZ}64;~{RB8NdJC>phVo zb?n0Zo#A3BAGUfgYPV#|G0BbE|7z7dutnjo-nGlDIhA3%;E?#L_CJ&Bk2~E7+i1Uc z&Y=@mXSMWviscZP^=8}AoI9G;=cm0|m^fpu`n)$2|GhfwxR&>4*YWFu{rA%UOZ|0C zia53`xA<+DzU(4#E~f0?Qzz`mixEoukhCN<Y<o}iJPWhXJBtr~ofn=z@A~owy+5bj zSm+#7@^xw6zLdyYtM}~q|611C(Ei^Ny~_1`qG7Kh0&4j{o)Ug%dnrDr`bl-3U$5=k z$JV*_M-rNgwmO%#9^$%gJL_D<%-O%M<$jiamcGdM?TxQNTSY9t>;3t5DwFwAZ2073 z6^H)h3z_L<2~E6^IM?82^2LcpVY#+`iDx#OzPn&4c}h$=UAK;{Mg6^@a>RK9Yk!-Y zv&+6;cB)_F6C>R3|L4obbep3VLQ}K<d|+tx6U#S`l@p&P^}xQO;L~Fp)gHgbf(IKo zjQl(gG|V}+y;-fkak|jU=&W~f#_7pv-ZzbR`llO%)5fnme;YU3-_)Ab@b3RQ4*#u} z-yU<3TC7v1rN1)o=j9JpZ|~pzvRvY_;guKeTa|7E2iv@!_U*dm%G37kofjkB_^*ov zTNJIWJ`(R^2sX~+e|&&9Ba;X-?xGJ^`hh`1BZxvO2+=j77Yh(=3=9p8vWyH2NQFdz SH!B-Rk_iZlfb>rm5Dx&K*pQ3> diff --git a/katoptron/Juelich/samples_files/Xiao_22.npz b/katoptron/Juelich/samples_files/Xiao_22.npz deleted file mode 100644 index 16cc46634ba04629f0ebe6b3e1c720612b222df0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1497 zcmZ{kdpHw%7{@n5;W$cI?kURT9v&0J8It8R4(2iz!?rXNa@&zxA<5lzkUJeJLkLNo z3W*}ja@#UPt|KHJ?2OJIou23X-ao$2`^Wn{-{1FrpAQlN;+Fsb0Q&*j@x=3dvD6YS zuZso&03tjM^&#N!!9kk-0pWQI;5pd?U9XTG$Oi=(uKDOP|MDXLOyA<_(xL(i#=$=8 zHn<Rzl_4x1is*s-Dv$)mDNB{{ZOTx5jdG2I8-&>)P0pQ(pxmp+p+y4|9JdN<nhLfL zjixJ(>C~y@I{A5Z1-RwkG#~BoZFQ#=#G5C`SK~5>Z=V-Q-<C1eL<y<n?ri(4TE?`5 zmCQ~VadMbZ+2(pg^Z@;y-kUsp#0Do?V22oPF@R{J4!VRq1IHDF_<9grUHRVC199wn zNfyCkU`}>%3T)GI$o5pI3>Vg>Pr-lvl>7m_5g3_RG5pw}-|d>a_QzACTT`f}iVJ<D zR_O{(vnpIq6oC9sPGG$B6o8+Xli;_Uf;@=<mwfhex|8OIbhsiHk7BXR4mlYBp*`_| zK`1Xz2}*Kg^TRQUi?ilqb@J&Mz;!b-U7Iwe8|`djvHn4&E6LgjbUQ@e$Fc?j7lcC+ zf&1jV`-D6#=n(AP?Lx6m(jBd*;cr*lIQh^HJ<E#`OTr8%j|Njq)Zy3L$G+_3{SgqQ z#4LnpP}S+#c$;p>$Y+=b3T>|Sl&U(I{jOW?2t%2jz%RV1zs3E#DQTX*nEXC7^<}pG zjMz{awlQMu1uR_w+jyD^Sh<E_LC=Fl?=8c6OK1Ho<rH9K)_S}8b;#&qkEe;J<M;!S z5~f#r<<D+*2bF;hUpEZWGtB945+5m&Qm&Kg@C@;DaqpUzFahNg7jXUsVRfOy4EmC| z+nnu1{tbm84?@<lzpd$_q<f#C{>&jo7n4kZ`QE5rolXhvcthp>?bZ`Rq_bQ(D&ynw zTn={AFx*y)eAFRs#s7EQNIt)1*gOGO3gnFVTN%s?F)yWUFxJy!b9~3dE0a1DJVhk8 zL~os4@v-b|FkFya%!?#O$2w}HwQET`Pfy<{tmmY+9jRrP7;EhV7B1UxlFt-l(Z8r{ zS-fDc6<rO~6j7V+rZKGar+Yc6&<2B4pI!fFzS<!iWzT_zox!Wa6a;QkNu5|OD2DuU z^-E7_P5V#$2899nNdqN8Q%l9qtBonm;jAu&*}I|zh*`R7U#Oq*Z#7nYy@aZ8vO?U8 z1XxwehvH}CwUqH%0h#)?Y;UPmef6N#mzgI0q^QRC(}TBf>TYggs=X^>#alBXuuiGD z>b;4RuFz_n<`{IUI*u|^(V(g3!u!q%av9TcSYtcRp4B@!J*Z?V^jfxjyiH9|cQg{- z74iIZD$Lz+T^mG6X}Z~IU!ud<x<Feb5$?+$7Fw}Q$4(ceH*+fC7^FLm7N*fXX1wB^ zx~3S_TH|e;7xNgNi#f9;4tSI@-~T{j%t91ahnKF7pH7g>nVV3(9I{Z+@UQEQ*#d3I zXy$>bOH%xJWoPE+O4`ZH82FzEcP_?05$>lCdLp<W6KKacwYLMF>8RuO-jF5@P{b!O zn!=5ajQiRsa++26VjA<wvIKI3y#z}KRt@-uK2<i^b45ycf{|bb>#Y<9%NcG?4i0|W z&<mE5@o?TL=#Xl$4mm1+P^q%(SWq{Yyf7A8YGSmzg6;)!8D^FnT!E4YJ*@S;tg9+a zeROV6MZLc!z!0C=P9Q1W^4eArBbXWCM;EQlJpTG1wjn8@W@v2G=b@w42d`zc>$S<h zr)RBalhMkJ#KR%oRIg>$wJOt-`@-1vSq8GNioCI9x+}KvduKA^!{Le`5kNi((ElTq uN7cO-9kVOn0rtni9~tv)jK`c9RUiQH9dVEd0Um|`06ty?^3+aXxBCYW&9j97 diff --git a/katoptron/Juelich/samples_files/Xiao_23.npz b/katoptron/Juelich/samples_files/Xiao_23.npz deleted file mode 100644 index 249b9cd470086282aa46000226f1baf584d456d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1590 zcmZ{kdpHw%7{@0@F|C+OC#Pi8(PcW7=FHHr$faFEM2OrkVI*BdOc)b$$y_I^TsCv3 zX+^HvD3@|6Ns7Z5SrjK6<)2Q^bKdul_j%vv{r;Zc^L?M^gEbeIfB*o1&49x(ewanX zWQwvF08l3m0LZLQL*2YQJc9`^|A4TpX{D*1+dA5@tyo5G%DHTZLVtR`KgFHKyqBMw z?qr2ey{nYxl$s(f7i!MeJPnLj@=#YS+_dytjASc<ijc0Bz9`P*(s!T#Anm6TODB#A zgGGV1a+XiNdf?gdow8Ai{p2&`l~MC!op<E_fV<H(x`Vre(&B20g~q*hLAQ0eoUHZj z*-`E>MGFn;xLGFNi<cXL%5#8n0w$-96-?%hgd@)$CpYIS_|9;~VTYdP6JDN)s#tXC z;g)3gpFR|?LCx)9S1#1vgmnj}l}^o6aUr0qPS(MlFq{u)**8*@P<5%%xR-PtNcM9~ zC!(YV_}at#<S5jH#qd0W;0Wrjib+wpxd09UQE@S(>MzbTaRBx|1`<UmlCcB;FekZT zAmM^vfUnyR19K95u&Hh;ElNdh>L-i>va=xy@BLvNmfN?6qHKkK!`Q6a(0a*72cuQ_ zs)s=cUUa)^Y>9HbgSnIpnz$v7Cjq3H-r19h#X;rvO5e>w&ff07r029Mx)wf>jrTWp zK8zuyb#aem;EM3XC73)xsh(1w7*~%()2w1Cu6W21Gtn&cv>DxT<w0v47+*GUt8xsw zQ(o76C&ibtwiKLX3%|P<ED@2l%(;Nw?fj2jt5E&MUp2MGAh5wg+dVl{*4Kv+!SpP0 z#tBN#%-okdoy_T}T0Ar;@6<3hzw7mr*9u&ljKziWAoa=v)kCBkjn9h$WE9&E3j#vz zgqrs@B>HT!-<)%wOxWlUG0Edi;B)Rw_=Mk-?5djD#K}=_X}6fMM&8upff=3Qpwp9E zyC_Ur@+oPYE8zjrMt`9E99vCT3`$YbiyKhgc(JAIvyZ<Dqj+JnQI?6|L%|D$kTr)C zL(R79&scp;2#}8;QA$pL_GEBcysSu`?&ER$t`&}y^=fQm$TT&0Ph4G5g-fXG%D~aw zKl^Y7I@I=-nf!{e5-n5K;;W}sVd>HC?zvYg;N?AFeu5WOdp_Ds56574$=*MjBkN65 z@fAQ&J%M1IA%pDWdPaLZcyvlmCZv;({B-fTCw=4&XWY;FZFuS{_3NuIk835MsXKNc z@UifZuN`w`O}Yn&d;9}I*w0_<U2rFk9>pLBp({XgXj{A5ZVz^1mCN{>3)%t0oduLz z<ni%Oo*13IV@G_>8tc>q@DdD47g2_;ADQVvJL;m6db%d0pal+PC1Ix$E<Yd2kaOMs z;}c1rmuO4Zm@IMD;Jm=H0eQ*6QpUUbo1LV+WZN1|UwM2#G3o^_ZERa2{v$>=FDa-y zlw*=?uimKFxj-t^8zlp0EiRvg+*hm>cI(UC!VoAey!!WW<!J#>27zRSTh4E;+|tU{ zo|w9#hGCg-dEq4bTt=qI_G#q})3uad-7y%trWn4=q;D8$vb>yaBnf6*@id^bSKQMK zgrW+2j)4Z6_pBKsEpb7IF*_SlX&hZ2`F=2QJMP#~Q8VRnP1<V9s`KbY%;r8SyB};l za=bZYO%p92m9u{ltY{KPJ1>y0`_LxU)}cT8MfL2#-|H^BSwH%=5b~}!cMe=h%VOlA zn-GjnEqCaPhU(^5O?F$g+N$`a(WajlR1UPm$*oe7mh#VthSbck_Z_<?U*~wO2Ewc& zD!GC!BQv6w2=!)*S=SvxPv(r+P*T}kd05d~-hk-`FQJtx)yA@(#YxVOZq$5aO(>P^ zo)hXWku>&!q^uGXGj9(E242@`SQaD7hcSx_pBTLhG!JI<+b2w#U5jcyw{fE~7rIug z4`HBFs&4H(oS)5l=qZ~4jcnB78%}Sv<2LpnV;!ArbXI{_bFobj@&D)bI<kL6MCAAK n6TN>G{>rHh82}IwiCV}1Pt?Mi1J_Xo0Bl;%p!LcGe((MTaIWu2 diff --git a/katoptron/Juelich/samples_files/Xiao_24.npz b/katoptron/Juelich/samples_files/Xiao_24.npz deleted file mode 100644 index 79c69ba38d476c8594ec72d1424eb2a4283de651..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1681 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 VelbBT1_=6bsJOU87j@NA^$!HfBZ&Y2 diff --git a/katoptron/Juelich/samples_files/Xiao_25.npz b/katoptron/Juelich/samples_files/Xiao_25.npz deleted file mode 100644 index de6c0a9bf8011de5ccc85148617a0428497f3b96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1768 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 diff --git a/katoptron/Juelich/samples_files/Xiao_26.npz b/katoptron/Juelich/samples_files/Xiao_26.npz deleted file mode 100644 index 457c26c08fb5030d726dac36cf60729f9396fcb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1873 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 I+;d$02~Z%9H2?qr diff --git a/katoptron/Juelich/samples_files/Xiao_27.npz b/katoptron/Juelich/samples_files/Xiao_27.npz deleted file mode 100644 index ac3720888e33467c4e33b3148fb85b240f66b1a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1984 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 KFY55@kNyU>7rUDP diff --git a/katoptron/Juelich/samples_files/Xiao_28.npz b/katoptron/Juelich/samples_files/Xiao_28.npz deleted file mode 100644 index 8cd28ff90d183b6b49734472866018d1d80225ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2076 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 diff --git a/katoptron/Juelich/samples_files/Xiao_29.npz b/katoptron/Juelich/samples_files/Xiao_29.npz deleted file mode 100644 index 05886390d5c8c3f0919d66847a30efe9a5030bd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2191 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 diff --git a/katoptron/Juelich/samples_files/Xiao_3.npz b/katoptron/Juelich/samples_files/Xiao_3.npz deleted file mode 100644 index 63c39112096774687963de5731858ea2d26e230d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmWIWW@Zs#U|`^2Flfv5_w?6$7y;yM0Ag++E>F!&&nPL@%PXjy{YLziw7|&|0mlN? z&YKi9CuT|B(gk^w(-y8<ykOq6_>iC}GsNe|PnpCeRPKF7(~q@FJY7X>3DZxhG^<%w zTwA$B7}hO+#lNpZFX~N$-|YMi;=6@xB%9e70#F=qLdrh28))$Zr~`@<a|?1(DRlss z8`udc%<JqDZ|?WMlO&V%$7`R@w6gLK^`ARDcNra36myAovpDc1c)=gfmAjtb{`SLS z&K(ooyFcfxZg$=<CF)<N2+zMqscLrLStiK>-OR`&!i+oEfQ|=)hDH#D6o}{=(Y*`N c#=y|f2-1n<`2cTLHjpF}5EcPxQ$`RE0A{O^_W%F@ diff --git a/katoptron/Juelich/samples_files/Xiao_30.npz b/katoptron/Juelich/samples_files/Xiao_30.npz deleted file mode 100644 index 22f997509d24910547f8adc3d2ddd3c51168035c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2310 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 JF-!-y{{Z2!TRZ>& diff --git a/katoptron/Juelich/samples_files/Xiao_31.npz b/katoptron/Juelich/samples_files/Xiao_31.npz deleted file mode 100644 index 3bdc6c63e013b0e30cfc8c8ad3c7d1c86d0959ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2427 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 P*s#8@uiHi0AE&<oEjy@A diff --git a/katoptron/Juelich/samples_files/Xiao_32.npz b/katoptron/Juelich/samples_files/Xiao_32.npz deleted file mode 100644 index 2c97d1fa8065ac520a899b96feaaead81a4e12ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2559 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 diff --git a/katoptron/Juelich/samples_files/Xiao_33.npz b/katoptron/Juelich/samples_files/Xiao_33.npz deleted file mode 100644 index 942988c3efefab15b3694e248d9bfda092369197..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2684 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 Fe*j?;J4pZl diff --git a/katoptron/Juelich/samples_files/Xiao_34.npz b/katoptron/Juelich/samples_files/Xiao_34.npz deleted file mode 100644 index 8955d9aa2ab42b31f257eeacc025c6bea6d17ef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2807 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 X56fZ-JHhm8li{#GJRChv{+j(40yA4I diff --git a/katoptron/Juelich/samples_files/Xiao_35.npz b/katoptron/Juelich/samples_files/Xiao_35.npz deleted file mode 100644 index 341b57eb9cf65f0d53296c644ba4811f54973f41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2956 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 a0KmUYld(Si>EDlZzpnSMc<Q&=2K)ywq^eK= diff --git a/katoptron/Juelich/samples_files/Xiao_36.npz b/katoptron/Juelich/samples_files/Xiao_36.npz deleted file mode 100644 index 43609406a691e9b4591fec857697164dd4873cab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3081 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 VgPU^m>;^e^`mLQgWY_5f{tN58^Ys7# diff --git a/katoptron/Juelich/samples_files/Xiao_37.npz b/katoptron/Juelich/samples_files/Xiao_37.npz deleted file mode 100644 index 39e862f48bf5507ca1fdace4238139e9afe618bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3191 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 M{Bx!MnkxYR0pi0&cmMzZ diff --git a/katoptron/Juelich/samples_files/Xiao_38.npz b/katoptron/Juelich/samples_files/Xiao_38.npz deleted file mode 100644 index 4646a35d35db324ee59c85a24ef578e5f9c4a85c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3318 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 ZFaLUM0uAUHer(d5OwW@Qa^}a^e*nqAiQxbM diff --git a/katoptron/Juelich/samples_files/Xiao_39.npz b/katoptron/Juelich/samples_files/Xiao_39.npz deleted file mode 100644 index 2a0a4bda52b1d0a0ef0e45705181e21cc5ac6376..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3497 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 CUD`?j diff --git a/katoptron/Juelich/samples_files/Xiao_4.npz b/katoptron/Juelich/samples_files/Xiao_4.npz deleted file mode 100644 index 63c39112096774687963de5731858ea2d26e230d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmWIWW@Zs#U|`^2Flfv5_w?6$7y;yM0Ag++E>F!&&nPL@%PXjy{YLziw7|&|0mlN? z&YKi9CuT|B(gk^w(-y8<ykOq6_>iC}GsNe|PnpCeRPKF7(~q@FJY7X>3DZxhG^<%w zTwA$B7}hO+#lNpZFX~N$-|YMi;=6@xB%9e70#F=qLdrh28))$Zr~`@<a|?1(DRlss z8`udc%<JqDZ|?WMlO&V%$7`R@w6gLK^`ARDcNra36myAovpDc1c)=gfmAjtb{`SLS z&K(ooyFcfxZg$=<CF)<N2+zMqscLrLStiK>-OR`&!i+oEfQ|=)hDH#D6o}{=(Y*`N c#=y|f2-1n<`2cTLHjpF}5EcPxQ$`RE0A{O^_W%F@ diff --git a/katoptron/Juelich/samples_files/Xiao_40.npz b/katoptron/Juelich/samples_files/Xiao_40.npz deleted file mode 100644 index a6932e59351b9f03244de8ba0d72ebc48e2276b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3656 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 AtpET3 diff --git a/katoptron/Juelich/samples_files/Xiao_41.npz b/katoptron/Juelich/samples_files/Xiao_41.npz deleted file mode 100644 index d2e9637a91ca865122e162d4abf50efeb67f09c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3770 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 diff --git a/katoptron/Juelich/samples_files/Xiao_42.npz b/katoptron/Juelich/samples_files/Xiao_42.npz deleted file mode 100644 index 7964cc28089a4fbad5ee731886f5af0386b85cbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3964 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 diff --git a/katoptron/Juelich/samples_files/Xiao_43.npz b/katoptron/Juelich/samples_files/Xiao_43.npz deleted file mode 100644 index 8429ceb24d4090cbee0145043b46dd7abcb7bf64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4111 zcmZ`+2{e@N+ZIA7Df=3VED^GWQ6#dC6o#0w?=tpf7;Cajwivs}@}ula_I;f!AzK(} zERAI*WX3jpEq>qmfB$p7_kGWK&U@bTJkNdK&vjk*djYj6D4EE}$Y{uJzi`!8v<nK) zBqt+dqa!2x^^p16I@&vUd5XKa`)3cpZ%;tE`nRD%YBD}X!AC{a*i{F^)LGcYw<A;2 z6^f?CW;%wdnaOXlJFO405+lmhk>enwrtzs4GOelR?q_qO{+{%AI26r0ukm)kX-mbl zN_?O)XQAU2{_a<gb%d?$L_dQ>>?r%<hL$8}*`$l_JuOID;}r$kik^5^De0G);GGIv zfK?};XSj1dmpLaOr^@yQ=_{%btvhXFnTANEb@(ph=mo85d4g3XvuET(rH`CdJ!L8( z#_HF^7cuJ>Ysf2=YWQk&2Pw64s?j?fFDaZ$xj<4fTAcww>^UVeLSf3Nv}{1u>oCn* z&MJ9$rm$Q2dN~*9zFk{S?Hg8^$nVs<HGau^5cKkc_Aal*CML9yabZm{HUeU6S^9P5 zy!cFB9J)xd?6RbqR*V?FyVGb^OJx29LEwa=*hD9X4<bOt*07{UHY1BIRYMp1^_ax> z%Lz78n&`!DMd}UQ<D#X<5o$YJ^S_CXWF~ivr>C!el9!ypG|4%w#0No$pN=(`9^5f$ zE1Li8To4}QF4t&z;=wd?8Tkxx4^LkINKpgnx^T{Cd9<0qPm20|``GHTAvaBZaTH8Z z^8>|3RT(=md!MClY$8@P)iO}H%|Ht7m4|vtpNb=v_O(+{Z1^Y8%YH7n#?pdwIw@ri z@%CIif#M#q&Ahr)xLYJn?&7^LG-2+IhUmYVG8RvOLV_NH;t&0|A(CL%fFTp986U02 zP~D5vnIar_><D<uIqZ}4jUO<HnOo&a&Kfy4LT|LmnV6MafQ(AT*h*SAcZz?R+%c-K zhES6~EJK%Fsl@C`sLu+xe<X3a25rGAZ#7}XIx{G@gLxQn7HKpr#aK|{6lG=gC+uhw zEu+=pQ-r{&mdH0S@c&>~8`?jSK~F|j$@~|?o|dleF1CL$jC7QL9Z1m^$�!#iEUt z9a{(XPc_J}Yo}JlWv5HVW?i=_8wfOgt#xIq1o$#P*;B-sv(&gZ8YP~u8>1!KiV0Xd zh4~#44tLsvgNZ@lxHbPFF88l9HOd-;4^S@Sj4`q_U0yo1-a|bP@6y$I_iS``b?<l1 z?^&vj4G=-cZ!Yo=66M}6MZLVPwAj(%mq(~*qN}s6I~}dqW_Y^r8Z3BV)$0^*3o7z4 z`6=l8l{M%by~aqe+-3cSZHT&hZH`>I9|ME$YIy|gT0(+g*vP=(c7f7TF|OKN_ef#J z#fXPUq~ol8QR#pBgf_u3E4@)Y8NnRZ8=Hq`=+5FpGzJATP3-n0E00%X<Ry-|twa`S za3{ZDqu1HO?M%L6>9$$Evy-p16u)<YBODo2g=O~a`d~fs5APz&Eya$bXlB+2zQXf9 zYUocz84Gr9x5b2Ym(QC)EV-LyzNXWN6yLepqT%@?VU9h!E-@B3>q@nxqY{Jl|2D{j zwU=WyY0q>#pH9_Yw8`S>H*zZp+^iL6%eRg0-vfQeWgP7MxWTtiyZ3xKKk_U{JQHXJ z-+~FN4^ex_?IsIMoBsTKPb-8WZ2Gv+j*#}IhIDY`d$Qk~Gv}~A{5CB|C}%VABpEFu z9(EOdleKn~F4sOh{q9uwNjQ0&49TiI^ZSeG4}H%9e~z(A3-Y2=(AfKu%KA#P0wnNs znQeBRca-7V`_qeZuD~J)r10=wi21hno-bHF4|NRuGByc&rv0dOy>SR>6_DdsjTGCO zvn`)yeYVD*IEe%AMM=lNlJLB|t9drdV!nk+OYfW0ElOXN@2?srWg@LZQ3pqp92^hQ zN(|~+f4-9j>^Z;AZtGOT#?hTV(8Cz$j9%3ztUfw2e_nm1{d}P1lgdlQH&9%_y;ljo zSJXV0pKRy1+(Q{hJVZr(2<Z4I?U)y4(|)tE&_T0W1^ti8PRA8ruP6F5%sqt2y{h%l z5Ip*K5sfv8PYOvLz3j7v&(m*bnXZkq*q%$a>aD}vRab%f?SIxtHj4hbQ-Ao<G2zzE zsU^Zr%(Ba8FS4O<iQmTgSkZeRE;7paOT2|Bld2)WF#w(#@+WzXL-=a1cRjkY|Clq5 zkH{f-vSo5}7o```gIryhqb^HSX>yOseSevj%OY%#0)B>pO#fVorW}Wh6n1;q?NpXe z=1I#IQ$mCK8wRZ|gI&{Xsg9`ge0FP7#qv(H!bNM*LV<>bL9fg`@kD0};5gV9+nRNr z=UIj{2p2`;FJK=jv~mHAu0HZgs;3r_lT&6>;dWRSo=IVk?X1$2Gt%_dFj8oD`ccO) zkLf0<HUfSZ1gTAg6_C6ZEN4@k-$MgYsRpMaR{5RFPkM#y8F|L!`N+-CBh2}ux23k) z>TYrEe7M1eplaHv`ywvY(@<FhKDahPr7TqMma}aXl2J)tk+DmDmK^WX=;z#bR^Noj ze;0m6g+jw=$LLwrNFNVrNg%FT#G}3-u(;A;{m^3w^lxr81*EPDGhcmz&qLh6tP91W zfwYV+p2j`BueX{$S@S7?iTmA*h(S(6lk@X~d{J3>?=GPOwQREbXfxIJ5qI^P3#F&~ zDN*r}edmKPEq~W601LC#Eka(O&yeU_1n^T_S8-XKa}e*-=3vM!1GZmp)aw((*O=Fa zMN;Lqtndc0x$95vE^7xbUe!m?on&=%B~k_%BOmjjOOCQ6lID#gev{WCr&i)>lacs( zonjnGwjDoIsWC(6S~O`5SE`Y3cm8Q0`=qg{NR0v(w}3nhvM*)m{i(EV6aUi~AzV%> z8@n1sg|@r1Xx*jfHu>2+=?EIOgW{F7#5r)^Og=E1Wi14YA?E=b>VK&igaHsUT3jxb z@0fohZ_9X#?Wlf)yw(T*>_#a4?g1g7Ts(3)S^Y&6sLJ(^Z~g&E!RZ|{317UREPy(t zfZk5Z0MI{ZHf0{6n5`kQ+AtHEdArr;fc#wT4jc>-+t5GTr;H*99~CbN)!Eu(7s^}4 zdt0r*`DI^r@(|UJ46a>Wu$_K;MV)`pQ$0r*Bb@(NT!MYD*UN4+jW}pwhw1d|$(liJ zc{L!)<crd7@b3_TTBolw1Zr48?g>-1-MQRfOxdR!S04W`@tW7re}<gVH(whU!{+e) z(TL@v;GEZ@MhaW}bY3MtOSU!{mv+_~c8(DIXK0#pzNi91etc*%0b6h-r;^H*ah(?$ zWL0YSg6m6hdZvu<v>isrPvgG{&9$r={t*w&_JaL%a6r5=ONv>ba0&TX-G+smEVBUi zNb=xyfT9x8G0vGsg6zYqy1uul-@*A+YaG@Pbj;o%t7y%3GnbkADU{1;SF1#O<Y(LX zA*+^xPkh9)iJ%?dqj@W_m^6{IDgaavitsI~uSu`UFuH@gKQy)_sQa~W#Apx3w}K4m zn9Cn<1r^JOZFe!fQi*wKXFKVcVr3SeOTGb&8E~zQh7?VCgsTp29B?8K!(lxwWRd|c z5>A-~&=cR%S&B8@hvvuYr&k$R6>5#!cETUSyT6oPmVNB8n`WR0(lj(Q8~0azNhy&2 zL`I*pW%CqTyI)9FWj%@G;r-w9okr{kM$Z}L?-9CM@+9vKDtF(}JmGb1-<NmPe}De5 z&|Ezi{xaXD<1+{6rk7Sp&y!c9iAY@H$qRxE@BVD?P2q|_=tL+&bxSP<J8_&S=>b>* z0*q180`-wOPi@r{2)cbaK`b}r>(;9t#?oj{mtagYlw($5{>>GGykRKj$%BuiGg87O z<ljhPsW}5s7ob|S_tMkB8YRnzk^z!|{qlpJ#RgRsUdhV}UZ1|;BF1C@XYBDd^Xk)? z*zF{|qF85M-1_11z6n|uN9NJmHfGG?eof_uKqo3CcB3X2=0CFiCM`!IHQ?8IDk|Y4 zMfzsH;xNT<t`+GYD@JzrhX+V)Blg1GXsVJ?3zwUl%x`Y{j&9CeI(N2H@w*%YeLZMj zX7)4ck5+<i&gFv)K3Dj<0sOE9DcO@1kfWotu}8MLI7frhz*(COzW;a=XXctT%ILP} zG_`2U55zYmeX@u!H&>}9^vHL6sUG`VD*#;7PHE(nhYSDE=Z5yt97jwxs|z8t`Y^CR zhDo+Q60t2WGoS&1*0})R(3#qE^VZJ}tL5jc90VvZ{M$9`HQZCU%oAK1riU##J`syY z@vTY3<lK~0HlIcJzP>cp{8m>bO0nAa2!)});gJ#u$>N2(YKmC~&6vuQ=lAJ{g3Y9r z1$E-0ju7LNDI>rJF_YC#sP3>DZSHrxKmO{7?s)J(fiOC60<_P<z8@#i2o{rS^8K!f zLzZcbsO#z2@DC?TJJ(b!lW=m$^F!}ce+P&u2rK~eh;6n3rs!xbF2sj_+hQzy=S>7P ztGIzxm}{E9um=bsZ|j=+nKYix&_AqYJ*)bj897s<XtrdNHLNyQnT}+ncAN#{gXPX^ zt)1A#k0@T6SY_D9yp37tGrjdMCYpy!TV%8rmPi{HT_@}4vziZEmLrz;YDIJczXyNe zCUV2UX%nmAAUQ-$liMNik1TK%kPh3?i^I}&8bhh!A2%r26U>@!7ClbN<w!Sl4~kP( zy*v4sJL<+L@6)1c({`1!@Q!H3|JkQe+U{_$LZoCa?-ri;7Jl_q<;u)z?f6bheZQ4w zZ*npiXsftq>*V)WfTRjYX}0ja3xMW4;Rgw(oV}`pn`^o;?5a0=-G;x|tcGdE?x@S@ z?YiU2%TU{t;9unn{oJoj)Le8va5PG7<IZxzn7&9B`{CssC3AgxPHyb|;;79GBwl_! zZqEAL6bXy={dDi%AN@AGd|J_N1>Z6@^yl?6DTk4KuFwgEBjehh^7lk0dL~n^ToBT! zsPVe{H72kLiXq^vmVgg5W}$<p6I=(cH=>EN4NA4gHrrPL^2)KX5<flu?Vpn{w}37Y z-#DrGEU6==t9^Xgg1Oi6QJ}&NqB_i79U!f69V*9a>M5^0R@8R(pQ`_!vmIud%Ple; zXJmY66Rly-1|D*wfqy%mtfG+IA?I3HIKWlxS^V>Xo;3e68UbyaG<*7d8*T+{SbZ?} z$YNgtsC|x{iQ@k^;=jE3pDQHv_wXOK{J$suxBK}!jf^ZLwC9(v{|_$&)ILx3`y=_U N+vC?5#qj&>e*n-{B-#J~ diff --git a/katoptron/Juelich/samples_files/Xiao_44.npz b/katoptron/Juelich/samples_files/Xiao_44.npz deleted file mode 100644 index 6e078a8acf2ceeb2ecdf2d53efcc08a80f06fefd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4245 zcmZ`-2T)Vp5{?u>ilHM&lOj^2DZQzH^dg`jAVq!%9Rfmt(3K)pM2M7t(p7q|p%a>d z^iV>R9%|?j@)US8@4cCK@0~ew=FZOU+5Pt0J*%flNJIw!07wBMVa~d<>vj?O1OUK0 zasc4Z2Y}evgX~^;2)VfVz`IP<62L5-J3bFyu?-T}@zksi8%@)Ay3|Rh)%y7QPqz%p z<)EgF`5dqvt;1w8&=u|q&cb1;&``1Zh#tPg{O9UCY9BH?4At7IwC)*uP2!hS`@e@T zLtmsP<n%#44eRSz+N3a7veA}`luEEIl!-VerVqoOB^j>v-VcO2*sH|Y){m`dd=sBk zj7G*ShIu@vEWopg+rEEGVzR`IpODYR9D(DLh(<=UvGM_J^iI$j<~jHy5~x@0$p=vx zfYaN?vP=mi69y*m-C^1lSYkd}g*`5FYj67o_i=&CDR<@$B*`)pjPg!0NIz5#*{8H^ z_ZgT=c@|UZeuV@xx|*5Dh^=pql@rfP%y>&6>zGnCU>4H+OdncUd7I35LOdPvoPgYE z`v~I)lVUDVbgp}V6QSOj)^m*TzeiRu;q06xq(*j-I$_~#?MBr|H$ws@zWR*2^EtIG z_4s3jP4}Q%#FO_8-YJ-*lOE(HYoS*dgZxpm9hd?2=G+%zM<dlyR0g(ptQw!JS}rP8 zp{$GuoZ1&to$fJ`e0%B;+OlJBIr%C#J;;hL(=!-<W@g7S-r(YwQ2LReN_ecKZ6M{% zO44WZj9Inj_hn1Xyqc(pWDi-<daht8o&^hd8F!GgU}W~!*pe0owwuqn8RVLodF#@A z)2@|dtQb30+}PX{?G0m22;x!7pv*=j274avK^IV3L3j6__uOI~Y+33_BB|vDVj_cj z8hUlErtW<Ed3vVDVEi?Hy0soomLzy4BC}dVus(&9U)$!O{i#=t-W893z>;rN#A<k_ z<v{V|h8m>j!LQ`C0<<ZA$!>xQ?xPb6Sfyu3E}#%#`uq1t`eLnM31e6Xl+l{V5-F{P zJgsnQH*JMlwaW4<AAjas2i4PI*!BJk&}2=aRkV}<z$b<aKzmp@yE)lh02*d*7VSvb z`LsvCRP}S_8@(qQYgFIOHlVp3hC>p)*yu7tWgd0bUOs7!!Kj}1cUV+7C-hiQT!}PK zlu=_`u?-85r2qvvM5BLgApY25Y~Lz38ETulOaL?wY7P2$<y)TqtBQY)4Fwv%V6)5f zbjDKoW6TgQYwvL0cb8Vddrv*7;7&=BXJfq`nQ7x>=_2Y_ht_Ia^>y4k>sK6^oLSmQ z7y}O^<U@a@QIce7c|e6bGy-1&=P<c@YJ62yG3>999aoDBUu{wLFK{|~6$M1p(@l&p z$xa&)(o;$o4)LnZNqc+Yb7A+}FmgNp#O?VDob2{WNO6A6<uB3=CtNQ9QL4RrX=bSd z@rmZrq98PE!14*A9fsc5roQ|L=S|1NBX+3T=8sj11{is4RcqYcrl*E$?mv!9t70o% zk})F6laYg$s}f|bB{B<FY2L71e#;BZ4xHw2*nrsv9{GP!>#JJ+<Xs%Rs*l1Ru4iId zAwnlv?y{<`CMq1A71_Le>}3D^QFIpT7ss_FDXXZD;4699M?UnGL-snSj8Ujf_pWsH zI{E(6xaHZ1)%QhLdqdV!_ySt#Uf&N|-2*jzbG6*!QVT*#!6&1`-}AcJRxNRX1y@I! zSkw^k>Pe>mZo(<k=p(HsBDh>pqb?CyT{#q&KdaKioXCOetIVpe6SbVTOE`OHanKW9 zh3dh9Z-KXB?lP+{<#DmhW&7#~<WDhNn;FDWh^=PSto9xqniJDCtlt}jIJtEOPAWDQ zz?(Zb{ZoHy2J7dORsq-Xvv0<g>S=zU^u1r5rn^K6bzG=CC0CjvklxsIqt)G8gwM^7 zza3#uP0JY{l0XXL>Thy?L1tCnYEg4s*p|e{i~KoTpeX`kh;}uaGTEG80W<;`j|!`U zV3q0N2H{=i#dBkCo(Nz#j+ZBfghVOPsM2Ijizl-^$>$+cke4hh@C|1a8<cQg>IBEz zidiE;>2%$)zHE%9K66Pv6YMI-oJ4O0Zf`{~h+g<{#-+c|B!@;g!pr4);A&sXYaYo4 zS(_~w1WawUUu$k`U=%10N+u1?#gAxH&|V5P1@Rugn_efBVHwiZnVa9OHxB-c+21YO zlO8S~Bax>IG%?Ah$_bE^_)ts6bO8+uJ6J0HSs!hx3w-UY<lXDh?l78AJ3g67ky~Yb zv<EQF0RJ?;upjI7_32JjmoZkv$E`t^G@1(%T@?}U78z&CsQG$!n^?5u*_%?yzkQP= z)3(WoBk>ryn(C25QI2g-khk^;RF8Q%_XSjC{GrXUsU$IKk5S-@CYwG>q(iDdsNt@Q zhEUT}d2OyY$i*4-g9}AHi>EdQ+?~+JH7&O*&B1nTZWsjekYAfm3+u(?Y`Pi3j0Z$D z3ti(BBnR2wR=WVZnU4i{wy0t>fq+7v{9b$&;M8K3-oP*ipKe5OLszN}3K|dD(%JqX zDDn|X_R(zIvD7J>ZfPC!d1Ib5HP$E|6svDsQ@S5SeJ2d%GoP>s%`P^nKVA)9mdln= z98rwNM2vL?K6jZ^vcgU!heHJ2IwEX-YRdvO2b!Qi^cDm-|B7|9tpa270_q=<>w!Jq zpODcCRY)!sh|;R<99~6zxoatBH6l=dSM`bCFTJc(zh_`7N4AE~d>WBLLx5C|>wa4G zJ|$s}^aOV`e=ed+Z(X=>P&a03x4)f1lC<cb<KoKdj>vWAFkqB@pVUBgU|{aO>mY&X zotv5uVGhXRBARn6(kmNg?0i9mV*<hzi@Napzdx|DAdNe3dk^IosXO$ih_M$@vhIi6 z5EV<0eH2w5Vda(XT?WxcLmE;PtU}KG3{@r8W2bBg>3hUoJOyI3gF$qvPVV6?w}f3n zVu^0Ix%c9eHfSz@grBPM)50DSd;fMjx|x^!AaO`hgL+Ay`zb71I8mtC%M`5yEYzcD z+W6fk!uRG}lj;dIVMX-l^v)xbV)gC_W|aS?h$h$P;IM}#Wru5ta>^#~#Yz6CC*=pH znJL8oc5I%Za-rLc1v1<$>KTax20V`{TksP<;mvjRd>gl!$WhhiyudyhtOsY$5yu#T zJ~oX9+M>0{2z6Z74Z4>X5JNPH2waQWh=6J3ltj?EA(Cq7CJ;X+6;=Z<pBT$^PF;(B zhxp83eV6ZpP9#kEaM$vnXA~=p!aY7*VoQ_>)w_&w+%GtbnD;ey**>L%S{vC1vUPTS zgA!!1N&Fu5dw$z{;1F-kw^SNPGetjrpw%URt0e0ju}fe1$h^DXaH1)jeS<qLzar1- zYXL0tJ_?v<A@dSXO|<aU6m+nQB)C+x-VSz{$RnEHZA0|;dN_eM53v#nUV|$q;HyL; z>DxKd8(V0&=VQIK)3z8*=lFzWIsU?+&Ux!oorOl$?M_gT`jiKmy(@g<!|*w*yV3kU z76Jhs%9OGe6xU1l?SI=v{VHJ^8Vtx1{ZT0TqYHJ@kqG74XsxnR+<4@WQ}phypX86( zRvoKm>`H*?z{QAAtK-``#<?@vxWZ4Le!R4SIT}T^wc9xz7_LuL0X7doRgBydv!Ady z-!moVPAi6ECIn)|3#xCXph2qLwor_0B)xQr!pxd*c=g>gk)NwQc)6JHd>hlq#OQX# z9aNMDe;6ZiYis@&;lXJ9md_O7Ubi+Gam;*1O=Y(lPuo2rfBSm|xw1!}tg$Twc#ThY z^J`JtjC}g6GJ@|JeA}dqH?BeQNni8V3AAC~oaa#^g%7^JSSdE<Ex36$yM&HjRtSLz z0F@ziBQtxFI-Wx?q9=?ayv|?m2Ru2-Wt&mI;8vY(+;O0`Nmd#9dia`Z;)FDKd$?4_ zGa7Rk3d*y+!h=iC@cvR<YkDAWF4JH(&i?3v!a{zXYEOnu7!}gZR;nPZ6Wi(6VYo(p zfe)5OW;y8BG8TfT(+KNFPw%`;YACKSp#NKGbPo=?aVgkLx~Me2_~$bA$gnF#+j@BD z^6PS%UoQ$w+-;&r4rc5=$xU>4<5u+X72rqbFhNuMC_bD$Th82J>tb5W_LD)gtv>5G zHK(<^KOw-F#2__iD;hr2l}9y*ZH4TDM9*80t@wr}<1Y$mgI-4FR2E!6n6*SkYJMt0 zl1^Ei*aCL2Gf*>T{4+;~sQ)a@B+%p5W#0mw=AU*{C7N}6)u9GuSG7}bK%}sIwv-TS z*U|N|kPoOW{;K5F6eCowXvIqZ?<(K+23Rcl%*T3UV-yI9V!5SLZwB>|4Xsa5mCG2J z4c<t?3L)zGJM*wTd{5&pq9s2lTuhfOK<eF96DR5ha9;=c@rlOIkN%*4y~er3mE*|? zQs4;-KpbMWxH>N4d)-G7x0XB-V<IOPxlD|ls(d|}#bpH-x?h0Qp0HtF2?Lf}n|^QO znRU=DV|5m?Jx|NpZk(hmyw4NCPI?OA{~Vvp7E!ivL+`M?W>yiKW0EA?Kvo>*cWUM( zoKmCFgFU^ho`Dk6ykZ{t>@0?8&`22SR+s^Ajrvg6&52xBuQA4NXk7#(ON7pFID<(u z>-8TQ&&6~MeHX6xI;+^I96iMXa*T^{vG*(^%znhehX>aP*)iY$>5Ry)7_8n8ppLXt zz#k0t`dyO1%*e#qe72QH55q}P70ato_d`z4F{f+8foXn<owRJ(u#d7k&K$P9{^nJy zA%rI~?|BYg^}G)krsn&-TeCcFYj@LiZ=w#YuGA~mDT!C|`-Nu`k*Rv%9CFa(?p;pP zE~sU&@CdrjQ1U$6%T!Nt#8ZH5wZ02oao9+50_JBqQZHb$6j5<o{>4c}cSE*^k3O;W zKj2<;G&WJ$amzYdSorbq<sEy9WPO@>%8rl1nvuiG<LkR_c)N1I<sl#$XD@hjcyAoM zs1x-ik+<BS8)KRj?2KjyNo4H2sn_ZMJ@EwtEC<iHELBJ?d|$nyRB6a(CZ3X`pke9- z+#eKW*9_Hjt5eY9Rrp)3j?DjXlB)%)f9s<*pgbPjN6`;a+DM6Dna~ZnR@#8R;wd-4 zXd+SQ&w=wZZ9<*)%v)X>0`sTlf%+U<$E!X@H}{*3`|TR<vg(tj2awN-pIC+G&bPc* ze9fVch8sK4v|sj&UH@c#-$^bzBz`PylINSnv1k2m<=Zx|Ic%J+agK*QN~4UV*q*fG zjLLdn7}^L9V?0}}9((lROiI&_N%yEVp|EnA?JWN*Wq@g-4Po(KW?h&B%3rpmmq(== zIAVc>M{1Kk&i8s#Ioii@X(b-0r+I~dj`07F1O7||&Yz&*zsr9N2mV*^f3IB^VgNu; d@XtTfh5xvO>1h&Q{ri*P&+GnYrKI}1`xlkaUB3VT diff --git a/katoptron/Juelich/samples_files/Xiao_45.npz b/katoptron/Juelich/samples_files/Xiao_45.npz deleted file mode 100644 index f00ed1da3c4f3ab343b2b2bd31fa1c03ce330bc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4433 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 L<M-N5^XKV5_F=cJ diff --git a/katoptron/Juelich/samples_files/Xiao_46.npz b/katoptron/Juelich/samples_files/Xiao_46.npz deleted file mode 100644 index f9b42f0abf0fb038536695e9d7e7245ee5e12dee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4598 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 S68-&&_vd}_XY`={JNqA@k<+XI diff --git a/katoptron/Juelich/samples_files/Xiao_47.npz b/katoptron/Juelich/samples_files/Xiao_47.npz deleted file mode 100644 index 033ecdd992e4aa2e9d3ddcce73cc47e83cdaae74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4719 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 Zz<=zG^|eXK{(L0<eS7{MSLpvd{SSFXKpp@9 diff --git a/katoptron/Juelich/samples_files/Xiao_48.npz b/katoptron/Juelich/samples_files/Xiao_48.npz deleted file mode 100644 index 3e193d9e087bd7c7719995d8c2d2fd484321cba1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4955 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 diff --git a/katoptron/Juelich/samples_files/Xiao_49.npz b/katoptron/Juelich/samples_files/Xiao_49.npz deleted file mode 100644 index 0918916be6ac617f97c4e44b4bca1e49cf754a2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5130 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 LuQ81A_tSp>B`E8n diff --git a/katoptron/Juelich/samples_files/Xiao_5.npz b/katoptron/Juelich/samples_files/Xiao_5.npz deleted file mode 100644 index eed3e60620c924c1e5958248531446c026112b0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461 zcmWIWW@Zs#U|`^2Flfv5x3&mnj05s^05LZZm#1c?XOtA{<rP%Uek1-$THxe~fMWq` z=S_;56SE|5>4Ln;X$#jaUNCQ3d`Qrg8RGNfr%d7!D)&C4>Brh7o~|Ocgz2Z$Gpkuv zTwA$B7}hPY<}y5Y>axs*m!+q^i@z_N+vjM^;COiBQ9gzM6lYw0a<6hK(E1NhXA~#q z7UZN->I^P7utQRq*SX)3mRlzI%W_ZB-oOo&ZL<$gsaKz>f8M9?N8_>dpVl{PZ$49D zXP#eQE_T$_Iz-}+&bxI*Wj{8}474;ey!w!-Bdn+8^x+>o3J)eQER=MT0lJ=%NrV}9 uFao^+1`UlM3Mo+0HKKbQqK$!}p|KsvL<)ugZ&o&tBoh!80clr85Dx%qZ<@mZ diff --git a/katoptron/Juelich/samples_files/Xiao_50.npz b/katoptron/Juelich/samples_files/Xiao_50.npz deleted file mode 100644 index f35763aa71725038ca9e6d42f970f7a5b9ac173d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5305 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 diff --git a/katoptron/Juelich/samples_files/Xiao_6.npz b/katoptron/Juelich/samples_files/Xiao_6.npz deleted file mode 100644 index 417801c9203949b37de027fa7be0afd3d2f20b43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 517 zcmWIWW@Zs#U|`^2Flfv5f6?LBp9JJR0Ag++E>F!&&nPL@%PXjy{YLziw7|&|0mlN? z&YKi9CuT|B(gk^w(-y8<ykOq6_>iC}GsNe|PnpCeRPKF7(~q@FJY7X>3DZxhHaDwT zR$N=To-nUts9gE7KJ~ffg3D!><$lfcd~<L?@78$JXrEPzv)C8{P@JOOoxJuW&<PHV z5T_I;<`(3nQtT8iH;7}H*1fL(A@gHjn{^Ds#ijrFw#)o`^4`;{Xh-|8@T7k`{wIg` zG)Fp}Z8!bDNJh=H#%9OQ>5C8F{(1J#LH1x-zs48GJa*Xh{6GEpNL5&3KKtJExbyeK ztt~=!Jl(WWW4YxV-&MAnR`)L}ru=M*TP=N(Fa6#pzm2Q?+CE>rdiaT@jpDPrZLipY zK4xSRVa6T&K<|S=LnDYniVSp(=z#^%#=y|f*bQVN1zmtQD;r3X2?&dTbS*G+85jU+ Ct-izn diff --git a/katoptron/Juelich/samples_files/Xiao_7.npz b/katoptron/Juelich/samples_files/Xiao_7.npz deleted file mode 100644 index 9b1946fea901b32ada4d1794ca36a0e5003c89ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559 zcmWIWW@Zs#U|`^2Flfv57tvdDC>zN80mR%uT%MYlo>5Y)mse0Z`;GW3X@Qd`0*(c& zoi{0JPRx?Lr3>;Vr!8E!c)`4B@gYG|W{A&^pE8L{sNDOErXOpUc)E(%5~iP0ZOg1? zS#fRUdcv%y9{bm1yRR?bi;^>^c;nW&XB)iG{oea*-;A3+CUZs4SC$8UG~tnA2taXD z#HXvquYhhTV1&4-I5D>%CzWD1ak)WU#iaM`bgZFc-$lNycDG#TtvSbcy~Im={aWwR zADoNcD#<2%GT5j4`P}uLtMAHAGrjk7m+qCDiNF5xE%%IEDN%FxZ_`?>g_?ZRm&pI0 z`$zr6!>6|%{5Fr8EAz^Ai+{;E@6sLbl5TFlV{~Dm{<n>-=N`GR&r`BHmdh^upr+)j zLFJ6f?+bo~>h9TBH$(oVg68HeuiWb!4u3ziwS7jtO45gX`TM7i{#Q7~2n-TNCJ|=b w5d{n%FlcB5QAp8-t`R*nA=(%i8XBhnnMh$9;LXYgl4JtHA|SmS82k(j03DIllK=n! diff --git a/katoptron/Juelich/samples_files/Xiao_8.npz b/katoptron/Juelich/samples_files/Xiao_8.npz deleted file mode 100644 index 6f4c1c3ae433bf11eaa6563bde78415e29229831..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 575 zcmWIWW@Zs#U|`^2Flfv5Z%SzjF9Grx7#SG2fmC^FW_m_Rv0h$5<?J`&ucQS|o(MP= zuy)?0s5vo9@|G^ho1C_A-QorFrp1Q@O_?D+KYq$2E}?SoGn#&^UE=8~VoR8QO0}g~ z&9dU!%JqbKopG?g=lp<~Pa6EXtHkst+_z(Fu3Pf;RZrm^ANKyoF_UlUPffg_U0fwU zWrdiqFEc{`isNP#H_LtmI;sKcxZ=dzf}B)}9mnMcaUPRi`qS@z@Ao*#<T!lM%x8Bl zo?at<KZRZ2q%J7#_+Gx1EbVh;?_2rFc9(es?pnG=_3f((vF9T5ei^emz3*u_efS5D z!h;D63niUomdS;!PMP=WS%F32r+LSM{rGxcZC5|?eVJ8^%j4C*@`LZ#Yaf01vCW|K zRB0oh&U}}M<T-C-x2YYwme1*5?4cznQZFL?qTtBZKiv0^xU}y)y<SBAoJY&&i&qan zNqm;-^c55`j7%cTxFZe}hak|<2qKZ95nUsCpn{ZxKttnPAc+*j0p6@^APFWQECSNo Jfw92A003)N&prSE diff --git a/katoptron/Juelich/samples_files/Xiao_9.npz b/katoptron/Juelich/samples_files/Xiao_9.npz deleted file mode 100644 index 959ddd04c781034755bd4a1fbc88d29835429067..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 611 zcmWIWW@Zs#U|`^2Flfv5H>=uyz6QvXU}Rw62GZrJnduoN#d>)Km9yW7zmgU>c_QFg zz}k6}qUOXb$y>T0Z*tngb&D6wn-(7uG-ZbP{P-!8xP;2R&uIFwc8RB}h%I6IDb+U3 zYL*q(R<0+^>tdbe*1xehC3E5BgO#!$jSdOR))-B*{hs#X;DX!ne(N8fS+6|n+`ZsS zv7(oI9naqrdiwWwxgr}cLjZ~+UxtVM;srWz1JseliMa(isT4bs%MId8rggz>r*kUB z+$~Gw=6^i9;P^quA2ClBo;S+mOH=sew}jb8?pQhlV>=7SS%F6idvbKWFW(8^(0%<n z!0@ft-9Pf45`TVAbljgUf7J5L#(k0@=|V3){QDQ?JO6MWpOft5eXr*Dm%f<uZ+X?> zpnCR|(LDU>?W&e9RDAc9C1fhi>0c+O#&68OEdKkkX_fM6$1PT<#;miN^8Vom-@Dcm z<5gLm>^a*{AO5j4@0L&T_FYyHx?;ID;!mF}Fs}{YbN*BaPhC&k%YTy7gJgiA#>gbX yj5~6H@e2kGjUWmss?jx~2RK9<14BdOQXms4_yfFI*+7y^Kv)E%Zv$h9fdK%8Xyp?C diff --git a/katoptron/Juelich/slurm/blake.slurm.sh b/katoptron/Juelich/slurm/blake.slurm.sh deleted file mode 100644 index e5e54caf..00000000 --- a/katoptron/Juelich/slurm/blake.slurm.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=Mirror_AB -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/Mirror_AB.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export n_nodes=1 - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,1t -export KMP_AFFINITY=compact - -export ensemble_size=1 - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} -export N_MPI_PER_SOCKET=1 - -n_MPI=$(( 2*n_nodes )) -base_dir=$(pwd) -msh_file=${base_dir}/katoptron/Juelich/mesh/fused_mirror_assembly_mm.msh -workspace_dir=${base_dir}/workspace/katoptron_Juelich_tests_M1_assembly_fused -msh_part_file=${workspace_dir}/fused_mirror_assembly_mm_part_${n_MPI}.msh - -if [ ! -d ${workspace_dir} ] -then - mkdir ${workspace_dir} -fi - -if [ ! -e ${msh_part_file} ] -then - gmsh -3 ${msh_file} -o ${msh_part_file} -part ${n_MPI} -fi - -mpirun -npersocket ${N_MPI_PER_SOCKET} python run.py -k ${OMP_NUM_THREADS} katoptron/Juelich/tests/M1_assembly_fused.py diff --git a/katoptron/Juelich/slurm/blake_ER_NER.slurm.sh b/katoptron/Juelich/slurm/blake_ER_NER.slurm.sh deleted file mode 100644 index 6ac1bc52..00000000 --- a/katoptron/Juelich/slurm/blake_ER_NER.slurm.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=Mirror -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/Mirror.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export n_nodes=1 - -function setEnsembleReduction(){ - remove2env INCLUDE "${Trilinos_DIR}/include" - remove2env LIB "${Trilinos_DIR}/lib" - remove2env PYTHONPATH "${Trilinos_DIR}/lib/python2.7/site-packages" - remove2env LD_LIBRARY_PATH "${Trilinos_DIR}/lib/python2.7/site-packages/PyTrilinos" - remove2env LD_LIBRARY_PATH "${Trilinos_DIR}/lib/python2.7/site-packages" - remove2env LD_LIBRARY_PATH "${Trilinos_DIR}/lib" - if [ “$1†== “false†]; then - export Trilinos_DIR=$Trilinos_DIR_NO_ER - export Waves_DIR=$Waves_DIR_NO_ER - export ensemble_reduction="false" - else - export Trilinos_DIR=$Trilinos_DIR_ER - export Waves_DIR=$Waves_DIR_ER - export ensemble_reduction="true" - fi - add2env INCLUDE "${Trilinos_DIR}/include" end - add2env LIB "${Trilinos_DIR}/lib" end - add2env PYTHONPATH "${Trilinos_DIR}/lib/python2.7/site-packages" front - add2env LD_LIBRARY_PATH "${Trilinos_DIR}/lib/python2.7/site-packages/PyTrilinos" end - add2env LD_LIBRARY_PATH "${Trilinos_DIR}/lib/python2.7/site-packages" end - add2env LD_LIBRARY_PATH "${Trilinos_DIR}/lib" end - cd $Waves_DIR -} - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,1t -export KMP_AFFINITY=compact - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} -export N_MPI_PER_SOCKET=1 - -ensemble_sizes=( 1 8 16 32) -run_NER=true -run_ER=true - -setEnsembleReduction false - -n_MPI=$(( 2*n_nodes )) -base_dir=$(pwd) -msh_file=${base_dir}/katoptron/Juelich/mesh/fused_mirror_assembly_mm.msh -workspace_NER_dir=${base_dir}/workspace/katoptron_Juelich_tests_M1_assembly_fused_MC_k -msh_part_NER_file=${workspace_NER_dir}/fused_mirror_assembly_mm_part_${n_MPI}.msh - -if [ ! -d ${workspace_NER_dir} ] -then - mkdir ${workspace_NER_dir} -fi - -if [ ! -e ${msh_part_NER_file} ] -then - gmsh -3 ${msh_file} -o ${msh_part_NER_file} -part ${n_MPI} -fi - -if [ "$run_NER" = true ]; then - for s in "${ensemble_sizes[@]}" - do - export ensemble_size=$s - mpirun -npersocket ${N_MPI_PER_SOCKET} python run.py -k ${OMP_NUM_THREADS} katoptron/Juelich/tests/M1_assembly_fused_MC_k.py - done -fi - -ensemble_sizes=( 8 16 32) - -setEnsembleReduction true - -base_dir=$(pwd) -workspace_ER_dir=${base_dir}/workspace/katoptron_Juelich_tests_M1_assembly_fused_MC_k -msh_part_ER_file=${workspace_ER_dir}/fused_mirror_assembly_mm_part_${n_MPI}.msh - -if [ ! -d ${workspace_ER_dir} ] -then - mkdir ${workspace_ER_dir} -fi - -cp ${msh_part_NER_file} ${msh_part_ER_file} - -if [ "$run_ER" = true ]; then - for s in "${ensemble_sizes[@]}" - do - export ensemble_size=$s - mpirun -npersocket ${N_MPI_PER_SOCKET} python run.py -k ${OMP_NUM_THREADS} katoptron/Juelich/tests/M1_assembly_fused_MC_k.py - done -fi \ No newline at end of file diff --git a/katoptron/Juelich/slurm/blake_all.slurm.sh b/katoptron/Juelich/slurm/blake_all.slurm.sh deleted file mode 100644 index fa0a52a9..00000000 --- a/katoptron/Juelich/slurm/blake_all.slurm.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=Mirror_all -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 2 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/Mirror_all.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export n_nodes=2 - -ensemble_sizes=( 1 8 16 32) - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,1t -export KMP_AFFINITY=compact - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} -export N_MPI_PER_SOCKET=1 - -n_MPI=$(( 2*n_nodes )) -base_dir=$(pwd) -msh_file=${base_dir}/katoptron/Juelich/mesh/fused_mirror_assembly_all_mm.msh -workspace_dir=${base_dir}/workspace/katoptron_Juelich_tests_M1_assembly_fused_all -msh_part_file=${workspace_dir}/fused_mirror_assembly_all_mm_part_${n_MPI}.msh - -if [ ! -d ${workspace_dir} ] -then - mkdir ${workspace_dir} -fi - -if [ ! -e ${msh_part_file} ] -then - gmsh -3 ${msh_file} -o ${msh_part_file} -part ${n_MPI} -fi - -for s in "${ensemble_sizes[@]}" -do - export ensemble_size=$s - mpirun -npersocket ${N_MPI_PER_SOCKET} python run.py -k ${OMP_NUM_THREADS} katoptron/Juelich/tests/M1_assembly_fused_all.py -done diff --git a/katoptron/Juelich/slurm/blake_order.slurm.sh b/katoptron/Juelich/slurm/blake_order.slurm.sh deleted file mode 100644 index fecd4d79..00000000 --- a/katoptron/Juelich/slurm/blake_order.slurm.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=M_order -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/M_order.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export n_nodes=1 - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,1t -export KMP_AFFINITY=compact - -export ensemble_size=1 - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} -export N_MPI_PER_SOCKET=1 - -n_MPI=$(( 2*n_nodes )) -base_dir=$(pwd) -msh_file=${base_dir}/katoptron/Juelich/mesh/fused_mirror_assembly_mm.msh -workspace_dir=${base_dir}/workspace/katoptron_Juelich_tests_M1_assembly_fused_MC_k_order -msh_part_file=${workspace_dir}/fused_mirror_assembly_mm_part_${n_MPI}.msh - -if [ ! -d ${workspace_dir} ] -then - mkdir ${workspace_dir} -fi - -if [ ! -e ${msh_part_file} ] -then - gmsh -3 ${msh_file} -o ${msh_part_file} -part ${n_MPI} -fi - -mpirun -npersocket ${N_MPI_PER_SOCKET} python run.py -k ${OMP_NUM_THREADS} katoptron/Juelich/tests/M1_assembly_fused_MC_k_order.py diff --git a/katoptron/Juelich/slurm/blake_preload.slurm.sh b/katoptron/Juelich/slurm/blake_preload.slurm.sh deleted file mode 100644 index e7952bb3..00000000 --- a/katoptron/Juelich/slurm/blake_preload.slurm.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=Mirror_AB -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/Mirror_AB.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export n_nodes=1 - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_PLACE_THREADS=24c,1t -export KMP_AFFINITY=compact - -export ensemble_size=1 - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} -export N_MPI_PER_SOCKET=1 - -n_MPI=$(( 2*n_nodes )) -base_dir=$(pwd) -msh_file=${base_dir}/katoptron/Juelich/mesh/fused_mirror_assembly_mm.msh -workspace_dir=${base_dir}/workspace/katoptron_Juelich_tests_M1_assembly_fused_preload -msh_part_file=${workspace_dir}/fused_mirror_assembly_mm_part_${n_MPI}.msh - -if [ ! -d ${workspace_dir} ] -then - mkdir ${workspace_dir} -fi - -if [ ! -e ${msh_part_file} ] -then - gmsh -3 ${msh_file} -o ${msh_part_file} -part ${n_MPI} -fi - -mpirun -npersocket ${N_MPI_PER_SOCKET} python run.py -k ${OMP_NUM_THREADS} katoptron/Juelich/tests/M1_assembly_fused_preload.py diff --git a/katoptron/Juelich/smoothers/AMG_BGS_gs_gs.xml b/katoptron/Juelich/smoothers/AMG_BGS_gs_gs.xml deleted file mode 100644 index 4a44425b..00000000 --- a/katoptron/Juelich/smoothers/AMG_BGS_gs_gs.xml +++ /dev/null @@ -1,226 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - <!-- BLOCK 1 --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - </ParameterList> - - <ParameterList name="myDropFact1"> - <Parameter name="factory" type="string" value="CoalesceDropFactory"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myAggFact2"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3,1 }"/> - <Parameter name="Strided block id" type="int" value="0"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - </ParameterList> - - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 --> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3,1 }"/> - <Parameter name="Strided block id" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myAggFact2"/> <!-- use old aggregates! --> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - </ParameterList> - - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact2"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - <!-- <Parameter name="Graph" type="string" value="myDropFact1"/> --> - </ParameterList> - - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myAggFact2"/><!-- reuse aggs --> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - </ParameterList> - - - <!-- BLOCK SMOOTHERS --> - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="20"/> - <Parameter name="relaxation: damping factor" type="double" value="0.97"/> - </ParameterList> - </ParameterList> - - <ParameterList name="mySmooFact2"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="20"/> - <Parameter name="relaxation: damping factor" type="double" value="1.04"/> - </ParameterList> - </ParameterList> - - <ParameterList name="mySCHWARZ1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="SCHWARZ"/> - <ParameterList name="ParameterList"> - <Parameter name="schwarz: overlap level" type="int" value="1"/> - <Parameter name="schwarz: combine mode" type="string" value="Zero"/> - <Parameter name="subdomain solver name" type="string" value="RELAXATION"/> - <ParameterList name="subdomain solver parameters"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="1"/> - <Parameter name="relaxation: damping factor" type="double" value="0.79"/> - </ParameterList> - </ParameterList> - </ParameterList> - - <ParameterList name="mySCHWARZ2"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="SCHWARZ"/> - <ParameterList name="ParameterList"> - <Parameter name="schwarz: overlap level" type="int" value="1"/> - <Parameter name="schwarz: combine mode" type="string" value="Zero"/> - <Parameter name="subdomain solver name" type="string" value="RELAXATION"/> - <ParameterList name="subdomain solver parameters"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="1"/> - <Parameter name="relaxation: damping factor" type="double" value="0.79"/> - </ParameterList> - </ParameterList> - </ParameterList> - - <!-- Use Block GS: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="BlockedGaussSeidelSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="1."/> - <Parameter name="Backward mode" type="bool" value="true"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Smoother" type="string" value="mySmooFact2"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="3"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockDirectSolver"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> diff --git a/katoptron/Juelich/smoothers/AMG_BGS_gs_gs_old.xml b/katoptron/Juelich/smoothers/AMG_BGS_gs_gs_old.xml deleted file mode 100644 index 170ffb5f..00000000 --- a/katoptron/Juelich/smoothers/AMG_BGS_gs_gs_old.xml +++ /dev/null @@ -1,294 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - <!-- BLOCK 1 --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - </ParameterList> - - <ParameterList name="myDropFact1"> - <Parameter name="factory" type="string" value="CoalesceDropFactory"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myAggFact2"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3,1 }"/> - <Parameter name="Strided block id" type="int" value="0"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - <Parameter name="multigrid algorithm" type="string" value="unsmoothed"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - </ParameterList> - - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 --> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3,1 }"/> - <Parameter name="Strided block id" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myAggFact2"/> <!-- use old aggregates! --> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - <Parameter name="multigrid algorithm" type="string" value="unsmoothed"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - </ParameterList> - - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - <!-- <Parameter name="Graph" type="string" value="myDropFact1"/> --> - </ParameterList> - - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myAggFact2"/><!-- reuse aggs --> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - </ParameterList> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="10"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <ParameterList name="mySmooFact2"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="10"/> - <Parameter name="relaxation: damping factor" type="double" value="0.8"/> - </ParameterList> - </ParameterList> - - <ParameterList name="mySmooFact3"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="BASKER"/> - </ParameterList> - - <ParameterList name="mySmooFact4"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="100"/> - <Parameter name="relaxation: damping factor" type="double" value="1."/> - </ParameterList> - </ParameterList> - - <ParameterList name="mySmooFact5"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="100"/> - <Parameter name="relaxation: damping factor" type="double" value="1."/> - </ParameterList> - </ParameterList> - - <!-- Use Block GS: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="BlockedGaussSeidelSmoother"/> - <Parameter name="Sweeps" type="int" value="3"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <Parameter name="Backward mode" type="bool" value="true"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Smoother" type="string" value="mySmooFact2"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockSmootherDirect"> - <Parameter name="factory" type="string" value="BlockedGaussSeidelSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="1."/> - <Parameter name="Backward mode" type="bool" value="true"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact4"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Smoother" type="string" value="mySmooFact5"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - <!-- ======================= REPARTITIONING ======================= --> - <!-- amalgamation of coarse level matrix --> - <ParameterList name="myRebAmalgFact"> - <Parameter name="factory" type="string" value="AmalgamationFactory"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - </ParameterList> - - <ParameterList name="myRepartitionHeuristicFact"> - <Parameter name="factory" type="string" value="RepartitionHeuristicFactory"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <Parameter name="repartition: min rows per proc" type="int" value="2000"/> - <Parameter name="repartition: max imbalance" type="double" value="1.1"/> - <Parameter name="repartition: start level" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myZoltanInterface"> - <Parameter name="factory" type="string" value="ZoltanInterface"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <Parameter name="number of partitions" type="string" value="myRepartitionHeuristicFact"/> - <!--<Parameter name="Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - </ParameterList> - - <ParameterList name="myRepartitionFact"> - <Parameter name="factory" type="string" value="RepartitionFactory"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <Parameter name="number of partitions" type="string" value="myRepartitionHeuristicFact"/> - <Parameter name="Partition" type="string" value="myZoltanInterface"/> - <Parameter name="repartition: remap parts" type="bool" value="false"/> - </ParameterList> - - <ParameterList name="myRebalanceProlongatorFact"> - <Parameter name="factory" type="string" value="RebalanceTransferFactory"/> - <Parameter name="type" type="string" value="Interpolation"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="Nullspace" type="string" value="myBlockedPFact"/> - </ParameterList> - - <ParameterList name="myRebalanceRestrictionFact"> - <Parameter name="factory" type="string" value="RebalanceTransferFactory"/> - <Parameter name="type" type="string" value="Restriction"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - </ParameterList> - - <ParameterList name="myRebalanceAFact"> - <Parameter name="factory" type="string" value="RebalanceAcFactory"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="4"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockDirectSolver"/> - <Parameter name="P" type="string" value="myRebalanceProlongatorFact"/> - <Parameter name="R" type="string" value="myRebalanceRestrictionFact"/> - <Parameter name="A" type="string" value="myRebalanceAFact"/> - <Parameter name="Importer" type="string" value="myRepartitionFact"/> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> diff --git a/katoptron/Juelich/smoothers/AMG_BGS_gs_gs_rep.xml b/katoptron/Juelich/smoothers/AMG_BGS_gs_gs_rep.xml deleted file mode 100644 index ea2db74e..00000000 --- a/katoptron/Juelich/smoothers/AMG_BGS_gs_gs_rep.xml +++ /dev/null @@ -1,380 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - <!-- BLOCK 1 --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - </ParameterList> - - <ParameterList name="myDropFact1"> - <Parameter name="factory" type="string" value="CoalesceDropFactory"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myAggFact2"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3,1 }"/> - <Parameter name="Strided block id" type="int" value="0"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - <Parameter name="multigrid algorithm" type="string" value="unsmoothed"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - </ParameterList> - - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 --> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3,1 }"/> - <Parameter name="Strided block id" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myAggFact2"/> <!-- use old aggregates! --> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - <Parameter name="multigrid algorithm" type="string" value="unsmoothed"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - </ParameterList> - - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - <!-- <Parameter name="Graph" type="string" value="myDropFact1"/> --> - </ParameterList> - - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myAggFact2"/><!-- reuse aggs --> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <!-- we need the factories from the first group --> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/> - </ParameterList> - </ParameterList> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="10"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <ParameterList name="mySmooFact2"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="10"/> - <Parameter name="relaxation: damping factor" type="double" value="0.8"/> - </ParameterList> - </ParameterList> - - <ParameterList name="mySmooFact3"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="BASKER"/> - </ParameterList> - - <ParameterList name="mySmooFact4"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="100"/> - <Parameter name="relaxation: damping factor" type="double" value="1."/> - </ParameterList> - </ParameterList> - - <ParameterList name="mySmooFact5"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="100"/> - <Parameter name="relaxation: damping factor" type="double" value="1."/> - </ParameterList> - </ParameterList> - - <!-- Use Block GS: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="BlockedGaussSeidelSmoother"/> - <Parameter name="Sweeps" type="int" value="3"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <Parameter name="Backward mode" type="bool" value="true"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Smoother" type="string" value="mySmooFact2"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockSmootherDirect"> - <Parameter name="factory" type="string" value="BlockedGaussSeidelSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="1."/> - <Parameter name="Backward mode" type="bool" value="true"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact4"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Smoother" type="string" value="mySmooFact5"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - <!-- ======================= REPARTITIONING ======================= --> - <!-- amalgamation of coarse level matrix --> - - <ParameterList name="myRepartitionHeuristicFactory"> - <Parameter name="factory" type="string" value="RepartitionHeuristicFactory"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <Parameter name="repartition: start level" type="int" value="2"/> - <Parameter name="repartition: min rows per proc" type="int" value="256"/> - <Parameter name="repartition: nonzeroImbalance" type="double" value="1.2"/> - </ParameterList> - - <ParameterList name="myRebSubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - </ParameterList> - - <ParameterList name="myRebSubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myInputCoordsFact"> - <Parameter name="factory" type="string" value="FineLevelInputDataFactory"/> - <Parameter name="Variable" type="string" value="CoOrdinates"/> - <Parameter name="Variable type" type="string" value="MultiVector"/> - <Parameter name="Fine level factory" type="string" value="NoFactory"/> - <!--<Parameter name="Coarse level factory" type="string" value="myTransferCoordinatesFact"/>--> - <!--<Parameter name="Coarse level factory" type="string" value="NoFactory"/> TO BE DEFINED LATER --> - </ParameterList> - - <ParameterList name="myZoltanInterface1"> - <Parameter name="factory" type="string" value="ZoltanInterface"/> - <Parameter name="A" type="string" value="myRebSubBlockAFactory1"/> - <Parameter name="number of partitions" type="string" value="myRepartitionHeuristicFactory"/> - </ParameterList> - - <ParameterList name="myZoltanInterface2"> - <Parameter name="factory" type="string" value="ZoltanInterface"/> - <Parameter name="A" type="string" value="myRebSubBlockAFactory2"/> - <Parameter name="number of partitions" type="string" value="myRepartitionHeuristicFactory"/> - </ParameterList> - - <ParameterList name="myRepartitionFactory1"> - <Parameter name="factory" type="string" value="RepartitionFactory"/> - <Parameter name="A" type="string" value="myRebSubBlockAFactory1"/> - <Parameter name="Partition" type="string" value="myZoltanInterface1"/> - <Parameter name="number of partitions" type="string" value="myRepartitionHeuristicFactory"/> - <Parameter name="repartition: print partition distribution" type="bool" value="true"/> - <Parameter name="repartition: remap parts" type="bool" value="true"/> - </ParameterList> - - <ParameterList name="myRepartitionFactory2"> - <Parameter name="factory" type="string" value="RepartitionFactory"/> - <Parameter name="A" type="string" value="myRebSubBlockAFactory2"/> - <Parameter name="Partition" type="string" value="myZoltanInterface2"/> - <Parameter name="number of partitions" type="string" value="myRepartitionHeuristicFactory"/> - <Parameter name="repartition: print partition distribution" type="bool" value="true"/> - <Parameter name="repartition: remap parts" type="bool" value="false"/> - </ParameterList> - - <ParameterList name="myRebFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> <!-- non-rebalanced A00! --> - <Parameter name="Importer" type="string" value="myRepartitionFactory1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="number of partitions" type="string" value="myRepartitionHeuristicFactory"/> - <Parameter name="Coordinates" type="string" value="myInputCoordsFact"/> - </ParameterList> - - <ParameterList name="myRebSecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> <!-- non-rebalanced A11! --> - <Parameter name="Importer" type="string" value="myRepartitionFactory2"/> - <Parameter name="number of partitions" type="string" value="myRepartitionHeuristicFactory"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="Coordinates" type="string" value="myInputCoordsFact"/> - </ParameterList> - - <ParameterList name="myRebBlockedPFact"> - <Parameter name="factory" type="string" value="RebalanceBlockInterpolationFactory"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myRebFirstGroup"/> - </ParameterList> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="myRebSecondGroup"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myInputCoordsFactDeps"> - <Parameter name="dependency for" type="string" value="myInputCoordsFact"/> - <Parameter name="Coarse level factory" type="string" value="myTransferCoordinatesFact"/> - </ParameterList> - - <ParameterList name="myRebBlockedRFact"> - <Parameter name="factory" type="string" value="RebalanceBlockRestrictionFactory"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="repartition: use subcommunicators" type="bool" value="false"/> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myRebFirstGroup"/> - </ParameterList> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="myRebSecondGroup"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myRebBlockedAcFact"> - <Parameter name="factory" type="string" value="RebalanceBlockAcFactory"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <Parameter name="repartition: use subcommunicators" type="bool" value="false"/> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myRebFirstGroup"/> - </ParameterList> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="myRebSecondGroup"/> - </ParameterList> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="4"/> - <Parameter name="coarse: max size" type="int" value="2500"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockDirectSolver"/> - <Parameter name="P" type="string" value="myRebBlockedPFact"/> - <Parameter name="R" type="string" value="myRebBlockedRFact"/> - <Parameter name="A" type="string" value="myRebBlockedAcFact"/> - <Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> diff --git a/katoptron/Juelich/smoothers/heat_no_contact.xml b/katoptron/Juelich/smoothers/heat_no_contact.xml deleted file mode 100644 index 7b114878..00000000 --- a/katoptron/Juelich/smoothers/heat_no_contact.xml +++ /dev/null @@ -1,19 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - <Parameter name="max levels" type="int" value="5"/> - <Parameter name="smoother: type" type="string" value="RELAXATION"/> - <ParameterList name="smoother: params"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="5"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - <Parameter name="coarse: type" type="string" value="Klu"/> - <Parameter name="verbosity" type="string" value="extreme"/> - <Parameter name="multigrid algorithm" type="string" value="unsmoothed"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - <Parameter name="number of equations" type="int" value="4"/> -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/Juelich/smoothers/heat_no_contact_mtgs.xml b/katoptron/Juelich/smoothers/heat_no_contact_mtgs.xml deleted file mode 100644 index 6685c2d5..00000000 --- a/katoptron/Juelich/smoothers/heat_no_contact_mtgs.xml +++ /dev/null @@ -1,20 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - <Parameter name="max levels" type="int" value="5"/> - <Parameter name="smoother: type" type="string" value="RELAXATION"/> - <ParameterList name="smoother: params"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="15"/> - <Parameter name="relaxation: damping factor" type="double" value="1.1724"/> - <Parameter name="relaxation: backward mode" type="bool" value="true"/> - </ParameterList> - <Parameter name="coarse: type" type="string" value="Klu"/> - <Parameter name="verbosity" type="string" value="extreme"/> - <Parameter name="multigrid algorithm" type="string" value="unsmoothed"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - <Parameter name="number of equations" type="int" value="4"/> -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/Juelich/smoothers/mySIM1.xml b/katoptron/Juelich/smoothers/mySIM1.xml deleted file mode 100644 index 1c217e5c..00000000 --- a/katoptron/Juelich/smoothers/mySIM1.xml +++ /dev/null @@ -1,190 +0,0 @@ -<ParameterList name="MueLu"> - - <!-- Configuration of the Xpetra operator (fine level) --> - <ParameterList name="Matrix"> - <Parameter name="number of equations" type="int" value="1"/> <!-- Number of PDE equations at each grid node.--> - </ParameterList> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - - <!-- sub block factories --> - <!-- BLOCK 1 --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - </ParameterList> - - <ParameterList name="myDropFact1"> - <Parameter name="factory" type="string" value="CoalesceDropFactory"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3,1 }"/> - <Parameter name="Strided block id" type="int" value="0"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 --> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3,1 }"/> - <Parameter name="Strided block id" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use old aggregates! --> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - <Parameter name="Graph" type="string" value="myDropFact1"/> - </ParameterList> - - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/><!-- reuse aggs --> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - </ParameterList> - - <!-- BLOCK SMOOTHERS --> - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="20"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <ParameterList name="mySmooFact2"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="10"/> - <Parameter name="relaxation: damping factor" type="double" value="0.8"/> - </ParameterList> - </ParameterList> - - - <!-- Use Block GS: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="BlockedGaussSeidelSmoother"/> - <Parameter name="Sweeps" type="int" value="50"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Smoother" type="string" value="mySmooFact2"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="3"/> - <Parameter name="coarse: max size" type="int" value="10"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - </ParameterList> - - </ParameterList> -</ParameterList> diff --git a/katoptron/Juelich/smoothers/mySIM1_old.xml b/katoptron/Juelich/smoothers/mySIM1_old.xml deleted file mode 100644 index dbfa1ac4..00000000 --- a/katoptron/Juelich/smoothers/mySIM1_old.xml +++ /dev/null @@ -1,190 +0,0 @@ -<ParameterList name="MueLu"> - - <!-- Configuration of the Xpetra operator (fine level) --> - <ParameterList name="Matrix"> - <Parameter name="number of equations" type="int" value="1"/> <!-- Number of PDE equations at each grid node.--> - </ParameterList> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - - <!-- sub block factories --> - <!-- BLOCK 1 --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - </ParameterList> - - <ParameterList name="myDropFact1"> - <Parameter name="factory" type="string" value="CoalesceDropFactory"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3,1 }"/> - <Parameter name="Strided block id" type="int" value="0"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 --> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3,1 }"/> - <Parameter name="Strided block id" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use old aggregates! --> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - <Parameter name="Graph" type="string" value="myDropFact1"/> - </ParameterList> - - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/><!-- reuse aggs --> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - </ParameterList> - - <!-- BLOCK SMOOTHERS --> - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="20"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <ParameterList name="mySmooFact2"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="10"/> - <Parameter name="relaxation: damping factor" type="double" value="0.8"/> - </ParameterList> - </ParameterList> - - - <!-- Use Block GS: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="BlockedGaussSeidelSmoother"/> - <Parameter name="Sweeps" type="int" value="50"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Smoother" type="string" value="mySmooFact2"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="3"/> - <Parameter name="coarse: max size" type="int" value="10"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - </ParameterList> - - </ParameterList> -</ParameterList> diff --git a/katoptron/Juelich/tests/M1_assembly_contact.py b/katoptron/Juelich/tests/M1_assembly_contact.py deleted file mode 100644 index c5ac3c9e..00000000 --- a/katoptron/Juelich/tests/M1_assembly_contact.py +++ /dev/null @@ -1,241 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -import numpy as np -import shlex -import subprocess -import os -import tarfile -import glob - -from katoptron.Juelich.UQ.halton import * -from katoptron.Juelich.UQ.copulas import * - - -def evaluate_one_ensemble(ensemble_size, - msh, - comm, - file_dir, - randomVariable_1, - randomVariable_2, - randomVariable_3, - scale_u, - scale_T, - option, - baking=False): - - from fwk.wutils import parseargs - args = parseargs() - - from PyTrilinos import Teuchos - import numpy as np - - small_disk_footprint = False - use_block = True - - comm, rank, siz = m.utilities.import_MPI() - - solverList = Teuchos.ParameterList() - solverList['type'] = "BlockGmres" - - solverList['Maximum Iterations'] = 500 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = True - - solverList['Print Teuchos timers'] = True - solverList['Write txt files'] = True - if small_disk_footprint: - solverList['Write vtk files'] = False - - solverList['convert MueLu xml file'] = True - solverList["use xml file"] = True - - solverList['Ensemble Convergence Tolerance'] = 10**(-8) - solverList[ - "MueLu xml file name"] = file_dir + '/../smoothers/heat_no_contact_mtgs.xml' - - solverList["Scaled Block 0"] = True - pbl = m.Problem(msh, comm) - - -def main(): - comm, rank, size = m.utilities.import_MPI() - - from PyTrilinos import Teuchos - import numpy as np - - geo_name = 'contact_mirror_assembly_mm.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir+'/../mesh', work_dir, comm, rank, size) - - solverList = Teuchos.ParameterList() - solverList['type'] = "BlockGmres" - - solverList['Maximum Iterations'] = 500 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = True - - solverList['Print Teuchos timers'] = True - solverList['Write txt files'] = True - - solverList['convert MueLu xml file'] = True - solverList["use xml file"] = True - - solverList['Ensemble Convergence Tolerance'] = 10**(-8) - solverList[ - "MueLu xml file name"] = file_dir + '/../smoothers/heat_no_contact_mtgs.xml' - - solverList["Scaled Block 0"] = True - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - pbl = m.Problem(msh, comm) - - ensemble_size = 1 - - scale_u = 1000. - scale_T = 1. - - scale_E = 1. / scale_u**2 - scale_k = (scale_T / scale_u) - scale_hsource = 1. / scale_u**3 - scale_hflux = 1. / scale_u**2 - scale_d = scale_T - - # 379 000 MPa = 379 GPa = 379E9 Pa - E_rhodium = 379E9 * np.ones(ensemble_size) * scale_E - nu_rhodium = 0.26 * np.ones(ensemble_size) - # 0.150 kW/(m K) = 150 W/(m K) - k_rhodium = 150 * scale_k - d_rhodium = 0.781E-05 * scale_d - - E_WCu = 280E9 * np.ones(ensemble_size) * scale_E - nu_WCu = 0.298 * np.ones(ensemble_size) - k_WCu = 180 * scale_k - d_WCu = 0.88E-05 * scale_d - - E_SS = 200E9 * np.ones(ensemble_size) * scale_E - nu_SS = 0.3 * np.ones(ensemble_size) - k_SS = 15.3 * scale_k - d_SS = 1.57E-05 * scale_d - - E_CuCrZr = 118E9 * np.ones(ensemble_size) * scale_E - nu_CuCrZr = 0.33 * np.ones(ensemble_size) - k_CuCrZr = 345 * np.ones(ensemble_size) * scale_k - d_CuCrZr = 1.8E-05 * np.ones(ensemble_size) * scale_d - - E_AlN = 320E9 * np.ones(ensemble_size) * scale_E - nu_AlN = 0.24 * np.ones(ensemble_size) - k_AlN = 180 * np.ones(ensemble_size) * scale_k - d_AlN = 0.48E-05 * scale_d - - E_I718 = 183E9 * np.ones(ensemble_size) * scale_E - nu_I718 = 0.31 * np.ones(ensemble_size) - k_I718 = 15.8 * scale_k - d_I718 = 1.38E-05 * scale_d - - T_ref = 22. - - m.Medium(pbl, "Mirror", "rhodium", E_rhodium, nu_rhodium, k_rhodium, - d_rhodium) - m.Medium(pbl, "Substrate", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - m.Medium(pbl, "Holder", "CuCrZr", E_CuCrZr, nu_CuCrZr, k_CuCrZr, d_CuCrZr) - - m.Medium(pbl, "Washer 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Shaft 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Nut 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Spacer 1 part 1", "AlN", E_AlN, nu_AlN, - 180. * scale_k, d_AlN) - m.Medium(pbl, "Spacer 2 part 1", "AlN", E_AlN, nu_AlN, - 180. * scale_k, d_AlN) - m.Medium(pbl, "Spacer 3 part 1", "AlN", E_AlN, nu_AlN, - 180. * scale_k, d_AlN) - - m.Medium(pbl, "Spacer 1 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 2 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 3 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - m.Dirichlet(pbl, "Holder x-y-z clamping point", "Clamped", 1, 0., 1, 0., 1, - 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder z clamping point", "Clamped", 0, 0., 0, 0., 1, 0., - 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder z-y clamping point", "Clamped", 0, 0., 1, 0., 1, - 0., 0, 0., ensemble_size) - - m.Dirichlet(pbl, "Cooling channels", "Clamped", 0, 0., 0, 0., 0, 0., 1, - ((70. - T_ref) / scale_T), ensemble_size) - - m.Dirichlet(pbl, "Mirror surface", "Clamped", 1, 0., 1, 0., 1, -10., 1, - ((70. - T_ref) / scale_T), ensemble_size) - ''' - zero = np.zeros(ensemble_size) - hf = 20. / 0.0121 * np.ones( - ensemble_size) * scale_hflux # 20 W / (0.0121 m^2) - - m.Neumann(pbl, "Mirror surface", "heat fluxes", 0, zero, 0, zero, 0, zero, - 1, hf, ensemble_size) - - m.Source(pbl, "Mirror", "ihg", 20E6 * scale_hsource) - m.Source(pbl, "Substrate", "ihg", 2.45E6 * scale_hsource) - - if material_option(option) == 1: - m.Source(pbl, "Holder", "ihg", 0.7E6 * scale_hsource) - elif material_option(option) == 2: - m.Source(pbl, "Holder", "ihg", 0.6E6 * scale_hsource) - - m.Source(pbl, "Spacer 1 part 1", "ihg", 0.3E6 * scale_hsource) - m.Source(pbl, "Spacer 2 part 1", "ihg", 0.3E6 * scale_hsource) - m.Source(pbl, "Spacer 3 part 1", "ihg", 0.3E6 * scale_hsource) - - m.Source(pbl, "Spacer 1 part 2", "ihg", 2.45E6 * scale_hsource) - m.Source(pbl, "Spacer 2 part 2", "ihg", 2.45E6 * scale_hsource) - m.Source(pbl, "Spacer 3 part 2", "ihg", 2.45E6 * scale_hsource) - - m.Source(pbl, "Shaft 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Shaft 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Shaft 3", "ihg", 0.8E6 * scale_hsource) - - m.Source(pbl, "Nut 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Nut 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Nut 3", "ihg", 0.8E6 * scale_hsource) - - m.Source(pbl, "Washer 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Washer 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Washer 3", "ihg", 0.8E6 * scale_hsource) - ''' - - nThreads = u.Initialize_Kokkos() - slv = m.IterativeSolver(pbl, solverList, 4, ensemble_size) - - slv.start() - u.Finalize_Kokkos() - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/tests/M1_assembly_fused.py b/katoptron/Juelich/tests/M1_assembly_fused.py deleted file mode 100644 index 762dd765..00000000 --- a/katoptron/Juelich/tests/M1_assembly_fused.py +++ /dev/null @@ -1,559 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -import numpy as np -import shlex -import subprocess -import os -import tarfile -import glob - -from katoptron.Juelich.UQ.halton import * -from katoptron.Juelich.UQ.copulas import * - - -def irradiation(irradotion_index, p1=1., p3=1.95): - sigma_1_min = 0.1 - sigma_1_max = 0.1 - sigma_3_min = 0.05 - sigma_3_max = 0.05 - - sigma_1 = sigma_1_min + (sigma_1_max - sigma_1_min) * irradotion_index - sigma_3 = sigma_3_min + (sigma_3_max - sigma_3_min) * irradotion_index - - mode_min = 70 - mode_max = 180 - - mode_1 = mode_min + (mode_max - mode_min) * irradotion_index**p1 - mode_3 = mode_min + (mode_max - mode_min) * irradotion_index**p3 - - mu_1 = np.log(mode_1) # + sigma_1**2 - mu_3 = np.log(mode_3) # + sigma_3**2 - - return sigma_1, sigma_3, mode_1, mode_3, mu_1, mu_3 - - -def random_case(N, id_case): - comm, rank, siz = m.utilities.import_MPI() - np.random.seed(42) - - sigma = 0.15 - mode = 180 - mu = np.log(mode) + sigma**2 - - qMC = True - - if id_case == 'qMC 1': - n_rand = 2 - halton_points = np.zeros((n_rand, N)) - for i in range(0, N): - halton_points[:, i] = halton(i + 1, n_rand) - - randomVariable_halton = lognormal(halton_points, [mu, mu], - [sigma, sigma]) - randomVariable_1 = randomVariable_halton[0, :] - randomVariable_2 = randomVariable_halton[1, :] - randomVariable_3 = mode * np.ones((N, )) - elif id_case == 'MC 1': - randomVariable_1 = np.random.lognormal(mu, sigma, N) - randomVariable_2 = np.random.lognormal(mu, sigma, N) - randomVariable_3 = mode * np.ones((N, )) - elif id_case == 'qMC 2': - mode_min = 70 - mode_max = 180 - n_rand = 2 - halton_points = np.zeros((n_rand, N)) - for i in range(0, N): - halton_points[:, i] = halton(i, n_rand) - - randomVariable_halton = lognormal(halton_points, [mu, mu], - [sigma, sigma]) - randomVariable_1 = mode_min + (mode_max - - mode_min) * halton_points[0, :] - randomVariable_2 = mode_min + (mode_max - - mode_min) * halton_points[0, :] - randomVariable_3 = mode_min + (mode_max - - mode_min) * halton_points[1, :] - elif id_case == 'qMC 3': - from scipy.stats import lognorm - mode_min = 70 - mode_max = 180 - n_rand = 3 - halton_points = np.zeros((n_rand, N)) - - randomVariable_1 = np.zeros((N, )) - randomVariable_3 = np.zeros((N, )) - - for i in range(0, N): - halton_points[:, i] = halton(i + 1, n_rand) - sigma_1, sigma_3, mode_1, mode_3, mu_1, mu_3 = irradiation( - halton_points[0, i]) - randomVariable_1[i] = lognorm.ppf(halton_points[1, i], - sigma_1, - scale=np.exp(mu_1)) - randomVariable_3[i] = lognorm.ppf(halton_points[2, i], - sigma_3, - scale=np.exp(mu_3)) - - randomVariable_2 = randomVariable_1 - elif id_case == 'Xiao': - file_dir = os.path.dirname(__file__) - loaded = np.load(file_dir + '/../samples_files/Xiao_' + str(N) + - '.npz') - samples = loaded['samples'] - N = samples.shape[0] - weights = loaded['weights'] - randomVariable_1 = samples[0:N, 0] - randomVariable_3 = samples[0:N, 1] - randomVariable_2 = randomVariable_1 - - if rank == 0: - np.savetxt('randomVariable_1.txt', randomVariable_1) - np.savetxt('randomVariable_2.txt', randomVariable_2) - np.savetxt('randomVariable_3.txt', randomVariable_3) - - return randomVariable_1, randomVariable_2, randomVariable_3 - - -def material_option(option): - return int(option[-1]) - - -def clamping_option(option): - return str(option[0]) - - -def scale_msh(msh, scale): - for n in msh.nodes: - for i in range(0, 3): - n.pos[i] = n.pos[i] * scale - - -def tar_results(directory, filename, rank, all=False): - os.chdir(directory) - if rank == 0: - tf = tarfile.open(filename + ".tar.gz", mode="w:gz") - if all: - for file in glob.glob('*'): - if file.endswith(".tar.gz"): - print(file + ' is not included') - else: - tf.add(file) - else: - for file in glob.glob('r*.txt'): - tf.add(file) - for file in glob.glob('*/*/t*.txt'): - tf.add(file) - for file in glob.glob('*/*/b*.txt'): - tf.add(file) - for file in glob.glob('*/*/*.npz'): - tf.add(file) - for file in glob.glob('*/*/*.out'): - tf.add(file) - tf.close() - - -def evaluate_one_ensemble(ensemble_size, msh, comm, file_dir, randomVariable_1, - randomVariable_2, randomVariable_3, scale_u, - scale_T, option, baking=False): - - from fwk.wutils import parseargs - args = parseargs() - - from PyTrilinos import Teuchos - import numpy as np - - small_disk_footprint = False - use_block = True - - comm, rank, siz = m.utilities.import_MPI() - - solverList = Teuchos.ParameterList() - solverList['type'] = "BlockGmres" - - solverList['Maximum Iterations'] = 500 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = True - - solverList['Print Teuchos timers'] = True - solverList['Write txt files'] = True - if small_disk_footprint: - solverList['Write vtk files'] = False - - solverList['convert MueLu xml file'] = True - solverList["use xml file"] = True - - if use_block: - if ensemble_size >= 16 and siz == 2 and clamping_option(option) == "A": - solverList["Num Blocks"] = 150 - else: - solverList["Num Blocks"] = 200 - - solverList['Use blocked matrix'] = True - - solverList['Use blocked status test'] = True - solverList['Use blocked status test: x'] = True - solverList['Use blocked status test: T'] = True - solverList['Use weighted status test'] = True - - solverList['Ensemble Convergence Tolerance: T - relative'] = True - solverList['Ensemble Convergence Tolerance: x - relative'] = True - solverList[ - 'Ensemble Convergence Tolerance: T - relative full rhs'] = False - solverList[ - 'Ensemble Convergence Tolerance: x - relative full rhs'] = False - solverList[ - 'Ensemble Convergence Tolerance: weights - relative'] = False - - solverList['Ensemble Convergence Tolerance'] = 10**(-5) - solverList['Ensemble Convergence Tolerance: x'] = 10**(-6) - solverList['Ensemble Convergence Tolerance: T'] = 10**(-7) - solverList['Ensemble Convergence Tolerance: weights'] = 10**(-3) - - solverList[ - "MueLu xml file name"] = file_dir + '/../smoothers/AMG_BGS_gs_gs.xml' - else: - solverList['Ensemble Convergence Tolerance'] = 10**(-8) - solverList[ - "MueLu xml file name"] = file_dir + '/../smoothers/heat_no_contact_mtgs.xml' - - solverList["Scaled Block 0"] = True - pbl = m.Problem(msh, comm) - - # Distance in the mesh are represented in meters - - scale_E = 1. / scale_u**2 - scale_k = (scale_T / scale_u) - scale_hsource = 1. / scale_u**3 - scale_hflux = 1. / scale_u**2 - scale_d = scale_T - - # 379 000 MPa = 379 GPa = 379E9 Pa - E_rhodium = 379E9 * np.ones(ensemble_size) * scale_E - nu_rhodium = 0.26 * np.ones(ensemble_size) - # 0.150 kW/(m K) = 150 W/(m K) - k_rhodium = 150 * scale_k - d_rhodium = 0.781E-05 * scale_d - - E_WCu = 280E9 * np.ones(ensemble_size) * scale_E - nu_WCu = 0.298 * np.ones(ensemble_size) - k_WCu = 180 * scale_k - d_WCu = 0.88E-05 * scale_d - - E_SS = 200E9 * np.ones(ensemble_size) * scale_E - nu_SS = 0.3 * np.ones(ensemble_size) - k_SS = 15.3 * scale_k - d_SS = 1.57E-05 * scale_d - - E_CuCrZr = 118E9 * np.ones(ensemble_size) * scale_E - nu_CuCrZr = 0.33 * np.ones(ensemble_size) - k_CuCrZr = 345 * np.ones(ensemble_size) * scale_k - d_CuCrZr = 1.8E-05 * np.ones(ensemble_size) * scale_d - - E_AlN = 320E9 * np.ones(ensemble_size) * scale_E - nu_AlN = 0.24 * np.ones(ensemble_size) - k_AlN = 180 * np.ones(ensemble_size) * scale_k - d_AlN = 0.48E-05 * np.ones(ensemble_size) * scale_d - - E_I718 = 183E9 * np.ones(ensemble_size) * scale_E - nu_I718 = 0.31 * np.ones(ensemble_size) - k_I718 = 15.8 * scale_k - d_I718 = 1.38E-05 * scale_d - - T_ref = 22. - - m.Medium(pbl, "Mirror", "rhodium", E_rhodium, nu_rhodium, k_rhodium, - d_rhodium) - m.Medium(pbl, "Substrate", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - if material_option(option) == 1: - m.Medium(pbl, "Holder", "SS", E_SS, nu_SS, k_SS, d_SS) - elif material_option(option) == 2: - m.Medium(pbl, "Holder", "CuCrZr", E_CuCrZr, nu_CuCrZr, k_CuCrZr, - d_CuCrZr) - - m.Medium(pbl, "Washer 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Shaft 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Nut 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Spacer 1 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_1 * scale_k, d_AlN) - m.Medium(pbl, "Spacer 2 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_2 * scale_k, d_AlN) - m.Medium(pbl, "Spacer 3 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_3 * scale_k, d_AlN) - - m.Medium(pbl, "Spacer 1 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 2 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 3 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - if clamping_option(option) == "A": - m.Dirichlet(pbl, "Holder z clamping", "Clamped", 0, 0., 0, 0., 1, 0., - 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder x-y clamping", "Clamped", 1, 0., 1, 0., 0, - 0., 0, 0., ensemble_size) - - elif clamping_option(option) == "B": - m.Dirichlet(pbl, "Holder x-y-z clamping point", "Clamped", 1, 0., 1, - 0., 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder z clamping point", "Clamped", 0, 0., 0, 0., - 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder z-y clamping point", "Clamped", 0, 0., 1, 0., - 1, 0., 0, 0., ensemble_size) - - m.Dirichlet(pbl, "Cooling channels", "Clamped", 0, 0., 0, 0., 0, 0., 1, - ((70. - T_ref) / scale_T), ensemble_size) - - if not baking: - zero = np.zeros(ensemble_size) - hf = 20. / 0.0121 * np.ones( - ensemble_size) * scale_hflux # 20 W / (0.0121 m^2) - - m.Neumann(pbl, "Mirror surface", "heat fluxes", 0, zero, 0, zero, 0, zero, - 1, hf, ensemble_size) - - m.Source(pbl, "Mirror", "ihg", 20E6 * scale_hsource) - m.Source(pbl, "Substrate", "ihg", 2.45E6 * scale_hsource) - - if material_option(option) == 1: - m.Source(pbl, "Holder", "ihg", 0.7E6 * scale_hsource) - elif material_option(option) == 2: - m.Source(pbl, "Holder", "ihg", 0.6E6 * scale_hsource) - - m.Source(pbl, "Spacer 1 part 1", "ihg", 0.3E6 * scale_hsource) - m.Source(pbl, "Spacer 2 part 1", "ihg", 0.3E6 * scale_hsource) - m.Source(pbl, "Spacer 3 part 1", "ihg", 0.3E6 * scale_hsource) - - m.Source(pbl, "Spacer 1 part 2", "ihg", 2.45E6 * scale_hsource) - m.Source(pbl, "Spacer 2 part 2", "ihg", 2.45E6 * scale_hsource) - m.Source(pbl, "Spacer 3 part 2", "ihg", 2.45E6 * scale_hsource) - - m.Source(pbl, "Shaft 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Shaft 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Shaft 3", "ihg", 0.8E6 * scale_hsource) - - m.Source(pbl, "Nut 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Nut 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Nut 3", "ihg", 0.8E6 * scale_hsource) - - m.Source(pbl, "Washer 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Washer 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Washer 3", "ihg", 0.8E6 * scale_hsource) - - if use_block: - m.Weight(pbl, "Mirror", 1, 0., 1, 0., 1, 1., 1, 0., ensemble_size) - - slv = m.IterativeSolver(pbl, args.k, solverList, 4, ensemble_size) - - slv.start() - - if rank == 0: - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - tag_name = "Mirror surface" - name_sol = "x_mm.txt" - DOFperNode = 4 - which_dof = 2 - - x, y, z, tri, dz = u.extract_2D(msh, tag_name, DOFperNode, which_dof, - ensemble_size, name_sol) - which_dof = 3 - x, y, z, tri, T = u.extract_2D(msh, tag_name, DOFperNode, which_dof, - ensemble_size, name_sol) - np.savez('mirror_data_' + str(rank), x=x, y=y, z=z, tri=tri, dz=dz, T=T) - - if rank == 0: - for i in range(1, siz): - data = comm.recv(source=i, tag=11) - else: - comm.send(1, dest=0, tag=11) - - if small_disk_footprint: - if rank == 0: - os.remove(name_sol) - - if rank == 0: - #OAX = msh.ntags["Optical Axis"].elems[0].nodes[0].pos[0] - #OAY = msh.ntags["Optical Axis"].elems[0].nodes[0].pos[1] - OAX, OAY = 0.0595, 0.017 - OAX = (OAX / scale_u) - OAY = (OAY / scale_u) - #OAX, OAY = 0.0595, 0.017 - for i in range(0, siz): - npzfile = np.load('mirror_data_' + str(i) + '.npz') - x_i = npzfile['x'] - y_i = npzfile['y'] - z_i = 0. * x_i - dz_i = npzfile['dz'] - tri_i = npzfile['tri'] - T_i = npzfile['T'] - if i == 0: - x = x_i - y = y_i - z = z_i - dz = dz_i - tri = tri_i - T = T_i - nNodes = len(x) - else: - x = np.append(x, x_i, axis=0) - y = np.append(y, y_i, axis=0) - z = np.append(z, z_i, axis=0) - dz = np.append(dz, dz_i, axis=0) - tri = np.append(tri, tri_i + nNodes, axis=0) - T = np.append(T, T_i, axis=0) - nNodes = len(x) - x = (x / scale_u) - y = (y / scale_u) - z = (z / scale_u) - dz = (dz / scale_u) - T = T * scale_T + T_ref - np.savez('mirror_data_all', x=x, y=y, z=z, tri=tri, dz=dz, T=T) - for i in range(0, ensemble_size): - optical_coefficients, dz_residual = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz[:, i], "m", np.array([OAX, OAY])) - np.savez('mirror_optical_results_' + str(i), - optical_coefficients=optical_coefficients, - dz_residual=dz_residual) - np.savetxt('mirror_optical_results_' + str(i) + '.out', - optical_coefficients) - - if small_disk_footprint: - if rank == 0: - for i in range(0, siz): - os.remove('mirror_data_' + str(i) + '.npz') - - -def evaluate_all_ensembles(ensemble_sizes, N, msh, comm, rank, size, file_dir, - randomVariable1, randomVariable2, randomVariable3, - scale_u, scale_T, option, baking=False): - """ - This function loop over the ensemble sizes, - and the ensembles - """ - for ensemble_size in ensemble_sizes: - directory = str(ensemble_size) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - N_ensemble = int(np.floor(N // ensemble_size)) - - ensemble_index_min = 0 - for ensemble_index in range(ensemble_index_min, N_ensemble): - directory = str(ensemble_index) - u.mkdir_MPI(option, comm, rank, size) - os.chdir(option) - - ensemble_index_start = ensemble_index * ensemble_size - ensemble_index_end = ensemble_index_start + ensemble_size - - randomVariable_cur1 = randomVariable1[ensemble_index_start: - ensemble_index_end] - - randomVariable_cur2 = randomVariable2[ensemble_index_start: - ensemble_index_end] - - randomVariable_cur3 = randomVariable3[ensemble_index_start: - ensemble_index_end] - - evaluate_one_ensemble(ensemble_size, msh, comm, file_dir, - randomVariable_cur1, randomVariable_cur2, - randomVariable_cur3, scale_u, scale_T, option, baking) - os.chdir('..') - os.chdir('..') - - -def main(): - comm, rank, size = m.utilities.import_MPI() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - directory = 'MPI_' + str(size) - u.mkdir_MPI(option, comm, rank, size) - os.chdir(option) - - mesh_name = 'fused_mirror_assembly_mm_part_' + str(size) + '.msh' - - msh = gmsh.MeshLoader(mesh_name, work_dir).execute(myrank=rank) - - scale_u_1 = 1000. - scale_u_2 = 1. - scale_u = scale_u_1 * scale_u_2 - scale_T = 1. - - scale_msh(msh, scale_u_2) - - randomVariable_1 = np.array([180., 30.]) - randomVariable_2 = np.array([180., 30.]) - randomVariable_3 = np.array([180., 30.]) - - ensemble_size = int(os.getenv('ensemble_size', 1)) - - ensemble_sizes = [ensemble_size] - - N = 2 - - option = 'A2' - - directory = 'A2_baking' - u.mkdir_MPI(option, comm, rank, size) - os.chdir(option) - - evaluate_all_ensembles(ensemble_sizes, N, msh, comm, rank, size, file_dir, - randomVariable_1, randomVariable_2, - randomVariable_3, scale_u, scale_T, option, baking=True) - os.chdir('..') - - directory = 'A2' - u.mkdir_MPI(option, comm, rank, size) - os.chdir(option) - - evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable_1, randomVariable_2, - randomVariable_3, scale_u, scale_T, option, baking=False) - os.chdir('..') - - option = 'B2' - - directory = 'B2_baking' - u.mkdir_MPI(option, comm, rank, size) - os.chdir(option) - - evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable_1, randomVariable_2, - randomVariable_3, scale_u, scale_T, option, baking=True) - os.chdir('..') - - directory = 'B2' - u.mkdir_MPI(option, comm, rank, size) - os.chdir(option) - - evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable_1, randomVariable_2, - randomVariable_3, scale_u, scale_T, option, baking=False) - os.chdir('..') - - os.chdir('..') - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/tests/M1_assembly_fused_MC_k.py b/katoptron/Juelich/tests/M1_assembly_fused_MC_k.py deleted file mode 100644 index 185b585c..00000000 --- a/katoptron/Juelich/tests/M1_assembly_fused_MC_k.py +++ /dev/null @@ -1,545 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -import numpy as np -import shlex -import subprocess -import os -import tarfile -import glob - -from katoptron.Juelich.UQ.halton import * -from katoptron.Juelich.UQ.copulas import * - - -def irradiation(irradotion_index, p1=1., p3=1.95): - sigma_1_min = 0.1 - sigma_1_max = 0.1 - sigma_3_min = 0.05 - sigma_3_max = 0.05 - - sigma_1 = sigma_1_min + (sigma_1_max - sigma_1_min) * irradotion_index - sigma_3 = sigma_3_min + (sigma_3_max - sigma_3_min) * irradotion_index - - mode_min = 70 - mode_max = 180 - - mode_1 = mode_min + (mode_max - mode_min) * irradotion_index**p1 - mode_3 = mode_min + (mode_max - mode_min) * irradotion_index**p3 - - mu_1 = np.log(mode_1) # + sigma_1**2 - mu_3 = np.log(mode_3) # + sigma_3**2 - - return sigma_1, sigma_3, mode_1, mode_3, mu_1, mu_3 - - -def random_case(N, id_case): - comm, rank, siz = m.utilities.import_MPI() - np.random.seed(42) - - sigma = 0.15 - mode = 180 - mu = np.log(mode) + sigma**2 - - qMC = True - - if id_case == 'qMC 1': - n_rand = 2 - halton_points = np.zeros((n_rand, N)) - for i in range(0, N): - halton_points[:, i] = halton(i + 1, n_rand) - - randomVariable_halton = lognormal(halton_points, [mu, mu], - [sigma, sigma]) - randomVariable_1 = randomVariable_halton[0, :] - randomVariable_2 = randomVariable_halton[1, :] - randomVariable_3 = mode * np.ones((N, )) - elif id_case == 'MC 1': - randomVariable_1 = np.random.lognormal(mu, sigma, N) - randomVariable_2 = np.random.lognormal(mu, sigma, N) - randomVariable_3 = mode * np.ones((N, )) - elif id_case == 'qMC 2': - mode_min = 70 - mode_max = 180 - n_rand = 2 - halton_points = np.zeros((n_rand, N)) - for i in range(0, N): - halton_points[:, i] = halton(i, n_rand) - - randomVariable_halton = lognormal(halton_points, [mu, mu], - [sigma, sigma]) - randomVariable_1 = mode_min + (mode_max - - mode_min) * halton_points[0, :] - randomVariable_2 = mode_min + (mode_max - - mode_min) * halton_points[0, :] - randomVariable_3 = mode_min + (mode_max - - mode_min) * halton_points[1, :] - elif id_case == 'qMC 3': - from scipy.stats import lognorm - mode_min = 70 - mode_max = 180 - n_rand = 3 - halton_points = np.zeros((n_rand, N)) - - randomVariable_1 = np.zeros((N, )) - randomVariable_3 = np.zeros((N, )) - - for i in range(0, N): - halton_points[:, i] = halton(i + 1, n_rand) - sigma_1, sigma_3, mode_1, mode_3, mu_1, mu_3 = irradiation( - halton_points[0, i]) - randomVariable_1[i] = lognorm.ppf(halton_points[1, i], - sigma_1, - scale=np.exp(mu_1)) - randomVariable_3[i] = lognorm.ppf(halton_points[2, i], - sigma_3, - scale=np.exp(mu_3)) - - randomVariable_2 = randomVariable_1 - elif id_case == 'Xiao': - file_dir = os.path.dirname(__file__) - loaded = np.load(file_dir + '/../samples_files/Xiao_' + str(N) + - '.npz') - samples = loaded['samples'] - N = samples.shape[0] - weights = loaded['weights'] - randomVariable_1 = samples[0:N, 0] - randomVariable_3 = samples[0:N, 1] - randomVariable_2 = randomVariable_1 - - if rank == 0: - np.savetxt('randomVariable_1.txt', randomVariable_1) - np.savetxt('randomVariable_2.txt', randomVariable_2) - np.savetxt('randomVariable_3.txt', randomVariable_3) - - return randomVariable_1, randomVariable_2, randomVariable_3 - - -def material_option(option): - return int(option[-1]) - - -def clamping_option(option): - return str(option[0]) - - -def scale_msh(msh, scale): - for n in msh.nodes: - for i in range(0, 3): - n.pos[i] = n.pos[i] * scale - - -def tar_results(directory, filename, rank, all=False): - os.chdir(directory) - if rank == 0: - tf = tarfile.open(filename + ".tar.gz", mode="w:gz") - if all: - for file in glob.glob('*'): - if file.endswith(".tar.gz"): - print(file + ' is not included') - else: - tf.add(file) - else: - for file in glob.glob('r*.txt'): - tf.add(file) - for file in glob.glob('*/*/t*.txt'): - tf.add(file) - for file in glob.glob('*/*/b*.txt'): - tf.add(file) - for file in glob.glob('*/*/*.npz'): - tf.add(file) - for file in glob.glob('*/*/*.out'): - tf.add(file) - tf.close() - - -def evaluate_one_ensemble(ensemble_size, msh, comm, file_dir, randomVariable_1, - randomVariable_2, randomVariable_3, scale_u, - scale_T): - - from fwk.wutils import parseargs - args = parseargs() - - from PyTrilinos import Teuchos - import numpy as np - - small_disk_footprint = True - use_block = True - - comm, rank, siz = m.utilities.import_MPI() - - option = 'A2' - - solverList = Teuchos.ParameterList() - solverList['type'] = "BlockGmres" - - solverList['Maximum Iterations'] = 500 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = True - - solverList['Print Teuchos timers'] = True - solverList['Write txt files'] = True - if small_disk_footprint: - solverList['Write vtk files'] = False - - solverList['convert MueLu xml file'] = True - solverList["use xml file"] = True - - if use_block: - if ensemble_size >= 16 and siz == 2 and clamping_option(option) == "A": - solverList["Num Blocks"] = 150 - else: - solverList["Num Blocks"] = 200 - - solverList['Use blocked matrix'] = True - - solverList['Use blocked status test'] = True - solverList['Use blocked status test: x'] = True - solverList['Use blocked status test: T'] = True - solverList['Use weighted status test'] = True - - solverList['Ensemble Convergence Tolerance: T - relative'] = True - solverList['Ensemble Convergence Tolerance: x - relative'] = True - solverList[ - 'Ensemble Convergence Tolerance: T - relative full rhs'] = False - solverList[ - 'Ensemble Convergence Tolerance: x - relative full rhs'] = False - solverList[ - 'Ensemble Convergence Tolerance: weights - relative'] = False - - solverList['Ensemble Convergence Tolerance'] = 10**(-5) - solverList['Ensemble Convergence Tolerance: x'] = 10**(-6) - solverList['Ensemble Convergence Tolerance: T'] = 10**(-7) - solverList['Ensemble Convergence Tolerance: weights'] = 10**(-3) - - solverList[ - "MueLu xml file name"] = file_dir + '/../smoothers/AMG_BGS_gs_gs.xml' - else: - solverList['Ensemble Convergence Tolerance'] = 10**(-8) - solverList[ - "MueLu xml file name"] = file_dir + '/../smoothers/heat_no_contact_mtgs.xml' - - solverList["Scaled Block 0"] = True - pbl = m.Problem(msh, comm) - - # Distance in the mesh are represented in meters - - scale_E = 1. / scale_u**2 - scale_k = (scale_T / scale_u) - scale_hsource = 1. / scale_u**3 - scale_hflux = 1. / scale_u**2 - scale_d = scale_T - - # 379 000 MPa = 379 GPa = 379E9 Pa - E_rhodium = 379E9 * np.ones(ensemble_size) * scale_E - nu_rhodium = 0.26 * np.ones(ensemble_size) - # 0.150 kW/(m K) = 150 W/(m K) - k_rhodium = 150 * scale_k - d_rhodium = 0.781E-05 * scale_d - - E_WCu = 280E9 * np.ones(ensemble_size) * scale_E - nu_WCu = 0.298 * np.ones(ensemble_size) - k_WCu = 180 * scale_k - d_WCu = 0.88E-05 * scale_d - - E_SS = 200E9 * np.ones(ensemble_size) * scale_E - nu_SS = 0.3 * np.ones(ensemble_size) - k_SS = 15.3 * scale_k - d_SS = 1.57E-05 * scale_d - - E_CuCrZr = 118E9 * np.ones(ensemble_size) * scale_E - nu_CuCrZr = 0.33 * np.ones(ensemble_size) - k_CuCrZr = 345 * np.ones(ensemble_size) * scale_k - d_CuCrZr = 1.8E-05 * np.ones(ensemble_size) * scale_d - - E_AlN = 320E9 * np.ones(ensemble_size) * scale_E - nu_AlN = 0.24 * np.ones(ensemble_size) - k_AlN = 180 * np.ones(ensemble_size) * scale_k - d_AlN = 0.48E-05 * np.ones(ensemble_size) * scale_d - - E_I718 = 183E9 * np.ones(ensemble_size) * scale_E - nu_I718 = 0.31 * np.ones(ensemble_size) - k_I718 = 15.8 * scale_k - d_I718 = 1.38E-05 * scale_d - - T_ref = 22. - - m.Medium(pbl, "Mirror", "rhodium", E_rhodium, nu_rhodium, k_rhodium, - d_rhodium) - m.Medium(pbl, "Substrate", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - if material_option(option) == 1: - m.Medium(pbl, "Holder", "SS", E_SS, nu_SS, k_SS, d_SS) - elif material_option(option) == 2: - m.Medium(pbl, "Holder", "CuCrZr", E_CuCrZr, nu_CuCrZr, k_CuCrZr, - d_CuCrZr) - - m.Medium(pbl, "Washer 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Shaft 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Nut 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Spacer 1 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_1 * scale_k, d_AlN) - m.Medium(pbl, "Spacer 2 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_2 * scale_k, d_AlN) - m.Medium(pbl, "Spacer 3 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_3 * scale_k, d_AlN) - - m.Medium(pbl, "Spacer 1 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 2 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 3 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - if clamping_option(option) == "A": - m.Dirichlet(pbl, "Holder z clamping", "Clamped", 0, 0., 0, 0., 1, 0., - 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder x-y clamping", "Clamped", 1, 0., 1, 0., 0, - 0., 0, 0., ensemble_size) - - elif clamping_option(option) == "B": - m.Dirichlet(pbl, "Holder x-y-z clamping point", "Clamped", 1, 0., 1, - 0., 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder z clamping point", "Clamped", 0, 0., 0, 0., - 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder z-y clamping point", "Clamped", 0, 0., 1, 0., - 1, 0., 0, 0., ensemble_size) - - m.Dirichlet(pbl, "Cooling channels", "Clamped", 0, 0., 0, 0., 0, 0., 1, - ((70. - T_ref) / scale_T), ensemble_size) - - zero = np.zeros(ensemble_size) - hf = 20. / 0.0121 * np.ones( - ensemble_size) * scale_hflux # 20 W / (0.0121 m^2) - - m.Neumann(pbl, "Mirror surface", "heat fluxes", 0, zero, 0, zero, 0, zero, - 1, hf, ensemble_size) - - m.Source(pbl, "Mirror", "ihg", 20E6 * scale_hsource) - m.Source(pbl, "Substrate", "ihg", 2.45E6 * scale_hsource) - - if material_option(option) == 1: - m.Source(pbl, "Holder", "ihg", 0.7E6 * scale_hsource) - elif material_option(option) == 2: - m.Source(pbl, "Holder", "ihg", 0.6E6 * scale_hsource) - - m.Source(pbl, "Spacer 1 part 1", "ihg", 0.3E6 * scale_hsource) - m.Source(pbl, "Spacer 2 part 1", "ihg", 0.3E6 * scale_hsource) - m.Source(pbl, "Spacer 3 part 1", "ihg", 0.3E6 * scale_hsource) - - m.Source(pbl, "Spacer 1 part 2", "ihg", 2.45E6 * scale_hsource) - m.Source(pbl, "Spacer 2 part 2", "ihg", 2.45E6 * scale_hsource) - m.Source(pbl, "Spacer 3 part 2", "ihg", 2.45E6 * scale_hsource) - - m.Source(pbl, "Shaft 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Shaft 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Shaft 3", "ihg", 0.8E6 * scale_hsource) - - m.Source(pbl, "Nut 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Nut 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Nut 3", "ihg", 0.8E6 * scale_hsource) - - m.Source(pbl, "Washer 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Washer 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Washer 3", "ihg", 0.8E6 * scale_hsource) - - if use_block: - m.Weight(pbl, "Mirror", 1, 0., 1, 0., 1, 1., 1, 0., ensemble_size) - - slv = m.IterativeSolver(pbl, args.k, solverList, 4, ensemble_size) - - slv.start() - - if rank == 0: - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - tag_name = "Mirror surface" - name_sol = "x_mm.txt" - DOFperNode = 4 - which_dof = 2 - - x, y, z, tri, dz = u.extract_2D(msh, tag_name, DOFperNode, which_dof, - ensemble_size, name_sol) - which_dof = 3 - x, y, z, tri, T = u.extract_2D(msh, tag_name, DOFperNode, which_dof, - ensemble_size, name_sol) - np.savez('mirror_data_' + str(rank), x=x, y=y, z=z, tri=tri, dz=dz, T=T) - - if rank == 0: - for i in range(1, siz): - data = comm.recv(source=i, tag=11) - else: - comm.send(1, dest=0, tag=11) - - if small_disk_footprint: - if rank == 0: - os.remove(name_sol) - - if rank == 0: - #OAX = msh.ntags["Optical Axis"].elems[0].nodes[0].pos[0] - #OAY = msh.ntags["Optical Axis"].elems[0].nodes[0].pos[1] - OAX, OAY = 0.0595, 0.017 - OAX = (OAX / scale_u) - OAY = (OAY / scale_u) - #OAX, OAY = 0.0595, 0.017 - for i in range(0, siz): - npzfile = np.load('mirror_data_' + str(i) + '.npz') - x_i = npzfile['x'] - y_i = npzfile['y'] - z_i = 0. * x_i - dz_i = npzfile['dz'] - tri_i = npzfile['tri'] - T_i = npzfile['T'] - if i == 0: - x = x_i - y = y_i - z = z_i - dz = dz_i - tri = tri_i - T = T_i - nNodes = len(x) - else: - x = np.append(x, x_i, axis=0) - y = np.append(y, y_i, axis=0) - z = np.append(z, z_i, axis=0) - dz = np.append(dz, dz_i, axis=0) - tri = np.append(tri, tri_i + nNodes, axis=0) - T = np.append(T, T_i, axis=0) - nNodes = len(x) - x = (x / scale_u) - y = (y / scale_u) - z = (z / scale_u) - dz = (dz / scale_u) - T = T * scale_T + T_ref - np.savez('mirror_data_all', x=x, y=y, z=z, tri=tri, dz=dz, T=T) - for i in range(0, ensemble_size): - optical_coefficients, dz_residual = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz[:, i], "m", np.array([OAX, OAY])) - np.savez('mirror_optical_results_' + str(i), - optical_coefficients=optical_coefficients, - dz_residual=dz_residual) - np.savetxt('mirror_optical_results_' + str(i) + '.out', - optical_coefficients) - - if small_disk_footprint: - if rank == 0: - for i in range(0, siz): - os.remove('mirror_data_' + str(i) + '.npz') - - -def evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable1, randomVariable2, randomVariable3, - scale_u, scale_T): - """ - This function loop over the ensemble sizes, - and the ensembles - """ - comm, rank, size = m.utilities.import_MPI() - for ensemble_size in ensemble_sizes: - directory = str(ensemble_size) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - N_ensemble = int(np.floor(N // ensemble_size)) - - ensemble_index_min = 0 - for ensemble_index in range(ensemble_index_min, N_ensemble): - directory = str(ensemble_index) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - ensemble_index_start = ensemble_index * ensemble_size - ensemble_index_end = ensemble_index_start + ensemble_size - - randomVariable_cur1 = randomVariable1[ensemble_index_start: - ensemble_index_end] - - randomVariable_cur2 = randomVariable2[ensemble_index_start: - ensemble_index_end] - - randomVariable_cur3 = randomVariable3[ensemble_index_start: - ensemble_index_end] - - evaluate_one_ensemble(ensemble_size, msh, comm, file_dir, - randomVariable_cur1, randomVariable_cur2, - randomVariable_cur3, scale_u, scale_T) - os.chdir('..') - os.chdir('..') - - -def main(): - comm, rank, size = m.utilities.import_MPI() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - directory = 'MPI_' + str(siz) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - mesh_name = 'fused_mirror_assembly_mm_part_' + str(siz) + '.msh' - - msh = gmsh.MeshLoader(mesh_name, work_dir).execute(myrank=rank) - - # sigma = 0.05 - # Scaled = True, tol = 10**(-8), scale_T=1 - # 1 -> 55 (m) -> smooth T QoI unsmooth u QoI - # 1000 -> 125 (mm) -> smooth T QoI unsmooth u QoI - # 10 000 -> 126 (100 \mu m) -> smooth T QoI nearly smooth u QoI - # 50 000 -> 167 (20 \mu m) -> smooth T QoI nearly smooth u QoI - # 100 000 -> 175 (10 \mu m) -> smooth QoI (OK) - # Scaled = False, tol = 10**(-8), scale_T=1 - # 1 -> 222 (m) -> Solver has experienced a loss of accuracy! - # 1000 -> 222 (mm) - # 10 000 -> (100 \mu m) - # 100 000 -> 222 (10 \mu m) -> No loss of accuracy - # Scaled = True, tol = 10**(-8), - # scale_u = 1000. and scale_T = 1. -> 125 (KO) - # scale_u = 1000. and scale_T = 100. -> 174 nearly smooth - # scale_u = 10000. and scale_T = 1. -> 126 (KO) - # scale_u = 10000. and scale_T = 100. -> 204 (OK) - # scale_u = 10000. and scale_T = 400. -> 217 (OK) - - scale_u_1 = 1000. - scale_u_2 = 1. - scale_u = scale_u_1 * scale_u_2 - scale_T = 1. - - scale_msh(msh, scale_u_2) - - N = 20 - id_case = 'Xiao' - - randomVariable_1, randomVariable_2, randomVariable_3 = random_case( - N, id_case) - - ensemble_size = int(os.getenv('ensemble_size', 1)) - - ensemble_sizes = [ensemble_size] - - N = len(randomVariable_1) - - evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable_1, randomVariable_2, - randomVariable_3, scale_u, scale_T) - - os.chdir('..') - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/tests/M1_assembly_fused_MC_k_order.py b/katoptron/Juelich/tests/M1_assembly_fused_MC_k_order.py deleted file mode 100644 index 565e6e0a..00000000 --- a/katoptron/Juelich/tests/M1_assembly_fused_MC_k_order.py +++ /dev/null @@ -1,554 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -import numpy as np -import shlex -import subprocess -import os -import tarfile -import glob - -from katoptron.Juelich.UQ.halton import * -from katoptron.Juelich.UQ.copulas import * - - -def irradiation(irradotion_index, p1=1., p3=1.95): - sigma_1_min = 0.1 - sigma_1_max = 0.1 - sigma_3_min = 0.05 - sigma_3_max = 0.05 - - sigma_1 = sigma_1_min + (sigma_1_max - sigma_1_min) * irradotion_index - sigma_3 = sigma_3_min + (sigma_3_max - sigma_3_min) * irradotion_index - - mode_min = 70 - mode_max = 180 - - mode_1 = mode_min + (mode_max - mode_min) * irradotion_index**p1 - mode_3 = mode_min + (mode_max - mode_min) * irradotion_index**p3 - - mu_1 = np.log(mode_1) # + sigma_1**2 - mu_3 = np.log(mode_3) # + sigma_3**2 - - return sigma_1, sigma_3, mode_1, mode_3, mu_1, mu_3 - - -def random_case(N, id_case): - comm, rank, siz = m.utilities.import_MPI() - np.random.seed(42) - - sigma = 0.15 - mode = 180 - mu = np.log(mode) + sigma**2 - - qMC = True - - if id_case == 'qMC 1': - n_rand = 2 - halton_points = np.zeros((n_rand, N)) - for i in range(0, N): - halton_points[:, i] = halton(i + 1, n_rand) - - randomVariable_halton = lognormal(halton_points, [mu, mu], - [sigma, sigma]) - randomVariable_1 = randomVariable_halton[0, :] - randomVariable_2 = randomVariable_halton[1, :] - randomVariable_3 = mode * np.ones((N, )) - elif id_case == 'MC 1': - randomVariable_1 = np.random.lognormal(mu, sigma, N) - randomVariable_2 = np.random.lognormal(mu, sigma, N) - randomVariable_3 = mode * np.ones((N, )) - elif id_case == 'qMC 2': - mode_min = 70 - mode_max = 180 - n_rand = 2 - halton_points = np.zeros((n_rand, N)) - for i in range(0, N): - halton_points[:, i] = halton(i, n_rand) - - randomVariable_halton = lognormal(halton_points, [mu, mu], - [sigma, sigma]) - randomVariable_1 = mode_min + (mode_max - - mode_min) * halton_points[0, :] - randomVariable_2 = mode_min + (mode_max - - mode_min) * halton_points[0, :] - randomVariable_3 = mode_min + (mode_max - - mode_min) * halton_points[1, :] - elif id_case == 'qMC 3': - from scipy.stats import lognorm - mode_min = 70 - mode_max = 180 - n_rand = 3 - halton_points = np.zeros((n_rand, N)) - - randomVariable_1 = np.zeros((N, )) - randomVariable_3 = np.zeros((N, )) - - for i in range(0, N): - halton_points[:, i] = halton(i + 1, n_rand) - sigma_1, sigma_3, mode_1, mode_3, mu_1, mu_3 = irradiation( - halton_points[0, i]) - randomVariable_1[i] = lognorm.ppf(halton_points[1, i], - sigma_1, - scale=np.exp(mu_1)) - randomVariable_3[i] = lognorm.ppf(halton_points[2, i], - sigma_3, - scale=np.exp(mu_3)) - - randomVariable_2 = randomVariable_1 - elif id_case == 'Xiao': - file_dir = os.path.dirname(__file__) - loaded = np.load(file_dir + '/../samples_files/Xiao_' + str(N) + - '.npz') - samples = loaded['samples'] - N = samples.shape[0] - weights = loaded['weights'] - randomVariable_1 = samples[0:N, 0] - randomVariable_3 = samples[0:N, 1] - randomVariable_2 = randomVariable_1 - - if rank == 0: - np.savetxt('randomVariable_1.txt', randomVariable_1) - np.savetxt('randomVariable_2.txt', randomVariable_2) - np.savetxt('randomVariable_3.txt', randomVariable_3) - - return randomVariable_1, randomVariable_2, randomVariable_3 - - -def material_option(option): - return int(option[-1]) - - -def clamping_option(option): - return str(option[0]) - - -def scale_msh(msh, scale): - for n in msh.nodes: - for i in range(0, 3): - n.pos[i] = n.pos[i] * scale - - -def tar_results(directory, filename, rank, all=False): - os.chdir(directory) - if rank == 0: - tf = tarfile.open(filename + ".tar.gz", mode="w:gz") - if all: - for file in glob.glob('*'): - if file.endswith(".tar.gz"): - print(file + ' is not included') - else: - tf.add(file) - else: - for file in glob.glob('r*.txt'): - tf.add(file) - for file in glob.glob('*/*/t*.txt'): - tf.add(file) - for file in glob.glob('*/*/b*.txt'): - tf.add(file) - for file in glob.glob('*/*/*.npz'): - tf.add(file) - for file in glob.glob('*/*/*.out'): - tf.add(file) - tf.close() - - -def evaluate_one_ensemble(ensemble_size, msh, comm, file_dir, randomVariable_1, - randomVariable_2, randomVariable_3, scale_u, - scale_T): - - from fwk.wutils import parseargs - args = parseargs() - - from PyTrilinos import Teuchos - import numpy as np - - small_disk_footprint = True - use_block = True - - comm, rank, siz = m.utilities.import_MPI() - - option = 'A2' - - solverList = Teuchos.ParameterList() - solverList['type'] = "BlockGmres" - - solverList['Maximum Iterations'] = 500 - solverList["Num Blocks"] = 2 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = True - - solverList['Print Teuchos timers'] = True - solverList['Write txt files'] = True - if small_disk_footprint: - solverList['Write vtk files'] = False - - solverList['convert MueLu xml file'] = True - solverList["use xml file"] = True - - solverList['Write matrix and vectors'] = False - - if use_block: - if ensemble_size >= 16 and siz == 2 and clamping_option(option) == "A": - solverList["Num Blocks"] = 150 - else: - solverList["Num Blocks"] = 200 - - solverList['Use blocked matrix'] = True - - solverList['Use blocked status test'] = True - solverList['Use blocked status test: x'] = True - solverList['Use blocked status test: T'] = True - solverList['Use weighted status test'] = True - - solverList['Ensemble Convergence Tolerance: T - relative'] = True - solverList['Ensemble Convergence Tolerance: x - relative'] = True - solverList[ - 'Ensemble Convergence Tolerance: T - relative full rhs'] = False - solverList[ - 'Ensemble Convergence Tolerance: x - relative full rhs'] = False - solverList[ - 'Ensemble Convergence Tolerance: weights - relative'] = False - - solverList['Ensemble Convergence Tolerance'] = 10**(-5) - solverList['Ensemble Convergence Tolerance: x'] = 10**(-6) - solverList['Ensemble Convergence Tolerance: T'] = 10**(-7) - solverList['Ensemble Convergence Tolerance: weights'] = 10**(-3) - - solverList[ - "MueLu xml file name"] = file_dir + '/../smoothers/AMG_BGS_gs_gs.xml' - else: - solverList['Ensemble Convergence Tolerance'] = 10**(-8) - solverList[ - "MueLu xml file name"] = file_dir + '/../smoothers/heat_no_contact_mtgs.xml' - - solverList["Scaled Block 0"] = True - pbl = m.Problem(msh, comm) - - # Distance in the mesh are represented in meters - - scale_E = 1. / scale_u**2 - scale_k = (scale_T / scale_u) - scale_hsource = 1. / scale_u**3 - scale_hflux = 1. / scale_u**2 - scale_d = scale_T - - # 379 000 MPa = 379 GPa = 379E9 Pa - E_rhodium = 379E9 * np.ones(ensemble_size) * scale_E - nu_rhodium = 0.26 * np.ones(ensemble_size) - # 0.150 kW/(m K) = 150 W/(m K) - k_rhodium = 150 * scale_k - d_rhodium = 0.781E-05 * scale_d - - E_WCu = 280E9 * np.ones(ensemble_size) * scale_E - nu_WCu = 0.298 * np.ones(ensemble_size) - k_WCu = 180 * scale_k - d_WCu = 0.88E-05 * scale_d - - E_SS = 200E9 * np.ones(ensemble_size) * scale_E - nu_SS = 0.3 * np.ones(ensemble_size) - k_SS = 15.3 * scale_k - d_SS = 1.57E-05 * scale_d - - E_CuCrZr = 118E9 * np.ones(ensemble_size) * scale_E - nu_CuCrZr = 0.33 * np.ones(ensemble_size) - k_CuCrZr = 345 * np.ones(ensemble_size) * scale_k - d_CuCrZr = 1.8E-05 * np.ones(ensemble_size) * scale_d - - E_AlN = 320E9 * np.ones(ensemble_size) * scale_E - nu_AlN = 0.24 * np.ones(ensemble_size) - k_AlN = 180 * np.ones(ensemble_size) * scale_k - d_AlN = 0.48E-05 * np.ones(ensemble_size) * scale_d - - E_I718 = 183E9 * np.ones(ensemble_size) * scale_E - nu_I718 = 0.31 * np.ones(ensemble_size) - k_I718 = 15.8 * scale_k - d_I718 = 1.38E-05 * scale_d - - T_ref = 22. - - m.Medium(pbl, "Mirror", "rhodium", E_rhodium, nu_rhodium, k_rhodium, - d_rhodium) - m.Medium(pbl, "Substrate", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - if material_option(option) == 1: - m.Medium(pbl, "Holder", "SS", E_SS, nu_SS, k_SS, d_SS) - elif material_option(option) == 2: - m.Medium(pbl, "Holder", "CuCrZr", E_CuCrZr, nu_CuCrZr, k_CuCrZr, - d_CuCrZr) - - m.Medium(pbl, "Washer 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Shaft 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Nut 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Spacer 1 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_1 * scale_k, d_AlN) - m.Medium(pbl, "Spacer 2 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_2 * scale_k, d_AlN) - m.Medium(pbl, "Spacer 3 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_3 * scale_k, d_AlN) - - m.Medium(pbl, "Spacer 1 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 2 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 3 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - if clamping_option(option) == "A": - m.Dirichlet(pbl, "Holder z clamping", "Clamped", 0, 0., 0, 0., 1, 0., - 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder x-y clamping", "Clamped", 1, 0., 1, 0., 0, - 0., 0, 0., ensemble_size) - - elif clamping_option(option) == "B": - m.Dirichlet(pbl, "Holder x-y-z clamping point", "Clamped", 1, 0., 1, - 0., 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder z clamping point", "Clamped", 0, 0., 0, 0., - 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder z-y clamping point", "Clamped", 0, 0., 1, 0., - 1, 0., 0, 0., ensemble_size) - - m.Dirichlet(pbl, "Cooling channels", "Clamped", 0, 0., 0, 0., 0, 0., 1, - ((70. - T_ref) / scale_T), ensemble_size) - - zero = np.zeros(ensemble_size) - hf = 20. / 0.0121 * np.ones( - ensemble_size) * scale_hflux # 20 W / (0.0121 m^2) - - m.Neumann(pbl, "Mirror surface", "heat fluxes", 0, zero, 0, zero, 0, zero, - 1, hf, ensemble_size) - - m.Source(pbl, "Mirror", "ihg", 20E6 * scale_hsource) - m.Source(pbl, "Substrate", "ihg", 2.45E6 * scale_hsource) - - if material_option(option) == 1: - m.Source(pbl, "Holder", "ihg", 0.7E6 * scale_hsource) - elif material_option(option) == 2: - m.Source(pbl, "Holder", "ihg", 0.6E6 * scale_hsource) - - m.Source(pbl, "Spacer 1 part 1", "ihg", 0.3E6 * scale_hsource) - m.Source(pbl, "Spacer 2 part 1", "ihg", 0.3E6 * scale_hsource) - m.Source(pbl, "Spacer 3 part 1", "ihg", 0.3E6 * scale_hsource) - - m.Source(pbl, "Spacer 1 part 2", "ihg", 2.45E6 * scale_hsource) - m.Source(pbl, "Spacer 2 part 2", "ihg", 2.45E6 * scale_hsource) - m.Source(pbl, "Spacer 3 part 2", "ihg", 2.45E6 * scale_hsource) - - m.Source(pbl, "Shaft 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Shaft 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Shaft 3", "ihg", 0.8E6 * scale_hsource) - - m.Source(pbl, "Nut 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Nut 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Nut 3", "ihg", 0.8E6 * scale_hsource) - - m.Source(pbl, "Washer 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Washer 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Washer 3", "ihg", 0.8E6 * scale_hsource) - - if use_block: - m.Weight(pbl, "Mirror", 1, 0., 1, 0., 1, 1., 1, 0., ensemble_size) - - slv = m.IterativeSolver(pbl, args.k, solverList, 4, ensemble_size) - - slv.start() - - if rank == 0: - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - tag_name = "Mirror surface" - name_sol = "x_mm.txt" - DOFperNode = 4 - which_dof = 2 - - x, y, z, tri, dz = u.extract_2D(msh, tag_name, DOFperNode, which_dof, - ensemble_size, name_sol) - which_dof = 3 - x, y, z, tri, T = u.extract_2D(msh, tag_name, DOFperNode, which_dof, - ensemble_size, name_sol) - np.savez('mirror_data_' + str(rank), x=x, y=y, z=z, tri=tri, dz=dz, T=T) - - if rank == 0: - for i in range(1, siz): - data = comm.recv(source=i, tag=11) - else: - comm.send(1, dest=0, tag=11) - - if small_disk_footprint: - if rank == 0: - os.remove(name_sol) - - if rank == 0: - #OAX = msh.ntags["Optical Axis"].elems[0].nodes[0].pos[0] - #OAY = msh.ntags["Optical Axis"].elems[0].nodes[0].pos[1] - OAX, OAY = 0.0595, 0.017 - OAX = (OAX / scale_u) - OAY = (OAY / scale_u) - #OAX, OAY = 0.0595, 0.017 - for i in range(0, siz): - npzfile = np.load('mirror_data_' + str(i) + '.npz') - x_i = npzfile['x'] - y_i = npzfile['y'] - z_i = 0. * x_i - dz_i = npzfile['dz'] - tri_i = npzfile['tri'] - T_i = npzfile['T'] - if i == 0: - x = x_i - y = y_i - z = z_i - dz = dz_i - tri = tri_i - T = T_i - nNodes = len(x) - else: - x = np.append(x, x_i, axis=0) - y = np.append(y, y_i, axis=0) - z = np.append(z, z_i, axis=0) - dz = np.append(dz, dz_i, axis=0) - tri = np.append(tri, tri_i + nNodes, axis=0) - T = np.append(T, T_i, axis=0) - nNodes = len(x) - x = (x / scale_u) - y = (y / scale_u) - z = (z / scale_u) - dz = (dz / scale_u) - T = T * scale_T + T_ref - np.savez('mirror_data_all', x=x, y=y, z=z, tri=tri, dz=dz, T=T) - for i in range(0, ensemble_size): - optical_coefficients, dz_residual = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz[:, i], "m", np.array([OAX, OAY])) - np.savez('mirror_optical_results_' + str(i), - optical_coefficients=optical_coefficients, - dz_residual=dz_residual) - np.savetxt('mirror_optical_results_' + str(i) + '.out', - optical_coefficients) - - if small_disk_footprint: - if rank == 0: - for i in range(0, siz): - os.remove('mirror_data_' + str(i) + '.npz') - - -def evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable1, randomVariable2, randomVariable3, - scale_u, scale_T): - """ - This function loop over the ensemble sizes, - and the ensembles - """ - comm, rank, size = m.utilities.import_MPI() - - for ensemble_size in ensemble_sizes: - directory = str(ensemble_size) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - N_ensemble = int(np.floor(N // ensemble_size)) - - ensemble_index_min = 0 - for ensemble_index in range(ensemble_index_min, N_ensemble): - directory = str(ensemble_index) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - ensemble_index_start = ensemble_index * ensemble_size - ensemble_index_end = ensemble_index_start + ensemble_size - - randomVariable_cur1 = randomVariable1[ensemble_index_start: - ensemble_index_end] - - randomVariable_cur2 = randomVariable2[ensemble_index_start: - ensemble_index_end] - - randomVariable_cur3 = randomVariable3[ensemble_index_start: - ensemble_index_end] - - evaluate_one_ensemble(ensemble_size, msh, comm, file_dir, - randomVariable_cur1, randomVariable_cur2, - randomVariable_cur3, scale_u, scale_T) - os.chdir('..') - os.chdir('..') - - -def main(): - comm, rank, size = m.utilities.import_MPI() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - mesh_name = 'fused_mirror_assembly_mm_part_' + str(siz) + '.msh' - - msh = gmsh.MeshLoader(mesh_name, work_dir).execute(myrank=rank) - - # sigma = 0.05 - # Scaled = True, tol = 10**(-8), scale_T=1 - # 1 -> 55 (m) -> smooth T QoI unsmooth u QoI - # 1000 -> 125 (mm) -> smooth T QoI unsmooth u QoI - # 10 000 -> 126 (100 \mu m) -> smooth T QoI nearly smooth u QoI - # 50 000 -> 167 (20 \mu m) -> smooth T QoI nearly smooth u QoI - # 100 000 -> 175 (10 \mu m) -> smooth QoI (OK) - # Scaled = False, tol = 10**(-8), scale_T=1 - # 1 -> 222 (m) -> Solver has experienced a loss of accuracy! - # 1000 -> 222 (mm) - # 10 000 -> (100 \mu m) - # 100 000 -> 222 (10 \mu m) -> No loss of accuracy - # Scaled = True, tol = 10**(-8), - # scale_u = 1000. and scale_T = 1. -> 125 (KO) - # scale_u = 1000. and scale_T = 100. -> 174 nearly smooth - # scale_u = 10000. and scale_T = 1. -> 126 (KO) - # scale_u = 10000. and scale_T = 100. -> 204 (OK) - # scale_u = 10000. and scale_T = 400. -> 217 (OK) - - scale_u_1 = 1000. - scale_u_2 = 1. - scale_u = scale_u_1*scale_u_2 - scale_T = 1. - - # Convert mm to m - #scale_msh(msh, 0.001) - scale_msh(msh, scale_u_2) - - orders = np.arange(2, 46, 2) - - for order in orders: - id_case = 'Xiao' - directory = 'order_'+str(order) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - N = order - randomVariable_1, randomVariable_2, randomVariable_3 = random_case( - N, id_case) - - N = len(randomVariable_1) - - ensemble_size = int(os.getenv('ensemble_size', 1)) - ensemble_sizes = [ensemble_size] - - evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable_1, randomVariable_2, - randomVariable_3, scale_u, scale_T) - os.chdir('..') - #tar_results(work_dir, 'QoI_results', rank) - #tar_results(work_dir, 'all_results', rank, True) - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/tests/M1_assembly_fused_all.py b/katoptron/Juelich/tests/M1_assembly_fused_all.py deleted file mode 100644 index 1331f463..00000000 --- a/katoptron/Juelich/tests/M1_assembly_fused_all.py +++ /dev/null @@ -1,475 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -import numpy as np -import shlex -import subprocess -import os -import tarfile -import glob - -from katoptron.Juelich.UQ.halton import * -from katoptron.Juelich.UQ.copulas import * - - -def irradiation(irradotion_index, p1=1., p3=1.95): - sigma_1_min = 0.1 - sigma_1_max = 0.1 - sigma_3_min = 0.05 - sigma_3_max = 0.05 - - sigma_1 = sigma_1_min + (sigma_1_max - sigma_1_min) * irradotion_index - sigma_3 = sigma_3_min + (sigma_3_max - sigma_3_min) * irradotion_index - - mode_min = 70 - mode_max = 180 - - mode_1 = mode_min + (mode_max - mode_min) * irradotion_index**p1 - mode_3 = mode_min + (mode_max - mode_min) * irradotion_index**p3 - - mu_1 = np.log(mode_1) # + sigma_1**2 - mu_3 = np.log(mode_3) # + sigma_3**2 - - return sigma_1, sigma_3, mode_1, mode_3, mu_1, mu_3 - - -def random_case(N, id_case): - comm, rank, siz = m.utilities.import_MPI() - np.random.seed(42) - - sigma = 0.15 - mode = 180 - mu = np.log(mode) + sigma**2 - - qMC = True - - if id_case == 'qMC 1': - n_rand = 2 - halton_points = np.zeros((n_rand, N)) - for i in range(0, N): - halton_points[:, i] = halton(i + 1, n_rand) - - randomVariable_halton = lognormal(halton_points, [mu, mu], - [sigma, sigma]) - randomVariable_1 = randomVariable_halton[0, :] - randomVariable_2 = randomVariable_halton[1, :] - randomVariable_3 = mode * np.ones((N, )) - elif id_case == 'MC 1': - randomVariable_1 = np.random.lognormal(mu, sigma, N) - randomVariable_2 = np.random.lognormal(mu, sigma, N) - randomVariable_3 = mode * np.ones((N, )) - elif id_case == 'qMC 2': - mode_min = 70 - mode_max = 180 - n_rand = 2 - halton_points = np.zeros((n_rand, N)) - for i in range(0, N): - halton_points[:, i] = halton(i, n_rand) - - randomVariable_halton = lognormal(halton_points, [mu, mu], - [sigma, sigma]) - randomVariable_1 = mode_min + (mode_max - - mode_min) * halton_points[0, :] - randomVariable_2 = mode_min + (mode_max - - mode_min) * halton_points[0, :] - randomVariable_3 = mode_min + (mode_max - - mode_min) * halton_points[1, :] - elif id_case == 'qMC 3': - from scipy.stats import lognorm - mode_min = 70 - mode_max = 180 - n_rand = 3 - halton_points = np.zeros((n_rand, N)) - - randomVariable_1 = np.zeros((N, )) - randomVariable_3 = np.zeros((N, )) - - for i in range(0, N): - halton_points[:, i] = halton(i + 1, n_rand) - sigma_1, sigma_3, mode_1, mode_3, mu_1, mu_3 = irradiation( - halton_points[0, i]) - randomVariable_1[i] = lognorm.ppf(halton_points[1, i], - sigma_1, - scale=np.exp(mu_1)) - randomVariable_3[i] = lognorm.ppf(halton_points[2, i], - sigma_3, - scale=np.exp(mu_3)) - - randomVariable_2 = randomVariable_1 - elif id_case == 'Xiao': - file_dir = os.path.dirname(__file__) - loaded = np.load(file_dir + '/../samples_files/Xiao_' + str(N) + - '.npz') - samples = loaded['samples'] - N = samples.shape[0] - weights = loaded['weights'] - randomVariable_1 = samples[0:N, 0] - randomVariable_3 = samples[0:N, 1] - randomVariable_2 = randomVariable_1 - - if rank == 0: - np.savetxt('randomVariable_1.txt', randomVariable_1) - np.savetxt('randomVariable_2.txt', randomVariable_2) - np.savetxt('randomVariable_3.txt', randomVariable_3) - - return randomVariable_1, randomVariable_2, randomVariable_3 - - -def material_option(option): - return int(option[-1]) - - -def clamping_option(option): - return str(option[0]) - - -def scale_msh(msh, scale): - for n in msh.nodes: - for i in range(0, 3): - n.pos[i] = n.pos[i] * scale - - -def tar_results(directory, filename, rank, all=False): - os.chdir(directory) - if rank == 0: - tf = tarfile.open(filename + ".tar.gz", mode="w:gz") - if all: - for file in glob.glob('*'): - if file.endswith(".tar.gz"): - print(file + ' is not included') - else: - tf.add(file) - else: - for file in glob.glob('r*.txt'): - tf.add(file) - for file in glob.glob('*/*/t*.txt'): - tf.add(file) - for file in glob.glob('*/*/b*.txt'): - tf.add(file) - for file in glob.glob('*/*/*.npz'): - tf.add(file) - for file in glob.glob('*/*/*.out'): - tf.add(file) - tf.close() - - -def evaluate_one_ensemble(ensemble_size, - msh, - comm, - file_dir, - randomVariable_1, - randomVariable_2, - randomVariable_3, - scale_u, - scale_T, - small_disk_footprint=True): - - from fwk.wutils import parseargs - args = parseargs() - - from PyTrilinos import Teuchos - import numpy as np - - use_block = True - - comm, rank, size = m.utilities.import_MPI() - - option = 'B2' - - solverList = Teuchos.ParameterList() - solverList['type'] = "BlockGmres" - - solverList['Maximum Iterations'] = 500 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = True - - solverList['Print Teuchos timers'] = True - solverList['Write txt files'] = True - if small_disk_footprint: - solverList['Write vtk files'] = False - - solverList['convert MueLu xml file'] = True - solverList["use xml file"] = True - - if use_block: - if ensemble_size >= 16 and size == 2 and clamping_option(option) == "A": - solverList["Num Blocks"] = 150 - else: - solverList["Num Blocks"] = 250 - - solverList['Use blocked matrix'] = True - - solverList['Use blocked status test'] = True - solverList['Use blocked status test: x'] = True - solverList['Use blocked status test: T'] = True - solverList['Use weighted status test'] = False - - solverList['Ensemble Convergence Tolerance: T - relative'] = True - solverList['Ensemble Convergence Tolerance: x - relative'] = True - solverList[ - 'Ensemble Convergence Tolerance: T - relative full rhs'] = False - solverList[ - 'Ensemble Convergence Tolerance: x - relative full rhs'] = False - solverList[ - 'Ensemble Convergence Tolerance: weights - relative'] = False - - solverList['Ensemble Convergence Tolerance'] = 1e-5 - solverList['Ensemble Convergence Tolerance: x'] = 1e-5 - solverList['Ensemble Convergence Tolerance: T'] = 1e-7 - solverList['Ensemble Convergence Tolerance: weights'] = 5e-3 - - solverList[ - "MueLu xml file name"] = file_dir + '/../smoothers/AMG_BGS_gs_gs.xml' - else: - solverList['Ensemble Convergence Tolerance'] = 10**(-8) - solverList[ - "MueLu xml file name"] = file_dir + '/../smoothers/heat_no_contact_mtgs.xml' - - solverList["Scaled Block 0"] = True - pbl = m.Problem(msh, comm) - - # Distance in the mesh are represented in meters - - scale_E = 1. / scale_u**2 - scale_k = (scale_T / scale_u) - scale_hsource = 1. / scale_u**3 - scale_hflux = 1. / scale_u**2 - scale_d = scale_T - - # 379 000 MPa = 379 GPa = 379E9 Pa - E_rhodium = 379E9 * np.ones(ensemble_size) * scale_E - nu_rhodium = 0.26 * np.ones(ensemble_size) - # 0.150 kW/(m K) = 150 W/(m K) - k_rhodium = 150 * scale_k - d_rhodium = 0.781E-05 * scale_d - - E_WCu = 280E9 * np.ones(ensemble_size) * scale_E - nu_WCu = 0.298 * np.ones(ensemble_size) - k_WCu = 180 * scale_k - d_WCu = 0.88E-05 * scale_d - - E_SS = 200E9 * np.ones(ensemble_size) * scale_E - nu_SS = 0.3 * np.ones(ensemble_size) - k_SS = 15.3 * scale_k - d_SS = 1.57E-05 * scale_d - - E_CuCrZr = 118E9 * np.ones(ensemble_size) * scale_E - nu_CuCrZr = 0.33 * np.ones(ensemble_size) - k_CuCrZr = 345 * np.ones(ensemble_size) * scale_k - d_CuCrZr = 1.8E-05 * np.ones(ensemble_size) * scale_d - - E_AlN = 320E9 * np.ones(ensemble_size) * scale_E - nu_AlN = 0.24 * np.ones(ensemble_size) - k_AlN = 180 * np.ones(ensemble_size) * scale_k - d_AlN = 0.48E-05 * np.ones(ensemble_size) * scale_d - - E_I718 = 183E9 * np.ones(ensemble_size) * scale_E - nu_I718 = 0.31 * np.ones(ensemble_size) - k_I718 = 15.8 * scale_k - d_I718 = 1.38E-05 * scale_d - - T_ref = 22. - - m.Medium(pbl, "Mirror", "rhodium", E_rhodium, nu_rhodium, k_rhodium, - d_rhodium) - m.Medium(pbl, "Substrate", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - if material_option(option) == 1: - m.Medium(pbl, "Holder", "SS", E_SS, nu_SS, k_SS, d_SS) - m.Medium(pbl, "Holder 2", "SS", E_SS, nu_SS, k_SS, d_SS) - m.Medium(pbl, "Pipes", "SS", E_SS, nu_SS, k_SS, d_SS) - elif material_option(option) == 2: - m.Medium(pbl, "Holder", "CuCrZr", E_CuCrZr, nu_CuCrZr, k_CuCrZr, - d_CuCrZr) - m.Medium(pbl, "Holder 2", "CuCrZr", E_CuCrZr, nu_CuCrZr, k_CuCrZr, - d_CuCrZr) - m.Medium(pbl, "Pipes", "CuCrZr", E_CuCrZr, nu_CuCrZr, k_CuCrZr, - d_CuCrZr) - - m.Medium(pbl, "Bolts", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Washer 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Shaft 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Nut 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Spacer 1 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_1 * scale_k, d_AlN) - m.Medium(pbl, "Spacer 2 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_2 * scale_k, d_AlN) - m.Medium(pbl, "Spacer 3 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_3 * scale_k, d_AlN) - - m.Medium(pbl, "Spacer 1 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 2 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 3 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - m.Dirichlet(pbl, "Holder x", "Clamped", 1, 0., 0, 0., 0, 0., 0, 0., - ensemble_size) - m.Dirichlet(pbl, "Holder yz", "Clamped", 0, 0., 1, 0., 1, 0., 0, 0., - ensemble_size) - m.Dirichlet(pbl, "Holder z", "Clamped", 0, 0., 0, 0., 1, 0., 0, 0., - ensemble_size) - - m.Dirichlet(pbl, "Cooling channels", "Clamped", 0, 0., 0, 0., 0, 0., 1, - ((70. - T_ref) scale_T), ensemble_size) - - zero = np.zeros(ensemble_size) - hf = 20. / 0.0121 * np.ones( - ensemble_size) * scale_hflux # 20 W / (0.0121 m^2) - - m.Neumann(pbl, "Mirror surface", "heat fluxes", 0, zero, 0, zero, 0, zero, - 1, hf, ensemble_size) - - m.Source(pbl, "Mirror", "ihg", 20E6 * scale_hsource) - m.Source(pbl, "Substrate", "ihg", 2.45E6 * scale_hsource) - - if material_option(option) == 1: - m.Source(pbl, "Holder", "ihg", 0.7E6 * scale_hsource) - m.Source(pbl, "Holder 2", "ihg", 0.7E6 * scale_hsource) - m.Source(pbl, "Pipes", "ihg", 0.7E6 * scale_hsource) - elif material_option(option) == 2: - m.Source(pbl, "Holder", "ihg", 0.6E6 * scale_hsource) - m.Source(pbl, "Holder 2", "ihg", 0.6E6 * scale_hsource) - m.Source(pbl, "Pipes", "ihg", 0.6E6 * scale_hsource) - m.Source(pbl, "Bolts", "ihg", 0.8E6 * scale_hsource) - - m.Source(pbl, "Spacer 1 part 1", "ihg", 0.3E6 * scale_hsource) - m.Source(pbl, "Spacer 2 part 1", "ihg", 0.3E6 * scale_hsource) - m.Source(pbl, "Spacer 3 part 1", "ihg", 0.3E6 * scale_hsource) - - m.Source(pbl, "Spacer 1 part 2", "ihg", 2.45E6 * scale_hsource) - m.Source(pbl, "Spacer 2 part 2", "ihg", 2.45E6 * scale_hsource) - m.Source(pbl, "Spacer 3 part 2", "ihg", 2.45E6 * scale_hsource) - - m.Source(pbl, "Shaft 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Shaft 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Shaft 3", "ihg", 0.8E6 * scale_hsource) - - m.Source(pbl, "Nut 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Nut 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Nut 3", "ihg", 0.8E6 * scale_hsource) - - m.Source(pbl, "Washer 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Washer 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Washer 3", "ihg", 0.8E6 * scale_hsource) - - if use_block: - m.Weight(pbl, "Mirror", 1, 0., 1, 0., 1, 1., 1, 0., ensemble_size) - - slv = m.IterativeSolver(pbl, args.k, solverList, 4, ensemble_size) - - slv.start() - - if rank == 0: - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - -def evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable1, randomVariable2, randomVariable3, - scale_u, scale_T): - """ - This function loop over the ensemble sizes, - and the ensembles - """ - comm, rank, size = m.utilities.import_MPI() - small_disk_footprint = True - for ensemble_size in ensemble_sizes: - directory = str(ensemble_size) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - N_ensemble = int(np.floor(N // ensemble_size)) - - ensemble_index_min = 0 - for ensemble_index in range(ensemble_index_min, N_ensemble): - directory = str(ensemble_index) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - ensemble_index_start = ensemble_index * ensemble_size - ensemble_index_end = ensemble_index_start + ensemble_size - - randomVariable_cur1 = randomVariable1[ensemble_index_start: - ensemble_index_end] - - randomVariable_cur2 = randomVariable2[ensemble_index_start: - ensemble_index_end] - - randomVariable_cur3 = randomVariable3[ensemble_index_start: - ensemble_index_end] - - evaluate_one_ensemble(ensemble_size, - msh, - comm, - file_dir, - randomVariable_cur1, - randomVariable_cur2, - randomVariable_cur3, - scale_u, - scale_T, - small_disk_footprint=small_disk_footprint) - small_disk_footprint = True - os.chdir('..') - os.chdir('..') - - -def main(): - comm, rank, size = m.utilities.import_MPI() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - directory = 'MPI_' + str(size) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - mesh_name = 'fused_mirror_assembly_all_mm_part_' + str(size) + '.msh' - - msh = gmsh.MeshLoader(mesh_name, work_dir).execute(myrank=rank) - - scale_u_1 = 1000. - scale_u_2 = 1. - scale_u = scale_u_1 * scale_u_2 - scale_T = 1. - - scale_msh(msh, scale_u_2) - - N = 12 - id_case = 'Xiao' - - randomVariable_1, randomVariable_2, randomVariable_3 = random_case( - N, id_case) - - ensemble_size = int(os.getenv('ensemble_size', 1)) - - ensemble_sizes = [ensemble_size] - - N = len(randomVariable_1) - - evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable_1, randomVariable_2, - randomVariable_3, scale_u, scale_T) - - os.chdir('..') - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/tests/M1_assembly_fused_old.py b/katoptron/Juelich/tests/M1_assembly_fused_old.py deleted file mode 100644 index 4fc09811..00000000 --- a/katoptron/Juelich/tests/M1_assembly_fused_old.py +++ /dev/null @@ -1,568 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -import numpy as np -import shlex -import subprocess -import os -import tarfile -import glob - -from katoptron.Juelich.UQ.halton import * -from katoptron.Juelich.UQ.copulas import * - - -def irradiation(irradotion_index, p1=1., p3=1.95): - sigma_1_min = 0.1 - sigma_1_max = 0.1 - sigma_3_min = 0.05 - sigma_3_max = 0.05 - - sigma_1 = sigma_1_min + (sigma_1_max - sigma_1_min) * irradotion_index - sigma_3 = sigma_3_min + (sigma_3_max - sigma_3_min) * irradotion_index - - mode_min = 70 - mode_max = 180 - - mode_1 = mode_min + (mode_max - mode_min) * irradotion_index**p1 - mode_3 = mode_min + (mode_max - mode_min) * irradotion_index**p3 - - mu_1 = np.log(mode_1) # + sigma_1**2 - mu_3 = np.log(mode_3) # + sigma_3**2 - - return sigma_1, sigma_3, mode_1, mode_3, mu_1, mu_3 - - -def random_case(N, id_case): - comm, rank, siz = m.utilities.import_MPI() - np.random.seed(42) - - sigma = 0.15 - mode = 180 - mu = np.log(mode) + sigma**2 - - qMC = True - - if id_case == 'qMC 1': - n_rand = 2 - halton_points = np.zeros((n_rand, N)) - for i in range(0, N): - halton_points[:, i] = halton(i + 1, n_rand) - - randomVariable_halton = lognormal(halton_points, [mu, mu], - [sigma, sigma]) - randomVariable_1 = randomVariable_halton[0, :] - randomVariable_2 = randomVariable_halton[1, :] - randomVariable_3 = mode * np.ones((N, )) - elif id_case == 'MC 1': - randomVariable_1 = np.random.lognormal(mu, sigma, N) - randomVariable_2 = np.random.lognormal(mu, sigma, N) - randomVariable_3 = mode * np.ones((N, )) - elif id_case == 'qMC 2': - mode_min = 70 - mode_max = 180 - n_rand = 2 - halton_points = np.zeros((n_rand, N)) - for i in range(0, N): - halton_points[:, i] = halton(i, n_rand) - - randomVariable_halton = lognormal(halton_points, [mu, mu], - [sigma, sigma]) - randomVariable_1 = mode_min + (mode_max - - mode_min) * halton_points[0, :] - randomVariable_2 = mode_min + (mode_max - - mode_min) * halton_points[0, :] - randomVariable_3 = mode_min + (mode_max - - mode_min) * halton_points[1, :] - elif id_case == 'qMC 3': - from scipy.stats import lognorm - mode_min = 70 - mode_max = 180 - n_rand = 3 - halton_points = np.zeros((n_rand, N)) - - randomVariable_1 = np.zeros((N, )) - randomVariable_3 = np.zeros((N, )) - - for i in range(0, N): - halton_points[:, i] = halton(i + 1, n_rand) - sigma_1, sigma_3, mode_1, mode_3, mu_1, mu_3 = irradiation( - halton_points[0, i]) - randomVariable_1[i] = lognorm.ppf(halton_points[1, i], - sigma_1, - scale=np.exp(mu_1)) - randomVariable_3[i] = lognorm.ppf(halton_points[2, i], - sigma_3, - scale=np.exp(mu_3)) - - randomVariable_2 = randomVariable_1 - elif id_case == 'Xiao': - file_dir = os.path.dirname(__file__) - loaded = np.load(file_dir + '/../samples_files/Xiao_' + str(N) + - '.npz') - samples = loaded['samples'] - N = samples.shape[0] - weights = loaded['weights'] - randomVariable_1 = samples[0:N, 0] - randomVariable_3 = samples[0:N, 1] - randomVariable_2 = randomVariable_1 - - if rank == 0: - np.savetxt('randomVariable_1.txt', randomVariable_1) - np.savetxt('randomVariable_2.txt', randomVariable_2) - np.savetxt('randomVariable_3.txt', randomVariable_3) - - return randomVariable_1, randomVariable_2, randomVariable_3 - - -def material_option(option): - return int(option[-1]) - - -def clamping_option(option): - return str(option[0]) - - -def scale_msh(msh, scale): - for n in msh.nodes: - for i in range(0, 3): - n.pos[i] = n.pos[i] * scale - - -def tar_results(directory, filename, rank, all=False): - os.chdir(directory) - if rank == 0: - tf = tarfile.open(filename + ".tar.gz", mode="w:gz") - if all: - for file in glob.glob('*'): - if file.endswith(".tar.gz"): - print(file + ' is not included') - else: - tf.add(file) - else: - for file in glob.glob('r*.txt'): - tf.add(file) - for file in glob.glob('*/*/t*.txt'): - tf.add(file) - for file in glob.glob('*/*/b*.txt'): - tf.add(file) - for file in glob.glob('*/*/*.npz'): - tf.add(file) - for file in glob.glob('*/*/*.out'): - tf.add(file) - tf.close() - - -def evaluate_one_ensemble(ensemble_size, msh, comm, file_dir, randomVariable_1, - randomVariable_2, randomVariable_3, scale_u, - scale_T, option, baking=False): - - from fwk.wutils import parseargs - args = parseargs() - - from PyTrilinos import Teuchos - import numpy as np - - small_disk_footprint = False - use_block = True - - comm, rank, siz = m.utilities.import_MPI() - - solverList = Teuchos.ParameterList() - solverList['type'] = "BlockGmres" - - solverList['Maximum Iterations'] = 500 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = True - - solverList['Print Teuchos timers'] = True - solverList['Write txt files'] = True - if small_disk_footprint: - solverList['Write vtk files'] = False - - solverList['convert MueLu xml file'] = True - solverList["use xml file"] = True - - if use_block: - if ensemble_size >= 16 and siz == 2 and clamping_option(option) == "A": - solverList["Num Blocks"] = 150 - else: - solverList["Num Blocks"] = 200 - - solverList['Use blocked matrix'] = True - - solverList['Use blocked status test'] = True - solverList['Use blocked status test: x'] = True - solverList['Use blocked status test: T'] = True - solverList['Use weighted status test'] = True - - solverList['Ensemble Convergence Tolerance: T - relative'] = True - solverList['Ensemble Convergence Tolerance: x - relative'] = True - solverList[ - 'Ensemble Convergence Tolerance: T - relative full rhs'] = False - solverList[ - 'Ensemble Convergence Tolerance: x - relative full rhs'] = False - solverList[ - 'Ensemble Convergence Tolerance: weights - relative'] = False - - solverList['Ensemble Convergence Tolerance'] = 10**(-5) - solverList['Ensemble Convergence Tolerance: x'] = 10**(-6) - solverList['Ensemble Convergence Tolerance: T'] = 10**(-7) - solverList['Ensemble Convergence Tolerance: weights'] = 10**(-3) - - solverList[ - "MueLu xml file name"] = file_dir + '/../smoothers/AMG_BGS_gs_gs.xml' - else: - solverList['Ensemble Convergence Tolerance'] = 10**(-8) - solverList[ - "MueLu xml file name"] = file_dir + '/../smoothers/heat_no_contact_mtgs.xml' - - solverList["Scaled Block 0"] = True - pbl = m.Problem(msh, comm) - - # Distance in the mesh are represented in meters - - scale_E = 1. / scale_u**2 - scale_k = (scale_T / scale_u) - scale_hsource = 1. / scale_u**3 - scale_hflux = 1. / scale_u**2 - scale_d = scale_T - - # 379 000 MPa = 379 GPa = 379E9 Pa - E_rhodium = 379E9 * np.ones(ensemble_size) * scale_E - nu_rhodium = 0.26 * np.ones(ensemble_size) - # 0.150 kW/(m K) = 150 W/(m K) - k_rhodium = 150 * scale_k - d_rhodium = 0.781E-05 * scale_d - - E_WCu = 280E9 * np.ones(ensemble_size) * scale_E - nu_WCu = 0.26 * np.ones(ensemble_size) - k_WCu = 180 * scale_k - d_WCu = 0.88E-05 * scale_d - - E_SS = 180E9 * np.ones(ensemble_size) * scale_E - nu_SS = 0.26 * np.ones(ensemble_size) - k_SS = 20. * scale_k - d_SS = 1.57E-05 * scale_d - - E_CuCrZr = 130E9 * np.ones(ensemble_size) * scale_E - nu_CuCrZr = 0.26 * np.ones(ensemble_size) - k_CuCrZr = 280 * np.ones(ensemble_size) * scale_k - d_CuCrZr = 1.6E-05 * np.ones(ensemble_size) * scale_d - - E_AlN = 320E9 * np.ones(ensemble_size) * scale_E - nu_AlN = 0.24 * np.ones(ensemble_size) - k_AlN = 180 * np.ones(ensemble_size) * scale_k - d_AlN = 0.48E-05 * np.ones(ensemble_size) * scale_d - - E_I718 = 180E9 * np.ones(ensemble_size) * scale_E - nu_I718 = 0.26 * np.ones(ensemble_size) - k_I718 = 20. * scale_k - d_I718 = 1.4E-05 * scale_d - - T_ref = 22. - - m.Medium(pbl, "Mirror", "rhodium", E_rhodium, nu_rhodium, k_rhodium, - d_rhodium) - m.Medium(pbl, "Substrate", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - if material_option(option) == 1: - m.Medium(pbl, "Holder", "SS", E_SS, nu_SS, k_SS, d_SS) - elif material_option(option) == 2: - m.Medium(pbl, "Holder", "CuCrZr", E_CuCrZr, nu_CuCrZr, k_CuCrZr, - d_CuCrZr) - - m.Medium(pbl, "Washer 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Shaft 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Nut 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - ''' - m.Medium(pbl, "Spacer 1 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_1 * scale_k, d_AlN) - m.Medium(pbl, "Spacer 2 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_2 * scale_k, d_AlN) - m.Medium(pbl, "Spacer 3 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_3 * scale_k, d_AlN) - ''' - - m.Medium(pbl, "Spacer 1 part 1", "CuCrZr", E_CuCrZr, nu_AlN, - k_CuCrZr, d_CuCrZr) - m.Medium(pbl, "Spacer 2 part 1", "CuCrZr", E_CuCrZr, nu_AlN, - k_CuCrZr, d_CuCrZr) - m.Medium(pbl, "Spacer 3 part 1", "CuCrZr", E_CuCrZr, nu_AlN, - k_CuCrZr, d_CuCrZr) - - m.Medium(pbl, "Spacer 1 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 2 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 3 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - if clamping_option(option) == "A": - m.Dirichlet(pbl, "Holder z clamping", "Clamped", 0, 0., 0, 0., 1, 0., - 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder x-y clamping", "Clamped", 1, 0., 1, 0., 0, - 0., 0, 0., ensemble_size) - - elif clamping_option(option) == "B": - m.Dirichlet(pbl, "Holder x-y-z clamping point", "Clamped", 1, 0., 1, - 0., 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder z clamping point", "Clamped", 0, 0., 0, 0., - 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder z-y clamping point", "Clamped", 0, 0., 1, 0., - 1, 0., 0, 0., ensemble_size) - - m.Dirichlet(pbl, "Cooling channels", "Clamped", 0, 0., 0, 0., 0, 0., 1, - ((70. - T_ref) / scale_T), ensemble_size) - - if not baking: - zero = np.zeros(ensemble_size) - hf = 70. / 0.0121 * np.ones( - ensemble_size) * scale_hflux # 20 W / (0.0121 m^2) - - m.Neumann(pbl, "Mirror surface", "heat fluxes", 0, zero, 0, zero, 0, zero, - 1, hf, ensemble_size) - - m.Source(pbl, "Mirror", "ihg", 70E6 * scale_hsource) - m.Source(pbl, "Substrate", "ihg", 2.45E6 * scale_hsource) - - if material_option(option) == 1: - m.Source(pbl, "Holder", "ihg", 0.7E6 * scale_hsource) - elif material_option(option) == 2: - m.Source(pbl, "Holder", "ihg", 0.7E6 * scale_hsource) - - m.Source(pbl, "Spacer 1 part 1", "ihg", 0.7E6 * scale_hsource) - m.Source(pbl, "Spacer 2 part 1", "ihg", 0.7E6 * scale_hsource) - m.Source(pbl, "Spacer 3 part 1", "ihg", 0.7E6 * scale_hsource) - - m.Source(pbl, "Spacer 1 part 2", "ihg", 2.45E6 * scale_hsource) - m.Source(pbl, "Spacer 2 part 2", "ihg", 2.45E6 * scale_hsource) - m.Source(pbl, "Spacer 3 part 2", "ihg", 2.45E6 * scale_hsource) - - m.Source(pbl, "Shaft 1", "ihg", 0.7E6 * scale_hsource) - m.Source(pbl, "Shaft 2", "ihg", 0.7E6 * scale_hsource) - m.Source(pbl, "Shaft 3", "ihg", 0.7E6 * scale_hsource) - - m.Source(pbl, "Nut 1", "ihg", 0.7E6 * scale_hsource) - m.Source(pbl, "Nut 2", "ihg", 0.7E6 * scale_hsource) - m.Source(pbl, "Nut 3", "ihg", 0.7E6 * scale_hsource) - - m.Source(pbl, "Washer 1", "ihg", 0.7E6 * scale_hsource) - m.Source(pbl, "Washer 2", "ihg", 0.7E6 * scale_hsource) - m.Source(pbl, "Washer 3", "ihg", 0.7E6 * scale_hsource) - - if use_block: - m.Weight(pbl, "Mirror", 1, 0., 1, 0., 1, 1., 1, 0., ensemble_size) - - slv = m.IterativeSolver(pbl, args.k, solverList, 4, ensemble_size) - - slv.start() - - if rank == 0: - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - tag_name = "Mirror surface" - name_sol = "x_mm.txt" - DOFperNode = 4 - which_dof = 2 - - x, y, z, tri, dz = u.extract_2D(msh, tag_name, DOFperNode, which_dof, - ensemble_size, name_sol) - which_dof = 3 - x, y, z, tri, T = u.extract_2D(msh, tag_name, DOFperNode, which_dof, - ensemble_size, name_sol) - np.savez('mirror_data_' + str(rank), x=x, y=y, z=z, tri=tri, dz=dz, T=T) - - if rank == 0: - for i in range(1, siz): - data = comm.recv(source=i, tag=11) - else: - comm.send(1, dest=0, tag=11) - - if small_disk_footprint: - if rank == 0: - os.remove(name_sol) - - if rank == 0: - #OAX = msh.ntags["Optical Axis"].elems[0].nodes[0].pos[0] - #OAY = msh.ntags["Optical Axis"].elems[0].nodes[0].pos[1] - OAX, OAY = 0.0595, 0.017 - OAX = (OAX / scale_u) - OAY = (OAY / scale_u) - #OAX, OAY = 0.0595, 0.017 - for i in range(0, siz): - npzfile = np.load('mirror_data_' + str(i) + '.npz') - x_i = npzfile['x'] - y_i = npzfile['y'] - z_i = 0. * x_i - dz_i = npzfile['dz'] - tri_i = npzfile['tri'] - T_i = npzfile['T'] - if i == 0: - x = x_i - y = y_i - z = z_i - dz = dz_i - tri = tri_i - T = T_i - nNodes = len(x) - else: - x = np.append(x, x_i, axis=0) - y = np.append(y, y_i, axis=0) - z = np.append(z, z_i, axis=0) - dz = np.append(dz, dz_i, axis=0) - tri = np.append(tri, tri_i + nNodes, axis=0) - T = np.append(T, T_i, axis=0) - nNodes = len(x) - x = (x / scale_u) - y = (y / scale_u) - z = (z / scale_u) - dz = (dz / scale_u) - T = T * scale_T + T_ref - np.savez('mirror_data_all', x=x, y=y, z=z, tri=tri, dz=dz, T=T) - for i in range(0, ensemble_size): - optical_coefficients, dz_residual = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz[:, i], "m", np.array([OAX, OAY])) - np.savez('mirror_optical_results_' + str(i), - optical_coefficients=optical_coefficients, - dz_residual=dz_residual) - np.savetxt('mirror_optical_results_' + str(i) + '.out', - optical_coefficients) - - if small_disk_footprint: - if rank == 0: - for i in range(0, siz): - os.remove('mirror_data_' + str(i) + '.npz') - - -def evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable1, randomVariable2, randomVariable3, - scale_u, scale_T, option, baking=False): - """ - This function loop over the ensemble sizes, - and the ensembles - """ - for ensemble_size in ensemble_sizes: - directory = str(ensemble_size) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - N_ensemble = int(np.floor(N // ensemble_size)) - - ensemble_index_min = 0 - for ensemble_index in range(ensemble_index_min, N_ensemble): - directory = str(ensemble_index) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - ensemble_index_start = ensemble_index * ensemble_size - ensemble_index_end = ensemble_index_start + ensemble_size - - randomVariable_cur1 = randomVariable1[ensemble_index_start: - ensemble_index_end] - - randomVariable_cur2 = randomVariable2[ensemble_index_start: - ensemble_index_end] - - randomVariable_cur3 = randomVariable3[ensemble_index_start: - ensemble_index_end] - - evaluate_one_ensemble(ensemble_size, msh, comm, file_dir, - randomVariable_cur1, randomVariable_cur2, - randomVariable_cur3, scale_u, scale_T, option, baking) - os.chdir('..') - os.chdir('..') - - -def main(): - comm, rank, siz = m.utilities.import_MPI() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - directory = 'MPI_' + str(siz) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - mesh_name = 'fused_mirror_assembly_mm_part_' + str(siz) + '.msh' - - msh = gmsh.MeshLoader(mesh_name, work_dir).execute(myrank=rank) - - scale_u_1 = 1000. - scale_u_2 = 1. - scale_u = scale_u_1 * scale_u_2 - scale_T = 1. - - scale_msh(msh, scale_u_2) - - randomVariable_1 = np.array([180., 30.]) - randomVariable_2 = np.array([180., 30.]) - randomVariable_3 = np.array([180., 30.]) - - ensemble_size = int(os.getenv('ensemble_size', 1)) - - ensemble_sizes = [ensemble_size] - - N = 1 - - option = 'A1' - ''' - directory = 'A1_baking' - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable_1, randomVariable_2, - randomVariable_3, scale_u, scale_T, option, baking=True) - os.chdir('..') - ''' - directory = 'A1' - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable_1, randomVariable_2, - randomVariable_3, scale_u, scale_T, option, baking=False) - os.chdir('..') - ''' - option = 'B1' - - directory = 'B1_baking' - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable_1, randomVariable_2, - randomVariable_3, scale_u, scale_T, option, baking=True) - os.chdir('..') - - directory = 'B1' - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable_1, randomVariable_2, - randomVariable_3, scale_u, scale_T, option, baking=False) - os.chdir('..') - ''' - os.chdir('..') - - -if __name__ == "__main__": - main() diff --git a/katoptron/Juelich/tests/M1_assembly_fused_preload.py b/katoptron/Juelich/tests/M1_assembly_fused_preload.py deleted file mode 100644 index b5cbd209..00000000 --- a/katoptron/Juelich/tests/M1_assembly_fused_preload.py +++ /dev/null @@ -1,544 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -import numpy as np -import shlex -import subprocess -import os -import tarfile -import glob - -from katoptron.Juelich.UQ.halton import * -from katoptron.Juelich.UQ.copulas import * - - -def irradiation(irradotion_index, p1=1., p3=1.95): - sigma_1_min = 0.1 - sigma_1_max = 0.1 - sigma_3_min = 0.05 - sigma_3_max = 0.05 - - sigma_1 = sigma_1_min + (sigma_1_max - sigma_1_min) * irradotion_index - sigma_3 = sigma_3_min + (sigma_3_max - sigma_3_min) * irradotion_index - - mode_min = 70 - mode_max = 180 - - mode_1 = mode_min + (mode_max - mode_min) * irradotion_index**p1 - mode_3 = mode_min + (mode_max - mode_min) * irradotion_index**p3 - - mu_1 = np.log(mode_1) # + sigma_1**2 - mu_3 = np.log(mode_3) # + sigma_3**2 - - return sigma_1, sigma_3, mode_1, mode_3, mu_1, mu_3 - - -def random_case(N, id_case): - comm, rank, siz = m.utilities.import_MPI() - np.random.seed(42) - - sigma = 0.15 - mode = 180 - mu = np.log(mode) + sigma**2 - - qMC = True - - if id_case == 'qMC 1': - n_rand = 2 - halton_points = np.zeros((n_rand, N)) - for i in range(0, N): - halton_points[:, i] = halton(i + 1, n_rand) - - randomVariable_halton = lognormal(halton_points, [mu, mu], - [sigma, sigma]) - randomVariable_1 = randomVariable_halton[0, :] - randomVariable_2 = randomVariable_halton[1, :] - randomVariable_3 = mode * np.ones((N, )) - elif id_case == 'MC 1': - randomVariable_1 = np.random.lognormal(mu, sigma, N) - randomVariable_2 = np.random.lognormal(mu, sigma, N) - randomVariable_3 = mode * np.ones((N, )) - elif id_case == 'qMC 2': - mode_min = 70 - mode_max = 180 - n_rand = 2 - halton_points = np.zeros((n_rand, N)) - for i in range(0, N): - halton_points[:, i] = halton(i, n_rand) - - randomVariable_halton = lognormal(halton_points, [mu, mu], - [sigma, sigma]) - randomVariable_1 = mode_min + (mode_max - - mode_min) * halton_points[0, :] - randomVariable_2 = mode_min + (mode_max - - mode_min) * halton_points[0, :] - randomVariable_3 = mode_min + (mode_max - - mode_min) * halton_points[1, :] - elif id_case == 'qMC 3': - from scipy.stats import lognorm - mode_min = 70 - mode_max = 180 - n_rand = 3 - halton_points = np.zeros((n_rand, N)) - - randomVariable_1 = np.zeros((N, )) - randomVariable_3 = np.zeros((N, )) - - for i in range(0, N): - halton_points[:, i] = halton(i + 1, n_rand) - sigma_1, sigma_3, mode_1, mode_3, mu_1, mu_3 = irradiation( - halton_points[0, i]) - randomVariable_1[i] = lognorm.ppf(halton_points[1, i], - sigma_1, - scale=np.exp(mu_1)) - randomVariable_3[i] = lognorm.ppf(halton_points[2, i], - sigma_3, - scale=np.exp(mu_3)) - - randomVariable_2 = randomVariable_1 - elif id_case == 'Xiao': - file_dir = os.path.dirname(__file__) - loaded = np.load(file_dir + '/../samples_files/Xiao_' + str(N) + - '.npz') - samples = loaded['samples'] - N = samples.shape[0] - weights = loaded['weights'] - randomVariable_1 = samples[0:N, 0] - randomVariable_3 = samples[0:N, 1] - randomVariable_2 = randomVariable_1 - - if rank == 0: - np.savetxt('randomVariable_1.txt', randomVariable_1) - np.savetxt('randomVariable_2.txt', randomVariable_2) - np.savetxt('randomVariable_3.txt', randomVariable_3) - - return randomVariable_1, randomVariable_2, randomVariable_3 - - -def material_option(option): - return int(option[-1]) - - -def clamping_option(option): - return str(option[0]) - - -def scale_msh(msh, scale): - for n in msh.nodes: - for i in range(0, 3): - n.pos[i] = n.pos[i] * scale - - -def tar_results(directory, filename, rank, all=False): - os.chdir(directory) - if rank == 0: - tf = tarfile.open(filename + ".tar.gz", mode="w:gz") - if all: - for file in glob.glob('*'): - if file.endswith(".tar.gz"): - print(file + ' is not included') - else: - tf.add(file) - else: - for file in glob.glob('r*.txt'): - tf.add(file) - for file in glob.glob('*/*/t*.txt'): - tf.add(file) - for file in glob.glob('*/*/b*.txt'): - tf.add(file) - for file in glob.glob('*/*/*.npz'): - tf.add(file) - for file in glob.glob('*/*/*.out'): - tf.add(file) - tf.close() - - -def evaluate_one_ensemble(ensemble_size, msh, comm, file_dir, randomVariable_1, - randomVariable_2, randomVariable_3, scale_u, - scale_T, option, baking=False): - - from fwk.wutils import parseargs - args = parseargs() - - from PyTrilinos import Teuchos - import numpy as np - - small_disk_footprint = False - use_block = True - - comm, rank, siz = m.utilities.import_MPI() - - solverList = Teuchos.ParameterList() - solverList['type'] = "BlockGmres" - - solverList['Maximum Iterations'] = 500 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = True - - solverList['Print Teuchos timers'] = True - solverList['Write txt files'] = True - if small_disk_footprint: - solverList['Write vtk files'] = False - - solverList['convert MueLu xml file'] = True - solverList["use xml file"] = True - - if use_block: - if ensemble_size >= 16 and siz == 2 and clamping_option(option) == "A": - solverList["Num Blocks"] = 150 - else: - solverList["Num Blocks"] = 200 - - solverList['Use blocked matrix'] = True - - solverList['Use blocked status test'] = True - solverList['Use blocked status test: x'] = True - solverList['Use blocked status test: T'] = True - solverList['Use weighted status test'] = True - - solverList['Ensemble Convergence Tolerance: T - relative'] = True - solverList['Ensemble Convergence Tolerance: x - relative'] = True - solverList[ - 'Ensemble Convergence Tolerance: T - relative full rhs'] = False - solverList[ - 'Ensemble Convergence Tolerance: x - relative full rhs'] = False - solverList[ - 'Ensemble Convergence Tolerance: weights - relative'] = False - - solverList['Ensemble Convergence Tolerance'] = 10**(-5) - solverList['Ensemble Convergence Tolerance: x'] = 10**(-6) - solverList['Ensemble Convergence Tolerance: T'] = 10**(-7) - solverList['Ensemble Convergence Tolerance: weights'] = 10**(-3) - - solverList[ - "MueLu xml file name"] = file_dir + '/../smoothers/AMG_BGS_gs_gs.xml' - else: - solverList['Ensemble Convergence Tolerance'] = 10**(-8) - solverList[ - "MueLu xml file name"] = file_dir + '/../smoothers/heat_no_contact_mtgs.xml' - - solverList["Scaled Block 0"] = True - pbl = m.Problem(msh, comm) - - # Distance in the mesh are represented in meters - - scale_E = 1. / scale_u**2 - scale_k = (scale_T / scale_u) - scale_hsource = 1. / scale_u**3 - scale_hflux = 1. / scale_u**2 - scale_d = scale_T - - # 379 000 MPa = 379 GPa = 379E9 Pa - E_rhodium = 379E9 * np.ones(ensemble_size) * scale_E - nu_rhodium = 0.26 * np.ones(ensemble_size) - # 0.150 kW/(m K) = 150 W/(m K) - k_rhodium = 150 * scale_k - d_rhodium = 0.781E-05 * scale_d - - E_WCu = 280E9 * np.ones(ensemble_size) * scale_E - nu_WCu = 0.298 * np.ones(ensemble_size) - k_WCu = 180 * scale_k - d_WCu = 0.88E-05 * scale_d - - E_SS = 200E9 * np.ones(ensemble_size) * scale_E - nu_SS = 0.3 * np.ones(ensemble_size) - k_SS = 15.3 * scale_k - d_SS = 1.57E-05 * scale_d - - E_CuCrZr = 118E9 * np.ones(ensemble_size) * scale_E - nu_CuCrZr = 0.33 * np.ones(ensemble_size) - k_CuCrZr = 345 * np.ones(ensemble_size) * scale_k - d_CuCrZr = 1.8E-05 * np.ones(ensemble_size) * scale_d - - E_AlN = 320E9 * np.ones(ensemble_size) * scale_E - nu_AlN = 0.24 * np.ones(ensemble_size) - k_AlN = 180 * np.ones(ensemble_size) * scale_k - d_AlN = 0.48E-05 * np.ones(ensemble_size) * scale_d - - E_I718 = 183E9 * np.ones(ensemble_size) * scale_E - nu_I718 = 0.31 * np.ones(ensemble_size) - k_I718 = 15.8 * scale_k - d_I718 = 1.38E-05 * scale_d - - T_ref = 22. - - m.Medium(pbl, "Mirror", "rhodium", E_rhodium, nu_rhodium, k_rhodium, - d_rhodium) - m.Medium(pbl, "Substrate", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - if material_option(option) == 1: - m.Medium(pbl, "Holder", "SS", E_SS, nu_SS, k_SS, d_SS) - elif material_option(option) == 2: - m.Medium(pbl, "Holder", "CuCrZr", E_CuCrZr, nu_CuCrZr, k_CuCrZr, - d_CuCrZr) - - m.Medium(pbl, "Washer 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Washer 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Shaft 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Shaft 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Nut 1", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 2", "I718", E_I718, nu_I718, k_I718, d_I718) - m.Medium(pbl, "Nut 3", "I718", E_I718, nu_I718, k_I718, d_I718) - - m.Medium(pbl, "Spacer 1 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_1 * scale_k, d_AlN) - m.Medium(pbl, "Spacer 2 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_2 * scale_k, d_AlN) - m.Medium(pbl, "Spacer 3 part 1", "AlN", E_AlN, nu_AlN, - randomVariable_3 * scale_k, d_AlN) - - m.Medium(pbl, "Spacer 1 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 2 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - m.Medium(pbl, "Spacer 3 part 2", "WCu", E_WCu, nu_WCu, k_WCu, d_WCu) - - if clamping_option(option) == "A": - m.Dirichlet(pbl, "Holder z clamping", "Clamped", 0, 0., 0, 0., 1, 0., - 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder x-y clamping", "Clamped", 1, 0., 1, 0., 0, - 0., 0, 0., ensemble_size) - - elif clamping_option(option) == "B": - m.Dirichlet(pbl, "Holder x-y-z clamping point", "Clamped", 1, 0., 1, - 0., 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder z clamping point", "Clamped", 0, 0., 0, 0., - 1, 0., 0, 0., ensemble_size) - m.Dirichlet(pbl, "Holder z-y clamping point", "Clamped", 0, 0., 1, 0., - 1, 0., 0, 0., ensemble_size) - - m.Dirichlet(pbl, "Cooling channels", "Clamped", 0, 0., 0, 0., 0, 0., 1, - ((70. - T_ref) / scale_T), ensemble_size) - - if not baking: - zero = np.zeros(ensemble_size) - hf = 20. / 0.0121 * np.ones( - ensemble_size) * scale_hflux # 20 W / (0.0121 m^2) - - m.Neumann(pbl, "Mirror surface", "heat fluxes", 0, zero, 0, zero, 0, zero, - 1, hf, ensemble_size) - - m.Source(pbl, "Mirror", "ihg", 20E6 * scale_hsource) - m.Source(pbl, "Substrate", "ihg", 2.45E6 * scale_hsource) - - if material_option(option) == 1: - m.Source(pbl, "Holder", "ihg", 0.7E6 * scale_hsource) - elif material_option(option) == 2: - m.Source(pbl, "Holder", "ihg", 0.6E6 * scale_hsource) - - m.Source(pbl, "Spacer 1 part 1", "ihg", 0.3E6 * scale_hsource) - m.Source(pbl, "Spacer 2 part 1", "ihg", 0.3E6 * scale_hsource) - m.Source(pbl, "Spacer 3 part 1", "ihg", 0.3E6 * scale_hsource) - - m.Source(pbl, "Spacer 1 part 2", "ihg", 2.45E6 * scale_hsource) - m.Source(pbl, "Spacer 2 part 2", "ihg", 2.45E6 * scale_hsource) - m.Source(pbl, "Spacer 3 part 2", "ihg", 2.45E6 * scale_hsource) - - m.Source(pbl, "Shaft 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Shaft 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Shaft 3", "ihg", 0.8E6 * scale_hsource) - - m.Source(pbl, "Nut 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Nut 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Nut 3", "ihg", 0.8E6 * scale_hsource) - - m.Source(pbl, "Washer 1", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Washer 2", "ihg", 0.8E6 * scale_hsource) - m.Source(pbl, "Washer 3", "ihg", 0.8E6 * scale_hsource) - - if use_block: - m.Weight(pbl, "Mirror", 1, 0., 1, 0., 1, 1., 1, 0., ensemble_size) - - slv = m.IterativeSolver(pbl, args.k, solverList, 4, ensemble_size) - - slv.start() - - if rank == 0: - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - tag_name = "Mirror surface" - name_sol = "x_mm.txt" - DOFperNode = 4 - which_dof = 2 - - x, y, z, tri, dz = u.extract_2D(msh, tag_name, DOFperNode, which_dof, - ensemble_size, name_sol) - which_dof = 3 - x, y, z, tri, T = u.extract_2D(msh, tag_name, DOFperNode, which_dof, - ensemble_size, name_sol) - np.savez('mirror_data_' + str(rank), x=x, y=y, z=z, tri=tri, dz=dz, T=T) - - if rank == 0: - for i in range(1, siz): - data = comm.recv(source=i, tag=11) - else: - comm.send(1, dest=0, tag=11) - - if small_disk_footprint: - if rank == 0: - os.remove(name_sol) - - if rank == 0: - #OAX = msh.ntags["Optical Axis"].elems[0].nodes[0].pos[0] - #OAY = msh.ntags["Optical Axis"].elems[0].nodes[0].pos[1] - OAX, OAY = 0.0595, 0.017 - OAX = (OAX / scale_u) - OAY = (OAY / scale_u) - #OAX, OAY = 0.0595, 0.017 - for i in range(0, siz): - npzfile = np.load('mirror_data_' + str(i) + '.npz') - x_i = npzfile['x'] - y_i = npzfile['y'] - z_i = 0. * x_i - dz_i = npzfile['dz'] - tri_i = npzfile['tri'] - T_i = npzfile['T'] - if i == 0: - x = x_i - y = y_i - z = z_i - dz = dz_i - tri = tri_i - T = T_i - nNodes = len(x) - else: - x = np.append(x, x_i, axis=0) - y = np.append(y, y_i, axis=0) - z = np.append(z, z_i, axis=0) - dz = np.append(dz, dz_i, axis=0) - tri = np.append(tri, tri_i + nNodes, axis=0) - T = np.append(T, T_i, axis=0) - nNodes = len(x) - x = (x / scale_u) - y = (y / scale_u) - z = (z / scale_u) - dz = (dz / scale_u) - T = T * scale_T + T_ref - np.savez('mirror_data_all', x=x, y=y, z=z, tri=tri, dz=dz, T=T) - for i in range(0, ensemble_size): - optical_coefficients, dz_residual = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz[:, i], "m", np.array([OAX, OAY])) - np.savez('mirror_optical_results_' + str(i), - optical_coefficients=optical_coefficients, - dz_residual=dz_residual) - np.savetxt('mirror_optical_results_' + str(i) + '.out', - optical_coefficients) - - if small_disk_footprint: - if rank == 0: - for i in range(0, siz): - os.remove('mirror_data_' + str(i) + '.npz') - - -def evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable1, randomVariable2, randomVariable3, - scale_u, scale_T, option, baking=False): - """ - This function loop over the ensemble sizes, - and the ensembles - """ - for ensemble_size in ensemble_sizes: - directory = str(ensemble_size) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - N_ensemble = int(np.floor(N // ensemble_size)) - - ensemble_index_min = 0 - for ensemble_index in range(ensemble_index_min, N_ensemble): - directory = str(ensemble_index) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - ensemble_index_start = ensemble_index * ensemble_size - ensemble_index_end = ensemble_index_start + ensemble_size - - randomVariable_cur1 = randomVariable1[ensemble_index_start: - ensemble_index_end] - - randomVariable_cur2 = randomVariable2[ensemble_index_start: - ensemble_index_end] - - randomVariable_cur3 = randomVariable3[ensemble_index_start: - ensemble_index_end] - - evaluate_one_ensemble(ensemble_size, msh, comm, file_dir, - randomVariable_cur1, randomVariable_cur2, - randomVariable_cur3, scale_u, scale_T, option, baking) - os.chdir('..') - os.chdir('..') - - -def main(): - comm, rank, siz = m.utilities.import_MPI() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - directory = 'MPI_' + str(siz) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - mesh_name = 'fused_mirror_assembly_mm_part_' + str(siz) + '.msh' - - msh = gmsh.MeshLoader(mesh_name, work_dir).execute(myrank=rank) - - scale_u_1 = 1000. - scale_u_2 = 1. - scale_u = scale_u_1 * scale_u_2 - scale_T = 1. - - scale_msh(msh, scale_u_2) - - N = 20 - id_case = 'Xiao' - - randomVariable_1, randomVariable_2, randomVariable_3 = random_case( - N, id_case) - - ensemble_size = int(os.getenv('ensemble_size', 1)) - - ensemble_sizes = [ensemble_size] - - N = len(randomVariable_1) - - u.mkdir_MPI(option, comm, rank, size) - os.chdir(option) - - evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable_1, randomVariable_2, - randomVariable_3, scale_u, scale_T, option, baking=False) - os.chdir('..') - - option = 'B2' - - u.mkdir_MPI(option, comm, rank, size) - os.chdir(option) - - evaluate_all_ensembles(ensemble_sizes, N, msh, comm, file_dir, - randomVariable_1, randomVariable_2, - randomVariable_3, scale_u, scale_T, option, baking=False) - os.chdir('..') - - os.chdir('..') - - -if __name__ == "__main__": - main() diff --git a/katoptron/__init__.py b/katoptron/__init__.py deleted file mode 100644 index bd6e4779..00000000 --- a/katoptron/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8; -*- -# katoptron MODULE initialization file - - -import fwk -import tbox -try: - from katoptronw import * -except: - print('katoptronw is not imported, this build is only enough for python post processing') diff --git a/katoptron/_src/CMakeLists.txt b/katoptron/_src/CMakeLists.txt deleted file mode 100644 index d7fd03c0..00000000 --- a/katoptron/_src/CMakeLists.txt +++ /dev/null @@ -1,117 +0,0 @@ -# CMake input file of the SWIG wrapper around "katoptronw.so" - -INCLUDE(${SWIG_USE_FILE}) - -INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) - -FILE(GLOB SRCS *.h *.cpp *.inl *.swg) -FILE(GLOB ISRCS *.i) - -SET(CMAKE_SWIG_FLAGS "") -SET_SOURCE_FILES_PROPERTIES(${ISRCS} PROPERTIES CPLUSPLUS ON) - - -# -- Search for Trilinos -FIND_PACKAGE(Trilinos REQUIRED) -FIND_PACKAGE(MPI4PY REQUIRED) -#FIND_PACKAGE(NUMPY REQUIRED) - -set (_VERB 1) # set to 1 for debugging -IF(_VERB) - MESSAGE("\nFound MPI4PY! Here are the details: ") - MESSAGE(" MPI4PY_INCLUDE_DIR = ${MPI4PY_INCLUDE_DIR}") - MESSAGE(" TRILINOS_SOURCE_DIR = ${TEST_INCLUDE_DIR}") - MESSAGE("End of MPI4PY details\n") -ENDIF() - -# -------------------------------------------------------------- -# Finds MPI (including MSMPI) -# -------------------------------------------------------------- -if(WIN32) - FIND_PATH(MPI_INCLUDE_PATH NAMES mpi.h HINTS "$ENV{MSMPI_INC}") - if("${CMAKE_SIZEOF_VOID_P}" EQUAL 8) - set(MS_MPI_ARCH_DIR x64) - find_library(MPI_LIBRARIES msmpi PATHS "$ENV{MSMPI_LIB64}") - else() - set(MS_MPI_ARCH_DIR x86) - find_library(MPI_LIBRARIES msmpi PATHS "$ENV{MSMPI_LIB32}") - endif() -else() - find_package(MPI REQUIRED) - # intel mpi (mpi.h doit etre inclus avant stdio.h) - # ou definir ces 2 macros - ADD_DEFINITIONS(-DMPICH_IGNORE_CXX_SEEK -DMPICH_SKIP_MPICXX) -endif() -# -------------------------------------------------------------- - - -#Teuchos.i -#export TRILINOS_SOURCE_DIR=/Users/kliegeois/dev/Trilinos-master -#SET(TRILINOS_SOURCE_DIR /Users/kliegeois/dev/Trilinos-master) -#SET(TRILINOS_BUILD_DIR /Users/kliegeois/dev/TrilinosB) - -IF(1) -SET(SWINCFLAGS --I${PROJECT_SOURCE_DIR}/katoptron/src --I${PROJECT_SOURCE_DIR}/ext/amfe/tbox/src --I${PROJECT_SOURCE_DIR}/ext/amfe/tbox/_src --I${PROJECT_SOURCE_DIR}/ext/amfe/fwk/src --I${PROJECT_SOURCE_DIR}/ext/amfe/fwk/_src --I${MPI4PY_INCLUDE_DIR} --I${Trilinos_INCLUDE_DIRS} --I${TRILINOS_SOURCE_DIR}/packages/PyTrilinos/src --I${TRILINOS_SOURCE_DIR}/packages/teuchos/parameterlist/src --I${TRILINOS_BUILD_DIR}/packages/PyTrilinos/doc/Doxygen -) -ELSE() -SET(SWINCFLAGS --I${PROJECT_SOURCE_DIR}/katoptron/src --I${PROJECT_SOURCE_DIR}/ext/amfe/tbox/src --I${PROJECT_SOURCE_DIR}/ext/amfe/tbox/_src --I${PROJECT_SOURCE_DIR}/ext/amfe/fwk/src --I${PROJECT_SOURCE_DIR}/ext/amfe/fwk/_src --I${MPI4PY_INCLUDE_DIR} --I${Trilinos_INCLUDE_DIRS} -) -ENDIF() -# Teuchos.i -# Teuchos_dox.i - -SET_SOURCE_FILES_PROPERTIES(${ISRCS} PROPERTIES SWIG_FLAGS "${SWINCFLAGS}") - -SWIG_ADD_MODULE(katoptronw python ${ISRCS} ${SRCS}) -MACRO_DebugPostfix(_katoptronw) - -# --- - - -IF(1) -INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/katoptron/src - ${PROJECT_SOURCE_DIR}/ext/amfe/tbox/src - ${PROJECT_SOURCE_DIR}/ext/amfe/fwk/src - ${PROJECT_SOURCE_DIR}/ext/amfe/fwk/_src - ${PROJECT_SOURCE_DIR}/ext/amfe/tbox/_src - ${Trilinos_INCLUDE_DIRS} - ${Trilinos_TPL_INCLUDE_DIRS} - ${MPI_INCLUDE_PATH} - ${MPI4PY_INCLUDE_DIR} - ${TRILINOS_SOURCE_DIR}/packages/teuchos/parameterlist/src - ${TRILINOS_SOURCE_DIR}/packages/teuchos/core/src - ${TRILINOS_SOURCE_DIR}/packages/PyTrilinos/src - ${NUMPY_INCLUDE_DIR}) -ELSE() -INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/katoptron/src - ${PROJECT_SOURCE_DIR}/ext/amfe/tbox/src - ${PROJECT_SOURCE_DIR}/ext/amfe/fwk/src - ${Trilinos_INCLUDE_DIRS} - ${Trilinos_TPL_INCLUDE_DIRS} - ${MPI_INCLUDE_PATH} - ${MPI4PY_INCLUDE_DIR}) -ENDIF() -# numpy/arrayobject.h -SWIG_LINK_LIBRARIES(katoptronw - katoptron tbox fwk ${Trilinos_LIBRARIES} ${Trilinos_TPL_LIBRARIES} ${PYTHON_LIBRARIES} -) - -INSTALL(FILES ${CMAKE_SWIG_OUTDIR}/katoptronw.py DESTINATION ${CMAKE_INSTALL_PREFIX}) -INSTALL(TARGETS _katoptronw DESTINATION ${CMAKE_INSTALL_PREFIX}) diff --git a/katoptron/_src/katoptronw.i b/katoptron/_src/katoptronw.i deleted file mode 100644 index ef5cb1aa..00000000 --- a/katoptron/_src/katoptronw.i +++ /dev/null @@ -1,134 +0,0 @@ -// SWIG input file of the 'katoptron' module - -%feature("autodoc","1"); - -%module(docstring= -"'katoptronw' module: tests of Trilinos library -(c) ULg - A&M", -directors="1", -threads="1" -) katoptronw -%{ - -#include <string> -#include <sstream> -#include <typeinfo> -#include "katoptron.h" - -#include <mpi.h> -#include "Teuchos_ParameterList.hpp" - -#include "fwkw.h" -#include "tboxw.h" - -#include "DiscreteProblem.h" -#include "wProblem.h" -//#include "wSolver.h" -#include "wMedium.h" -#include "wDirichlet.h" -#include "wNeumann.h" -#include "wRandomVariable.h" -#include "wSource.h" -#include "wContact.h" -#include "wWeight.h" -#include "wDisplayHook.h" -#include "LinearSolver.h" -#include "IterativeSolver.h" - -#include <vector> - -#include "Kokkos_Init.h" - -#include "EnsembleReduction.h" - -//Fix for missing SWIGPY_SLICE_ARG with some versions of swig. -#if PY_VERSION_HEX >= 0x03020000 -# define SWIGPY_SLICE_ARG(obj) ((PyObject*) (obj)) -#else -# define SWIGPY_SLICE_ARG(obj) ((PySliceObject*) (obj)) -#endif - -%} - -%include "fwkw.swg" - -// ----------- MODULES UTILISES ------------ -%import "fwkw.i" -%import "tboxw.i" - - -// ----------- KATOPTRON CLASSES ---------------- - -// Instantiate some std templates - -%include mpi4py/mpi4py.i -%mpi4py_typemap(Comm, MPI_Comm); - -%feature("notabstract") MpiComm_int; -//%include Teuchos.i - - -//%teuchos_rcp_pydict_overrides(CONST, CLASS...); - -%include "katoptron.h" - -%shared_ptr(katoptron::Medium); -%shared_ptr(katoptron::Dirichlet); -%shared_ptr(katoptron::Neumann); -%shared_ptr(katoptron::RandomVariable); -%shared_ptr(katoptron::Contact); -%shared_ptr(katoptron::Weight); -%shared_ptr(katoptron::Source); -%shared_ptr(katoptron::Problem); - -%feature("director") DisplayHook; -%include "wDisplayHook.h" - -%feature("director:except") { - if ($error != NULL) { - std::cout << "[in director:except]\n"; - //throw Swig::DirectorMethodException(); - throw std::runtime_error("Director problem"); - } -} - -%include "wRandomVariable.h" - -%immutable katoptron::Problem::msh; // avoid the creation of the setter method -%include "wProblem.h" -//%include "wSolver.h" -%immutable katoptron::LinearSolver::tms; -%include "LinearSolver.h" -%include "IterativeSolver.h" - -%pythonappend katoptron::Medium::Medium "self.thisown=0" -%include "wMedium.h" -%pythonappend katoptron::Dirichlet::Dirichlet "self.thisown=0" -%include "wDirichlet.h" -%pythonappend katoptron::Neumann::Neumann "self.thisown=0" -%include "wNeumann.h" - -%pythonappend katoptron::Weight::Weight "self.thisown=0" -%include "wWeight.h" - -%pythonappend katoptron::Source::Source "self.thisown=0" -%include "wSource.h" -%pythonappend katoptron::Contact::Contact "self.thisown=0" -%include "wContact.h" - -%include "DiscreteProblem.h" -namespace katoptron { - %template(DiscreteProblem_d) DiscreteProblem<double>; -} - -%include "Kokkos_Init.h" -void Kokkos_Initialize(int nThreads); -void Kokkos_Finalize(void); - -%include "EnsembleReduction.h" -bool UseEnsembleReduction(); - -namespace std { - %template(std_vector_KatProblem) vector<katoptron::Problem*>; -} - diff --git a/katoptron/convergence.py b/katoptron/convergence.py deleted file mode 100644 index 2cc46f3d..00000000 --- a/katoptron/convergence.py +++ /dev/null @@ -1,335 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import numpy as np - -verb = False # set to True for (a lot of) debug info - -try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - siz = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() -except: - comm = None - rank = 0 - siz = 1 - name = "noname" - - -def enum(*sequential, **named): - enums = dict(list(zip(sequential, list(range(len(sequential))))), **named) - return type('Enum', (), enums) - - -tags = enum('READY', 'DONE', 'EXIT', 'START', 'WAKEUP', 'SUICIDE') - - -class Index_no_repetition_2: - def __init__(self, among_i): - self.among_i = among_i - self.n = len(among_i) - self.i = np.zeros((2,), dtype=int) - self.i_index = np.zeros((2,), dtype=int) - self.is_valid = True - for j in range(0, 2): - self.i_index[j] = j - self.i[j] = among_i[self.i_index[j]] - - def compute_next(self): - n = self.n - if self.i_index[1] < n-1: - self.i_index[1] = self.i_index[1]+1 - self.i[1] = self.among_i[self.i_index[1]] - else: - if self.i_index[0] < n-2: - self.i_index[0] = self.i_index[0]+1 - self.i_index[1] = self.i_index[0]+1 - for j in range(0, 2): - self.i[j] = self.among_i[self.i_index[j]] - else: - self.is_valid = False - return self.is_valid - - def get_i(self): - return self.i - - -class Index_no_repetition: - def __init__(self, k, n, n_0=0): - self.k = k - self.n = n - self.i = np.zeros((k,), dtype=int) - self.i_max = np.zeros((k,), dtype=int) - self.is_valid = True - for j in range(0, k): - self.i[j] = n_0+j - for j in range(0, k-1): - self.i_max[j] = self.i[j+1] - 1 - self.i_max[-1] = n - 1 - - def compute_next(self): - k = self.k - mask = (self.i < self.i_max-1) - tmp = np.argwhere(mask == True) - j = -1 - for i in range(0, k): - j = (1-mask[i])*j + mask[i]*i - if j == -1: - self.is_valid = False - else: - self.i[j:k] = self.i[j]+1+np.arange(0, k-j) - if j == 0: - j_1 = 0 - else: - j_1 = j - 1 - self.i_max[j_1:k-1] = self.i[j_1+1:k] - return self.is_valid - - def get_is_valid(self): - return self.is_valid - - def get_i(self): - return self.i - - -def compute_convergence(k_max, n, omegas, deltas, A, b, x0, verbose=False): - if siz > 1: - convergence = compute_convergence_mpi( - k_max, n, omegas, deltas, A, b, x0, verbose) - else: - convergence = compute_convergence_serial( - k_max, n, omegas, deltas, A, b, x0, verbose) - return convergence - - -def compute_sum_of_product_times_product(k, n, omegas, deltas): - i1 = Index_no_repetition(k, n) - results_sum = 0. - while True: - results_product_1 = 1. - results_product_2 = 1. - index = i1.get_i() - print(index) - results_product_1 = results_product_1 * np.prod(omegas[index]) - i2 = Index_no_repetition_2(index) - while True: - index2 = i2.get_i() - tmp = np.absolute(deltas[index2[0]]-deltas[index2[1]]) - results_product_2 = results_product_2 * tmp**2 - if not i2.compute_next(): - break - results_sum = results_sum + results_product_1 * results_product_2 - if not i1.compute_next(): - break - return results_sum - - -def compute_convergence_serial(k_max, n, omegas, deltas, A, b, x0, verbose): - convergence = np.ones((k_max,)) - convergence[0] = (np.linalg.norm(b - A.dot(x0)))**2 - old_sum = compute_sum_of_product_times_product(2, n, omegas, deltas) - convergence[1] = old_sum - for k in range(2, k_max): - new_sum = compute_sum_of_product_times_product(k+1, n, omegas, deltas) - convergence[k] = new_sum / old_sum - if verbose: - print(convergence) - old_sum = new_sum - return convergence - - -def compute_convergence_mpi(k_max, n, omegas, deltas, A, b, x0, verbose): - convergence = np.ones((k_max,)) - convergence[0] = (np.linalg.norm(b - A.dot(x0)))**2 - - if rank == 0: - master = Master() - old_sum = master.start(2, n, omegas, deltas) - convergence[1] = old_sum - else: - worker = Worker(rank) - worker.start() - - for k in range(2, k_max): - if rank == 0: - master = Master() - new_sum = master.start(k+1, n, omegas, deltas) - convergence[k] = new_sum / old_sum - old_sum = new_sum - if verbose: - print(convergence) - else: - worker = Worker(rank) - worker.start() - return convergence - - -class Job: - """ Class containing data transmitted between MPI procs - """ - - def __init__(self, omegas, deltas, index): - # input - self.omegas = omegas - self.deltas = deltas - self.index = index - # output - self.partial_sum = 0. - - def execute(self): - """ - [executed by worker processes] - solve a given job and calculate "partial_sum" - """ - results_product_1 = 1. - results_product_2 = 1. - results_product_1 = results_product_1 * \ - np.prod(self.omegas[self.index]) - i2 = Index_no_repetition_2(self.index) - while True: - index2 = i2.get_i() - tmp = np.absolute(self.deltas[index2[0]]-self.deltas[index2[1]]) - results_product_2 = results_product_2 * tmp**2 - if not i2.compute_next(): - break - self.partial_sum = self.partial_sum + results_product_1 * results_product_2 - - -class Master: - """ - MPI Process with rank #0 - """ - - def __init__(self): - self.slaves = list(range(1, siz)) - - def start(self, k, n, omegas, deltas): - """ - master loop - """ - global rank - if rank != 0: - raise Exception("this routine should be called with MPI rank=0") - if verb: - print("[%d] starting master" % rank) - - # ----------------------------------------- - - for s in self.slaves: - if verb: - print("[%d] sending wake-up signal to worker %d" % (rank, s)) - comm.send(None, dest=s, tag=tags.WAKEUP) - - ################################################# - - i1 = Index_no_repetition(k, n) - results_sum = 0 - - ################################################# - - num_workers = siz-1 - closed_workers = 0 - while closed_workers < num_workers: - # get a msg from any source - data = comm.recv(source=mpi.ANY_SOURCE, - tag=mpi.ANY_TAG, status=status) - source = status.Get_source() - tag = status.Get_tag() - if tag == tags.READY: - if verb: - print("[0] worker %d is ready" % source) - - ################################################# - - if i1.get_is_valid(): - job = Job(omegas, deltas, i1.get_i()) - - if verb: - print("[0] sending job to %d" % source) - comm.send(job, dest=source, tag=tags.START) - - # ------------------- - - i1.compute_next() - else: - - ################################################# - - if verb: - print("[%d] exit %d" % (rank, source)) - comm.send(None, dest=source, tag=tags.EXIT) - - elif tag == tags.DONE: - if verb: - print("[0] worker %d gives me its results" % source) - - ################################################# - results_sum = results_sum + data.partial_sum - ################################################# - - elif tag == tags.EXIT: - closed_workers += 1 - if verb: - print("[0] worker %d exited (%d worker(s) still running)" % ( - source, num_workers-closed_workers)) - - # ----------------------------------------- - - self.killslaves() - - return results_sum - - def killslaves(self): - global rank - for s in self.slaves: - if verb: - print("[%d] sending suicide job to %d" % (rank, s)) - comm.send(None, dest=s, tag=tags.SUICIDE) - - -class Worker: - """ - MPI Process with rank #1-#n - """ - - def __init__(self, rank): - self.rank = rank - - def start(self): - """ - worker loop - """ - if self.rank == 0: - raise Exception("this routine should be called with MPI rank!=0") - - if verb: - print("[%d] starting worker" % self.rank) - while True: - comm.recv(source=0, tag=mpi.ANY_TAG, status=status) - tag = status.Get_tag() - if tag == tags.WAKEUP: - if verb: - print("[%d] waking up" % self.rank) - while True: - comm.send(None, dest=0, tag=tags.READY) - job = comm.recv(source=0, tag=mpi.ANY_TAG, status=status) - tag = status.Get_tag() - if tag == tags.START: - if verb: - print("[%d] starting job" % self.rank) - job.execute() - if verb: - print("[%d] sending job results" % self.rank) - comm.send(job, dest=0, tag=tags.DONE) - elif tag == tags.EXIT: - if verb: - print("[%d] sending exit confirmation" % self.rank) - comm.send(None, dest=0, tag=tags.EXIT) - break - elif tag == tags.SUICIDE: - if verb: - print("[%d] I'm dying..." % self.rank) - break diff --git a/katoptron/eigenvalues.py b/katoptron/eigenvalues.py deleted file mode 100644 index ac08a75a..00000000 --- a/katoptron/eigenvalues.py +++ /dev/null @@ -1,637 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import numpy as np - -from scipy.linalg import eig - -tol = 1e-6 - - -class Gauss_Seidel: - def __init__(self, A, n=1, damping=1.): - from scipy.sparse import tril - from scipy.sparse import triu - from scipy.sparse import eye - from scipy.sparse import diags - - D = diags(A.diagonal(), 0) - E = -tril(A, -1) - F = -triu(A, 1) - - self.x = np.zeros((A.shape[0],)) - - self.M = (D-damping*E).tocsr() - self.N = damping*F+(1-damping)*D - self.damping = damping - self.n = n - - self.shape = [A.shape[0], A.shape[0]] - - def dot(self, b): - from scipy.sparse.linalg import spsolve_triangular - self.x = spsolve_triangular(self.M, self.damping*b) - for i in range(0, self.n-1): - self.x = spsolve_triangular( - self.M, self.N.dot(self.x)+self.damping*b) - return self.x - - -class SIMPLE_preconditioned_matrix: - def __init__(self, Q, invQ, G, GT, R, invR, omega=1.): - from scipy.sparse import diags - self.n1 = Q.shape[0] - self.n2 = G.shape[1] - - self.x = np.zeros((self.n1+self.n2,)) - self.x_tmp = np.zeros((self.n1+self.n2,)) - - self.omega = omega - - self.Q = Q - self.G = G - self.GT = GT - - self.R = R - - self.invQ = invQ - self.invR = invR - - Qdiag = Q.diagonal() - self.invD = diags(1 / Qdiag, 0) - - self.shape = [Q.shape[0]+G.shape[1], Q.shape[0]+G.shape[1]] - - def dot(self, b): - n1 = self.n1 - n2 = self.n2 - - self.x[0:n1] = self.invQ.dot(b[0:n1]) - self.x[n1:n1+n2] = self.invR.dot(b[n1:n1+n2]-self.GT.dot(self.x[0:n1])) - - self.x_tmp[0:n1] = self.x[0:n1] - self.omega * \ - self.invD.dot(self.G.dot(self.x[n1:n1+n2])) - self.x_tmp[n1:n1+n2] = self.omega*self.x[n1:n1+n2] - - self.x[0:n1] = self.Q.dot(self.x_tmp[0:n1]) + \ - self.G.dot(self.x_tmp[n1:n1+n2]) - self.x[n1:n1+n2] = self.GT.dot(self.x_tmp[0:n1]) - - return self.x - - -def read_mm(filename, ensemble_id=-1, is_sparse=True): - from scipy.sparse import csr_matrix - - X_dim = np.genfromtxt(filename, skip_header=1, max_rows=1) - m = X_dim[0].astype(int) - n = X_dim[1].astype(int) - - if is_sparse: - nnz = X_dim[2].astype(int) - if ensemble_id == -1: - # No ensemble typed data - X = np.loadtxt(filename, skiprows=2) - - row = X[:, 0].astype(int)-1 - col = X[:, 1].astype(int)-1 - data = X[:, 2] - - else: - # Ensemble typed data - X = np.genfromtxt(filename, skip_header=2, - usecols=(0, 1, 3+ensemble_id)) - - row = X[:, 0].astype(int)-1 - col = X[:, 1].astype(int)-1 - data = X[:, 2] - - mask = data != 0. - A = csr_matrix((data[mask], (row[mask], col[mask])), shape=(m, n)) - B = A.tocsc() - else: - X = np.loadtxt(filename, skiprows=2) - if n != 1: - B = X.reshape((m, n)).T - else: - B = X.reshape((m,)) - - return B - - -def create_block(A11, A12, A21, A22): - from scipy.sparse import bmat - A = bmat([[A11, A12], [A21, A22]]) - return A - - -def get_symmetrical_part(A): - A2 = A - tmp = A - A.T - A2[tmp != 0] = 0 - return A2 - - -def Schur_complement(GT, invQ, G): - R = -GT*invQ*G - return R - - -def approx_Schur_complement(Q, G, GT): - from scipy.sparse import diags - Qdiag = Q.diagonal() - invD = diags(1 / Qdiag, 0) - R = Schur_complement(GT, invD, G) - return R - - -def SIMPLE_prec(Q, invQ, G, GT, R, invR, use_invQG=False, omega=1.): - from scipy.sparse import eye - from scipy.sparse import diags - Qdiag = Q.diagonal() - invD = diags(1 / Qdiag, 0) - n1 = Q.shape[0] - n2 = R.shape[0] - if use_invQG: - print('Warning: use_invQG is OK in SIMPLE only if we use a direct solver for each block for now') - print('Warning: this returned the preconditioned matrix and not the preconditioner matrix') - GTinvQ = invQ.T - invP = create_block(eye(n1)-(eye(n1)-Q*invD)*G*invR * - GTinvQ, (eye(n1)-Q*invD)*G*invR, None, eye(n2)) - else: - B = create_block(eye(n1), -omega*invD*G, None, omega*eye(n2)) - invM = create_block(invQ, None, -invR*GT*invQ, invR) - invP = B*invM - - return invP - - -def compute_inv(A): - from scipy.sparse.linalg import inv - invA = inv(A) - return invA - - -def compute_inv_on_image(A, B): - # Compute the inverse of A applied on the image of B: - # invAB = A^{—1} * B - from scipy.sparse.linalg import spsolve - from scipy.sparse import issparse - - if issparse(B): - B2 = B.todense() - else: - B2 = B - - invAB = spsolve(A, B2) - return invAB - - -def compute_inv_GS(A, n, damping=1.): - from scipy.sparse import tril - from scipy.sparse import triu - from scipy.sparse import eye - from scipy.sparse import diags - from scipy.sparse import issparse - Adiag = A.diagonal() - D = diags(Adiag, 0) - E = -tril(A, -1) - F = -triu(A, 1) - - M = (D-damping*E).tocsc() - N = damping*F+(1-damping)*D - invM = compute_inv(M) - invMN = invM*N - invA = invM*damping - - invMN_pow = invMN - - for i in range(0, n-1): - invA = invA + invMN_pow*invM*damping - invMN_pow = invMN_pow * invMN - - return invA - - -def compute_VW(A, b, m=0, N=1): - from scipy.linalg import qr - n = A.shape[0] - - if m == 0: - m = n - - V = np.zeros((n, m)) - W = np.zeros((n, m)) - - tmp = b.reshape((n,)) - previous_vec = np.zeros((n,)) - V[:, 0] = tmp / np.linalg.norm(tmp) - previous_vec = A.dot(V[:, 0]) - W[:, 0] = previous_vec / np.linalg.norm(previous_vec) - - for i in range(1, m): - tmp = previous_vec - for j in range(0, i): - tmp = tmp - (np.inner(tmp, V[:, j])) * V[:, j] - norm = np.linalg.norm(tmp) - if norm <= tol: - m = i - break - tmp = tmp / norm - V[:, i] = tmp - previous_vec = A.dot(V[:, i]) - norm = np.linalg.norm(previous_vec) - W[:, i] = previous_vec / norm - V = V[:, 0:m] - W = W[:, 0:m] - - q, r = np.linalg.qr(W) - W = q - - for i_N in range(0, N): - q, r = np.linalg.qr(V) - V = q - if i_N != 0: - q, r = np.linalg.qr(W) - W = q - - product = np.dot(W.T, b) - - for i in range(0, len(product)): - if product[i] < 0: - W[:, i] = -W[:, i] - return V, W - - -def compute_V(A, b, m=0, N=0): - n = A.shape[0] - - if m == 0: - m = n - - V = np.zeros((n, m)) - - tmp = b.reshape((n,)) - V[:, 0] = tmp / np.linalg.norm(tmp) - for i in range(1, m): - tmp = A.dot(V[:, i-1]) - for j in range(0, i): - tmp = tmp - (np.inner(tmp, V[:, j])) * V[:, j] - norm = np.linalg.norm(tmp) - if norm <= tol: - m = i - break - else: - tmp = tmp / norm - V[:, i] = tmp - V = V[:, 0:m] - for i in range(0, N): - for i in range(1, m): - tmp = V[:, i] - for j in range(0, i): - tmp = tmp - (np.inner(tmp, V[:, j])) * V[:, j] - norm = np.linalg.norm(tmp) - if norm <= tol: - m = i - break - else: - tmp = tmp / norm - V[:, i] = tmp - V = V[:, 0:m] - return V - - -def compute_W(A, b, V, N=0): - from scipy.linalg import qr - n = V.shape[0] - m = V.shape[1] - tmp = A.dot(V[:, 0]) - W = np.zeros((n, m)) - - W[:, 0] = tmp / np.linalg.norm(tmp) - - for i in range(1, m): - tmp = A.dot(V[:, i]) - for j in range(0, i): - tmp = tmp - (np.inner(tmp, W[:, j])) * W[:, j] - norm = np.linalg.norm(tmp) - W[:, i] = tmp / norm - for i in range(0, N): - for i in range(1, m): - tmp = W[:, i] - for j in range(0, i): - tmp = tmp - (np.inner(tmp, W[:, j])) * W[:, j] - W[:, i] = tmp / np.linalg.norm(tmp) - - product = np.dot(W.T, b) - - for i in range(0, len(product)): - if product[i] < 0: - W[:, i] = -W[:, i] - - return W - - -def compute_eig_Q(V, W): - Q = np.dot(V.T, W) - a, Z = eig(Q) - - return a, Z - - -def compute_deltas_omegas(V, W, b): - import cmath - deltas, Z = compute_eig_Q(V, W) - omegas = np.zeros((Z.shape[1],)) - for i in range(0, len(omegas)): - tmp = cmath.polar(Z[0, i]) - omegas[i] = tmp[0]**2 - - return deltas, omegas - - -def eigenvalues_ZE(Q, invQ, G, GT, R, invR, use_invQG=False): - from scipy.sparse import diags - from scipy.sparse import issparse - Qdiag = Q.diagonal() - D = diags(1 / Qdiag, 0) - invD = diags(1/ Qdiag, 0) - n1 = Q.shape[0] - n2 = R.shape[0] - v = np.ones((n1+n2,), dtype=complex) - - J = invD*(D-Q) - if use_invQG: - invQG = invQ - else: - invQG = invQ*G - ZE = J*invQG*invR*GT - - if issparse(ZE): - ZE2 = ZE.todense() - else: - ZE2 = ZE - - a, V = eig(ZE2) - - v[0:n1] = a - - return v - - -def eigenvalues_SR(invQ, G, GT, R, use_invQG=False): - from scipy.sparse import issparse - n1 = invQ.shape[0] - n2 = R.shape[0] - v = np.ones((n1+n2,), dtype=complex) - - if use_invQG: - invQG = invQ - else: - invQG = invQ*G - - S = -GT*invQG - - if issparse(S): - S2 = S.todense() - else: - S2 = S - - if issparse(R): - R2 = R.todense() - else: - R2 = R - - a, V = eig(S2, R2) - - v[0:n2] = a - - return v - - -def compute_1_eigenvector_per_eigenvale(A, v): - from scipy.sparse.linalg import eigs - n = A.shape[0] - if len(v) != 1: - nv = v.shape[0] - else: - nv = 1 - - V = np.zeros((n, nv)) - b = np.zeros((n,)) - - for i in range(0, nv): - values, vectors = eigs(A, k=1, sigma=v[i].real) - V[:, i] = vectors.reshape((n,)) - - return V - - -def jacobi_iteration_matrix(A): - from scipy.sparse import diags - from scipy.sparse import eye - - diagA = A.diagonal() - invD = diags(1 / diagA, 0) - - jacobi_iteration_matrix = eye(A.shape[0]) - np.dot(invD, A) - return jacobi_iteration_matrix - - -def is_SPD(A, tol=1e-8): - # Linked to theorem 10.1.2 (p. 512 in Golub, Matrix Computation) - # if A is SPD, then GS converge for any initial guess - A = A.todense() - if not np.allclose(A, A.T, atol=tol): - return False - else: - try: - L = np.linalg.cholesky(A) - except: - return False - return True - - -def compute_eig_and_departure_from_orthogonality(A): - from numpy import linalg as LA - w, v = LA.eig(A) - cond = LA.cond(v) - return w, v, cond - - -def diagonal_dominance(A): - is_diagonal_dominance = True - for i in range(0, A.shape[0]): - diag = np.absolute(A[i, i]) - sum_row = np.sum(np.absolute(A[i, :])) - sum_row = sum_row - diag - if diag <= sum_row: - print(str(diag) + ' <= ' + str(sum_row) + ' at row ' + str(i)) - is_diagonal_dominance = False - break - return is_diagonal_dominance - - -def spectral_radius(A): - from scipy.sparse.linalg import eigs - w, v = eigs(A, k=10, which='LM') - - spectral_radius_A = np.absolute(w[0]) - return spectral_radius_A - - -def sparse_matrix_2_norm(A): - from scipy.sparse.linalg import svds - u, s, vt = svds(A, k=1) - norm_A = s[0] - return norm_A - - -def compute_theta(v): - import cmath - theta = np.zeros((len(v),)) - for x in range(len(v)): - tmp = cmath.polar(v[x]) - theta[x] = tmp[1] - return theta - - -def compute_cum_delta(theta, deltas, omegas, n): - theta_discrete = np.linspace(-np.pi, np.pi, n) - cum_delta = np.zeros((n,)) - deriv_delta = np.zeros((n,)) - cum_delta_omega = np.zeros((n,)) - deriv_delta_omega = np.zeros((n,)) - - n_theta = len(theta) - - first_index = 0 - second_index = 0 - for i in range(1, n): - for j in range(second_index, n_theta): - if theta_discrete[i] < theta[j]: - second_index = j - break - #indices = np.argwhere((theta_discrete[i-1] <= theta ) & (theta < theta_discrete[i])) - cum_delta[i] = cum_delta[i-1] + second_index-first_index - cum_delta_omega[i] = cum_delta_omega[i-1] + \ - np.sum(omegas[first_index:second_index]) - deriv_delta[i] = second_index-(first_index / (2*np.pi/n)) - deriv_delta_omega[i] = ( - np.sum(omegas[first_index:second_index])/ (2*np.pi/n)) - first_index = second_index - - percent_delta = (cum_delta / cum_delta[n-1]) - percent_delta_omega = (cum_delta_omega / cum_delta_omega[n-1]) - - return theta_discrete, cum_delta, deriv_delta, cum_delta_omega, deriv_delta_omega, percent_delta, percent_delta_omega - - -def write_eigenvalues(v, filename): - np.savetxt(filename, v, fmt='%f %f') - - -def write_eigenvectors(v, V, filename): - np.savetxt(filename+'_eigenvalues.txt', v, fmt='%f %f') - nv = V.shape[1] - for i in range(0, nv): - np.savetxt(filename+'_eigenvectors_'+str(i)+'.txt', V[:, i]) - - -def plot_eigenvalues_on_unit_circle(v): - import matplotlib.pyplot as plt - import cmath - fig = plt.figure() - ax = fig.add_subplot(111, projection='polar') - an = np.linspace(0, 2*np.pi, 100) - ax.plot(an, np.ones(an.shape), zorder=1) - for x in range(len(v)): - tmp = cmath.polar(v[x]) - r = tmp[0] - theta = tmp[1] - ax.plot(theta, r, 'ro', zorder=2) - ax.set_ylim(0, 1.5) - ax.grid(True) - - -def plot_eigenvalues_on_unit_circle_highlight(v, indices): - import matplotlib.pyplot as plt - import cmath - fig = plt.figure() - ax = fig.add_subplot(111, projection='polar') - an = np.linspace(0, 2*np.pi, 100) - ax.plot(an, np.ones(an.shape), zorder=1) - for x in range(len(v)): - tmp = cmath.polar(v[x]) - r = tmp[0] - theta = tmp[1] - if indices[x] == 0: - ax.plot(theta, r, 'go', alpha=0.3, zorder=2) - else: - ax.plot(theta, r, 'ro', zorder=10) - ax.set_ylim(0, 1.5) - ax.grid(True) - - -def plot_polar_function(theta, f, rho_min, rho_max): - import matplotlib.pyplot as plt - scale = (rho_max-rho_min) / np.max(f) - rho = rho_min + scale*f - plt.plot(theta, rho, zorder=3) - plt.ylim(0, rho_max+0.5) - - -def plot_omegas(v): - import matplotlib.pyplot as plt - plt.figure() - v = -np.sort(-v) - plt.semilogy(v) - plt.grid(True) - - -def plot_omegas_percent(v): - import matplotlib.pyplot as plt - plt.figure() - v = -np.sort(-v) - plt.plot(np.cumsum(v) / np.sum(v)) - plt.grid(True) - - -def main(): - filename = 'ApCTC_mm.txt' - Q = read_mm(filename) - filename = 'B_mm.txt' - GT = read_mm(filename) - G = GT.transpose() - - A = create_block(Q, G, GT, None) - - R = approx_Schur_complement(Q, G, GT) - - invQ = compute_inv(Q) - invR = compute_inv(R) - invP = SIMPLE_prec(Q, invQ, G, GT, R, invR) - - AinvP = (A*invP).todense() - - a, v = eig(AinvP) - - display = 1 - - if display: - import matplotlib.pyplot as plt - for x in range(len(a)): - plt.plot(a[x].real, a[x].imag, 'ro', label='python') - limit = np.max(np.ceil(np.absolute(a))) - plt.xlim((-limit, limit)) - plt.ylim((-limit, limit)) - plt.show() - - v2 = eigenvalues_SR(Q, invQ, G, GT, R, invR) - - write_eigenvalues(a, 'eigenvalues_direct_direct.txt') - write_eigenvalues(v2, 'eigenvalues_direct_direct_2.txt') - - -if __name__ == "__main__": - main() diff --git a/katoptron/exe/CMakeLists.txt b/katoptron/exe/CMakeLists.txt deleted file mode 100644 index d69d7975..00000000 --- a/katoptron/exe/CMakeLists.txt +++ /dev/null @@ -1,90 +0,0 @@ -# Example of compiled problem using "katoptron" - -FILE(GLOB SRCS *.h *.cpp *.inl *.hpp) - -ADD_EXECUTABLE(katoptron1 ${SRCS}) -MACRO_DebugPostfix(katoptron1) - - -# -- Search for Trilinos -FIND_PACKAGE(Trilinos REQUIRED) - -set (_VERB 0) # set to 1 for debugging -IF(_VERB) - MESSAGE("\nFound Trilinos! Here are the details: ") - MESSAGE(" Trilinos_DIR = ${Trilinos_DIR}") - MESSAGE(" Trilinos_VERSION = ${Trilinos_VERSION}") - MESSAGE(" Trilinos_PACKAGE_LIST = ${Trilinos_PACKAGE_LIST}") - MESSAGE(" Trilinos_LIBRARIES = ${Trilinos_LIBRARIES}") - MESSAGE(" Trilinos_INCLUDE_DIRS = ${Trilinos_INCLUDE_DIRS}") - MESSAGE(" Trilinos_LIBRARY_DIRS = ${Trilinos_LIBRARY_DIRS}") - MESSAGE(" Trilinos_TPL_LIST = ${Trilinos_TPL_LIST}") - MESSAGE(" Trilinos_TPL_INCLUDE_DIRS = ${Trilinos_TPL_INCLUDE_DIRS}") - MESSAGE(" Trilinos_TPL_LIBRARIES = ${Trilinos_TPL_LIBRARIES}") - MESSAGE(" Trilinos_TPL_LIBRARY_DIRS = ${Trilinos_TPL_LIBRARY_DIRS}") - MESSAGE(" Trilinos_BUILD_SHARED_LIBS = ${Trilinos_BUILD_SHARED_LIBS}") - MESSAGE("End of Trilinos details\n") -ENDIF() - -# MPI check -LIST(FIND Trilinos_TPL_LIST MPI MPI_List_ID) -IF (MPI_List_ID GREATER -1) - MESSAGE("-- Checking if MPI is enabled in Trilinos: MPI ENABLED") - SET(MYAPP_MPI TRUE) - ADD_DEFINITIONS(-DMYAPP_MPI) -ELSE() - MESSAGE("-- Checking if MPI is enabled in Trilinos: MPI NOT ENABLED") - SET(MYAPP_MPI FALSE) -ENDIF() - -# Set optional dependency in MyApp on Epetra package: -# this toggles code within #ifdef MYAPP_EPETRA -LIST(FIND Trilinos_PACKAGE_LIST Epetra Epetra_List_ID) -IF (Epetra_List_ID GREATER -1) - ADD_DEFINITIONS(-DMYAPP_EPETRA) - MESSAGE("-- Looking for Epetra: -- found, compiling with -DMYAPP_EPETRA") - SET(MYAPP_EPETRA TRUE) -ELSE() - MESSAGE("-- Looking for Epetra: -- not found.") - SET(MYAPP_EPETRA FALSE) -ENDIF() - -# -------------------------------------------------------------- -# Finds MPI (including MSMPI) -# -------------------------------------------------------------- -if(WIN32) - FIND_PATH(MPI_INCLUDE_PATH NAMES mpi.h HINTS "$ENV{MSMPI_INC}") - if("${CMAKE_SIZEOF_VOID_P}" EQUAL 8) - set(MS_MPI_ARCH_DIR x64) - find_library(MPI_LIBRARIES msmpi PATHS "$ENV{MSMPI_LIB64}") - else() - set(MS_MPI_ARCH_DIR x86) - find_library(MPI_LIBRARIES msmpi PATHS "$ENV{MSMPI_LIB32}") - endif() -else() - find_package(MPI REQUIRED) - # intel mpi (mpi.h doit etre inclus avant stdio.h) - # ou definir ces 2 macros - ADD_DEFINITIONS(-DMPICH_IGNORE_CXX_SEEK -DMPICH_SKIP_MPICXX) -endif() -# -------------------------------------------------------------- - -list(REMOVE_ITEM Trilinos_LIBRARIES pytrilinos) - -INCLUDE_DIRECTORIES( ${MPI_INCLUDE_PATH} - ${PROJECT_SOURCE_DIR}/katoptron/src - ${PROJECT_SOURCE_DIR}/ext/amfe/tbox/src - ${PROJECT_SOURCE_DIR}/ext/amfe/fwk/src - ${Trilinos_INCLUDE_DIRS} - ${Trilinos_TPL_INCLUDE_DIRS} - ) - -LINK_DIRECTORIES (${Trilinos_LIBRARY_DIRS} ${Trilinos_TPL_LIBRARY_DIRS}) - -TARGET_LINK_LIBRARIES( katoptron1 - katoptron - tbox - fwk - ${Trilinos_LIBRARIES} - ${Trilinos_TPL_LIBRARIES} - ${MPI_LIBRARIES}) \ No newline at end of file diff --git a/katoptron/exe/main.cpp b/katoptron/exe/main.cpp deleted file mode 100644 index b2e20672..00000000 --- a/katoptron/exe/main.cpp +++ /dev/null @@ -1,260 +0,0 @@ -#include "katoptron.h" -#include "wMshData.h" -#include "wProblem.h" -#include "wMedium.h" -#include "wDirichlet.h" -#include "wNeumann.h" -#include "wContact.h" -#include "IterativeSolver.h" -#include <mpi.h> - -#include "wGmshImport.h" -#include "wNode.h" -#include "DiscreteProblem.h" - -#include <iostream> -#include <cmath> - -#include <Teuchos_ParameterList.hpp> -#include <Teuchos_RCP.hpp> - -#include <stdlib.h> - -#include <xmmintrin.h> -#include <cmath> - -#include "Belos_Tpetra_MP_Vector.hpp" -#include "BelosLinearProblem.hpp" -#include "BelosPseudoBlockGmresSolMgr.hpp" - -#include "Kokkos_Init.h" - -const double pi = std::acos(-1); - -template <typename scalar> -void test_function(int ensemble_size) -{ - - typedef Tpetra::Vector<>::local_ordinal_type local_ordinal_type; - typedef Tpetra::Vector<>::global_ordinal_type global_ordinal_type; - - //typedef Tpetra::Map<> map_type; - //typedef Tpetra::Vector<>::scalar_type scalar_type; - //typedef Tpetra::Vector<>::mag_type magnitude_type; - typedef Tpetra::MultiVector<scalar, local_ordinal_type, global_ordinal_type> multivector_type; - //typedef Tpetra::CrsMatrix<scalar,local_ordinal_type,global_ordinal_type> crs_matrix_type; - //typedef Tpetra::CrsGraph<local_ordinal_type,global_ordinal_type> crs_graph_type; - //typedef Tpetra::Vector<scalar,local_ordinal_type,global_ordinal_type> vector_type; - - int worldsize; - MPI_Comm_size(MPI_COMM_WORLD, &worldsize); - - int myrank; - MPI_Comm_rank(MPI_COMM_WORLD, &myrank); - - int DOFperNode = 3; - - std::string mesh_name; - mesh_name = "cube.msh"; - - auto msh = std::make_shared<MshData>(); - auto gmshLoader = std::make_shared<GmshImport>(msh); - if (worldsize > 1) - gmshLoader->load(mesh_name, myrank); - else - gmshLoader->load(mesh_name, -1); - - //auto numNodes = msh->nodes.size(); - - katoptron::Problem pbl(msh, MPI_COMM_WORLD); - - double E_value = 21000.; - double nu_value = 0.29; - double k = 0.; - double d = 0.; - - std::vector<double> E, nu; - for (auto i = 0; i < ensemble_size; ++i) - { - E.push_back(E_value); - nu.push_back(nu_value); - } - - katoptron::Medium md0(pbl, std::string("Body 1"), std::string("Mat 1"), E, nu, k, d); - pbl.media[0] = &md0; - - std::vector<double> zero, dy; - for (auto i = 0; i < ensemble_size; ++i) - { - zero.push_back((double)0.); - dy.push_back((double)1.); - } - - katoptron::Dirichlet ud0(pbl, std::string("Surf 1 1"), std::string("Clamped 1"), 1, zero, 1, zero, 1, zero, 0, zero); - katoptron::Dirichlet ud1(pbl, std::string("Surf 1 2"), std::string("Clamped 1"), 0, zero, 1, dy, 0, zero, 0, zero); - - pbl.duBCs[0] = &ud0; - pbl.duBCs[1] = &ud1; - - Teuchos::ParameterList solverList; - - scalar tol = (scalar)1E-06; - solverList.set(std::string("Convergence Tolerance"), tol); - solverList.set(std::string("Maximum Iterations"), 1000); - solverList.set(std::string("Verbosity"), 33); - solverList.set(std::string("Flexible Gmres"), false); - solverList.set(std::string("Output Style"), 1); - solverList.set(std::string("Output Frequency"), 1); - //solverList.set(std::string("MueLu xml file name"), std::string("nested_multigrid_2_lvls.xml")); - solverList.set(std::string("Output Style"), 1); - //solverList.set(std::string("convert MueLu xml file"), true); - solverList.set(std::string("Use preconditioner"), false); - solverList.set(std::string("Maximum active set iteration"), 1); - solverList.set(std::string("type"), std::string("BlockGmres")); - - RCP<Teuchos::ParameterList> solverList2 = rcp(new Teuchos::ParameterList(solverList)); - - RCP<Teuchos::ParameterList> randomParams = rcp(new Teuchos::ParameterList()); - //katoptron::IterativeSolver slv(pbl, 1, solverList2, DOFperNode, (ensemble_size > 1), ensemble_size); - - auto begin = std::chrono::high_resolution_clock::now(); - - Kokkos::View<scalar *, Kokkos::LayoutLeft> a = Kokkos::View<scalar *, Kokkos::LayoutLeft>("KL Random Variables", 0); - katoptron::DiscreteProblem<scalar> discreteProblem(pbl, DOFperNode, randomParams, a); - - discreteProblem.computeMatrices(); - discreteProblem.computeLoads(); - - typedef multivector_type MV; - typedef typename multivector_type::dot_type belos_scalar; - typedef Tpetra::Operator<scalar> OP; - typedef Belos::LinearProblem<belos_scalar, MV, OP> BLinProb; - RCP<BLinProb> blinproblem = rcp(new BLinProb(discreteProblem.algebraic->matrices->K, discreteProblem.algebraic->vectors->x, discreteProblem.algebraic->vectors->b)); - blinproblem->setProblem(); - RCP<Teuchos::ParameterList> belosParams = rcp(new Teuchos::ParameterList(solverList)); - RCP<Belos::SolverManager<belos_scalar, MV, OP>> blinsolver = - rcp(new Belos::PseudoBlockGmresSolMgr<belos_scalar, MV, OP>(blinproblem, belosParams)); - //Belos::ReturnType ret = blinsolver->solve(); - blinsolver->solve(); - - auto end = std::chrono::high_resolution_clock::now(); - double total_time = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count(); - std::cout << ensemble_size << " " << total_time << " nanosec" << std::endl; -} - -template <typename scalar> -void test_function2(int ensemble_size) -{ - int worldsize; - MPI_Comm_size(MPI_COMM_WORLD, &worldsize); - - int myrank; - MPI_Comm_rank(MPI_COMM_WORLD, &myrank); - - int DOFperNode = 3; - - std::string mesh_name; - mesh_name = "cube.msh"; - - auto msh = std::make_shared<MshData>(); - auto gmshLoader = std::make_shared<GmshImport>(msh); - if (worldsize > 1) - gmshLoader->load(mesh_name, myrank); - else - gmshLoader->load(mesh_name, -1); - - //auto numNodes = msh->nodes.size(); - - katoptron::Problem pbl(msh, MPI_COMM_WORLD); - - double E_value = 21000.; - double nu_value = 0.29; - double k = 0.; - double d = 0.; - - std::vector<double> E, nu; - for (auto i = 0; i < ensemble_size; ++i) - { - E.push_back(E_value); - nu.push_back(nu_value); - } - - katoptron::Medium md0(pbl, std::string("Body 1"), std::string("Mat 1"), E, nu, k, d); - pbl.media[0] = &md0; - - std::vector<double> zero, dy; - for (auto i = 0; i < ensemble_size; ++i) - { - zero.push_back((double)0.); - dy.push_back((double)1.); - } - - katoptron::Dirichlet ud0(pbl, std::string("Surf 1 1"), std::string("Clamped 1"), 1, zero, 1, zero, 1, zero, 0, zero); - katoptron::Dirichlet ud1(pbl, std::string("Surf 1 2"), std::string("Clamped 1"), 0, zero, 1, dy, 0, zero, 0, zero); - - pbl.duBCs[0] = &ud0; - pbl.duBCs[1] = &ud1; - - Teuchos::ParameterList solverList; - - solverList.set(std::string("Ensemble Convergence Tolerance"), 1E-06); - solverList.set(std::string("Maximum Iterations"), 1000); - solverList.set(std::string("Verbosity"), 33); - solverList.set(std::string("Flexible Gmres"), false); - solverList.set(std::string("Output Style"), 1); - solverList.set(std::string("Output Frequency"), 1); - //solverList.set(std::string("MueLu xml file name"), std::string("nested_multigrid_2_lvls.xml")); - solverList.set(std::string("Output Style"), 1); - //solverList.set(std::string("convert MueLu xml file"), true); - solverList.set(std::string("Use preconditioner"), false); - solverList.set(std::string("Maximum active set iteration"), 1); - solverList.set(std::string("type"), std::string("BlockGmres")); - solverList.set(std::string("Write vtk files"), false); - - RCP<Teuchos::ParameterList> solverList2 = rcp(new Teuchos::ParameterList(solverList)); - katoptron::IterativeSolver slv(pbl, solverList2, DOFperNode, ensemble_size); - - auto begin2 = std::chrono::high_resolution_clock::now(); - slv.start(); - auto end2 = std::chrono::high_resolution_clock::now(); - double total_time2 = std::chrono::duration_cast<std::chrono::nanoseconds>(end2 - begin2).count(); - std::cout << ensemble_size << " " << total_time2 << " nanosec" << std::endl; -} - -int main(int argc, char **argv) -{ - size_t case_id, N, k; - if (argc > 1) - case_id = atoi(argv[1]); - else - case_id = 1; - - if (argc > 2) - N = atoi(argv[2]); - else - N = 1; - - if (argc > 3) - k = atoi(argv[3]); - else - k = 1; - - MPI_Init(NULL, NULL); - Kokkos_Initialize(k); - { - const int ensemble_size = 1; - typedef double scalar; - for (size_t i = 0; i < N; ++i) - { - std::cout << " ==================== " << std::endl; - std::cout << " =-- start test " << i << " --= " << std::endl; - std::cout << " ==================== " << std::endl; - if (case_id == 1) - test_function<scalar>(ensemble_size); - else - test_function2<scalar>(ensemble_size); - } - } - Kokkos_Finalize(); - MPI_Finalize(); -} diff --git a/katoptron/matlab/Belos/read_belos.m b/katoptron/matlab/Belos/read_belos.m deleted file mode 100644 index 6ec2699a..00000000 --- a/katoptron/matlab/Belos/read_belos.m +++ /dev/null @@ -1,40 +0,0 @@ -function [it, res] = read_belos(filename) - - it = []; - res = []; - - fid = fopen(filename); - - tline = fgetl(fid); - while ischar(tline) - current_length = length(tline); - if current_length > 5 - if tline(1:4) == 'Iter' - % get the iteration id - i_1 = 5; - i_2 = 5; - while tline(i_2) ~= ',' - i_2 = i_2+1; - end - it = [it, str2num(tline(i_1:i_2-1))]; - - % get the res - i_1 = i_2; - i_2 = current_length; - while tline(i_1) ~= ':' - i_1 = i_1+1; - end - res = [res, str2num(tline(i_1+1:i_2))]; - end - end - tline = fgetl(fid); - end - - figure - semilogy(it,res,'*') - grid on - box on - set(gca,'fontsize',18) - xlabel('Iteration') - ylabel('(2-Norm Res Vec) / (2-Norm Prec Res0)') -end \ No newline at end of file diff --git a/katoptron/matlab/Belos/test_belos.m b/katoptron/matlab/Belos/test_belos.m deleted file mode 100644 index 9242fbe4..00000000 --- a/katoptron/matlab/Belos/test_belos.m +++ /dev/null @@ -1,10 +0,0 @@ -clc -clear all -[it_0, res_0] = read_belos('belos_nu_0.txt'); -[it_m02, res_m02] = read_belos('belos_nu_m02.txt'); -close all -[it, res] = read_belos('belos_nu_02.txt'); -hold on -plot(it_0,res_0,'*g') -plot(it_m02,res_m02,'*r') - diff --git a/katoptron/matlab/Belos/test_belos2.m b/katoptron/matlab/Belos/test_belos2.m deleted file mode 100644 index a3b0bb19..00000000 --- a/katoptron/matlab/Belos/test_belos2.m +++ /dev/null @@ -1,41 +0,0 @@ -clc -clear all -[it_wo, res_wo] = read_belos('belos_without_prec.txt'); -[it_w, res_w] = read_belos('belos_with_prec.txt'); -close all - - -figure -semilogy(it_wo,res_wo,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r') -hold on -semilogy(it_w,res_w,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','g') -grid on -box on -set(gca,'fontsize',18) -xlabel('Iteration') -ylabel('(2-Norm Res Vec) / (2-Norm Prec Res0)') -hold off - -figure - -H = show_trilinos_graph('matrix_after_bc.text'); -figure -spy(H) - -H_sym = (H'+H)/2; -HH = H*H'; - -H_d_max = eigs(H, 1); -H_d_min = eigs(H, 1, 'sm'); - -H_sym_d_max = eigs(H_sym, 1); -H_sym_d_min = eigs(H_sym, 1, 'sm'); - -HH_d_max = eigs(HH, 1); -HH_d_min = eigs(HH, 1, 'sm'); \ No newline at end of file diff --git a/katoptron/matlab/Belos/test_belos3.m b/katoptron/matlab/Belos/test_belos3.m deleted file mode 100644 index 4ef5180c..00000000 --- a/katoptron/matlab/Belos/test_belos3.m +++ /dev/null @@ -1,41 +0,0 @@ -clc -clear all -[it_wo, res_wo] = read_belos('belos.txt'); -close all - - -figure -semilogy(it_wo,res_wo,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r') -grid on -box on -set(gca,'fontsize',18) -xlabel('Iteration') -ylabel('(2-Norm Res Vec) / (2-Norm Prec Res0)') - -figure - -H = show_trilinos_graph('matrix_after_bc.text'); -figure -spy(H) - -H_sym = (H'+H)/2; -HH = H*H'; - -H_d_max = eigs(H, 1); -H_d_min = eigs(H, 1, 'sm'); - -H_sym_d_max = eigs(H_sym, 1); -H_sym_d_min = eigs(H_sym, 1, 'sm'); - -HH_d_max = eigs(HH, 1); -HH_d_min = eigs(HH, 1, 'sm'); - -%% - -mu = H_sym_d_min; -sigma = sqrt(HH_d_max); - -rate = sqrt(1-mu^2/sigma^2) \ No newline at end of file diff --git a/katoptron/matlab/Belos/test_belos4.m b/katoptron/matlab/Belos/test_belos4.m deleted file mode 100644 index 88aa6664..00000000 --- a/katoptron/matlab/Belos/test_belos4.m +++ /dev/null @@ -1,84 +0,0 @@ -clc -clear all -[it_fg, res_fg] = read_belos('first_guess_belos_50it.text'); -[it_sg, res_sg] = read_belos('second_guess_belos_50it.text'); - -[it_e1, res_e1] = read_belos('ensemble1_guess_belos_50it.text'); -[it_e2, res_e2] = read_belos('ensemble2_guess_belos_50it.text'); -[it_e3, res_e3] = read_belos('ensemble3_guess_belos_50it.text'); -[it_e4, res_e4] = read_belos('ensemble4_guess_belos_50it.text'); -close all - - -figure -semilogy(it_fg, res_fg,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r') -hold on -semilogy(it_sg, res_sg,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','g') -grid on -box on -set(gca,'fontsize',18) -xlabel('Iteration') -ylabel('(2-Norm Res Vec) / (2-Norm Prec Res0)') - - -figure - -semilogy(it_fg, res_fg,'s','LineWidth',0.5,... - 'MarkerSize',8,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r') -hold on -semilogy(it_sg, res_sg,'s','LineWidth',0.5,... - 'MarkerSize',8,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','g') - -semilogy(it_e1, res_e1,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r') - -semilogy(it_e2, res_e2,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','y') -semilogy(it_e3, res_e3,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','b') -semilogy(it_e4, res_e4,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','g') - - -grid on -box on -set(gca,'fontsize',18) -xlabel('Iteration') -ylabel('(2-Norm Res Vec) / (2-Norm Prec Res0)') - -fg_sol = load('solution_first_guess.text'); -sg_sol = load('solution_second_guess.text'); - -e1_sol = load('solution_e1_50it.text'); -e2_sol = load('solution_e2_50it.text'); -e3_sol = load('solution_e3_50it.text'); -e4_sol = load('solution_e4_50it.text'); - -%% -clc -max(abs(e1_sol(:,1)-fg_sol)) -max(abs(e1_sol(:,2)-fg_sol)) -max(abs(e2_sol(:,1)-fg_sol)) -max(abs(e2_sol(:,2)-sg_sol)) -max(abs(e3_sol(:,1)-sg_sol)) -max(abs(e3_sol(:,2)-fg_sol)) -max(abs(e4_sol(:,1)-sg_sol)) -max(abs(e4_sol(:,2)-sg_sol)) \ No newline at end of file diff --git a/katoptron/matlab/Belos/test_belos5.m b/katoptron/matlab/Belos/test_belos5.m deleted file mode 100644 index 5e73867a..00000000 --- a/katoptron/matlab/Belos/test_belos5.m +++ /dev/null @@ -1,43 +0,0 @@ -clc -clear all -[it_fg, res_fg] = read_belos('low_frequence_belos.text'); -[it_fgw, res_fgw] = read_belos('low_frequence_w_noise_belos.text'); -[it_sg, res_sg] = read_belos('high_frequence_belos.text'); -[it_sgw, res_sgw] = read_belos('high_frequence_w_noise_belos.text'); -[it_tg, res_tg] = read_belos('low_and_high_frequence_belos.text'); -[it_tgw, res_tgw] = read_belos('low_and_high_frequence_w_noise_belos.text'); -close all - - -figure -semilogy(it_fg, res_fg,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r') -hold on -semilogy(it_fgw, res_fgw,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','r',... - 'MarkerFaceColor','r') -semilogy(it_sg, res_sg,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','g') -semilogy(it_sgw, res_sgw,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','g',... - 'MarkerFaceColor','g') -semilogy(it_tg, res_tg,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','b') -semilogy(it_tgw, res_tgw,'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor','b') -grid on -box on -set(gca,'fontsize',18) -xlabel('Iteration') -ylabel('(2-Norm Res Vec) / (2-Norm Prec Res0)') - diff --git a/katoptron/matlab/Belos/test_belos6.m b/katoptron/matlab/Belos/test_belos6.m deleted file mode 100644 index cbad3c02..00000000 --- a/katoptron/matlab/Belos/test_belos6.m +++ /dev/null @@ -1,76 +0,0 @@ -close all -clc -clear all -[it_1g, res_1g] = read_belos('multi_low_frequence_belos.text'); -[it_2g, res_2g] = read_belos('multi_high_frequence_belos.text'); - -[it_3g, res_3g] = read_belos('multi_low_frequence_belos2.text'); -[it_4g, res_4g] = read_belos('multi_high_frequence_belos2.text'); -[it_5g, res_5g] = read_belos('multiFGuess_belos.text'); -[it_6g, res_6g] = read_belos('multiF2Guess_belos.text'); - -[it_1e, res_1e] = read_belos('multi_frequence_ensemble1_belos.text'); -[it_2e, res_2e] = read_belos('multi_frequence_ensemble2_belos.text'); - -[it_3e, res_3e] = read_belos('multi_frequence_ensemble3_belos.text'); -[it_4e, res_4e] = read_belos('multi_frequence_ensemble4_belos.text'); - - -%% -close all -figure -semilogy(it_1g, res_1g,'o','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r') -hold on -semilogy(it_2g, res_2g,'o','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','g') -semilogy(it_3g, res_3g,'s','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r') -semilogy(it_4g, res_4g,'s','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','g') -semilogy(it_5g, res_5g,'s','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','b') -grid on -box on -set(gca,'fontsize',18) -xlabel('Iteration') -ylabel('(2-Norm Res Vec) / (2-Norm Prec Res0)') -hold off - -figure -semilogy(it_1g, res_1g,'r','LineWidth',2) -hold on -semilogy(it_2g, res_2g,'g','LineWidth',2) -semilogy(it_1e, res_1e,'o','LineWidth',0.5,... - 'MarkerSize',16,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r') -semilogy(it_2e, res_2e,'o','LineWidth',0.5,... - 'MarkerSize',16,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','g') -semilogy(it_3e, res_3e,'s','LineWidth',0.5,... - 'MarkerSize',8,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r') -semilogy(it_4e, res_4e,'s','LineWidth',0.5,... - 'MarkerSize',8,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','g') - -grid on -box on -set(gca,'fontsize',18) -xlabel('Iteration') -ylabel('(2-Norm Res Vec) / (2-Norm Prec Res0)') -hold off diff --git a/katoptron/matlab/Belos/test_belos7.m b/katoptron/matlab/Belos/test_belos7.m deleted file mode 100644 index fc0df419..00000000 --- a/katoptron/matlab/Belos/test_belos7.m +++ /dev/null @@ -1,204 +0,0 @@ -close all -clc -clear all - -Afull = load('matrixA.txt'); -A = sparse(Afull); - -b = load('vector_after_bc.text'); - -if size(b,2) == 2 - b = b(:,1); -end - -solution_1it_ensemble1 = load('multi_frequence_ensemble1_belos_1it_solution.text'); -solution_1it_ensemble2 = load('multi_frequence_ensemble2_belos_1it_solution.text'); -solution_1it_ensemble3 = load('multi_frequence_ensemble3_belos_1it_solution.text'); -solution_1it_ensemble4 = load('multi_frequence_ensemble4_belos_1it_solution.text'); - -guess_ensemble1 = load('multi_frequence_ensemble1_guess.text'); -guess_ensemble2 = load('multi_frequence_ensemble2_guess.text'); -guess_ensemble3 = load('multi_frequence_ensemble3_guess.text'); -guess_ensemble4 = load('multi_frequence_ensemble4_guess.text'); - -[it_1e, res_1e] = read_belos('multi_frequence_ensemble1_belos_1it.text'); -[it_2e, res_2e] = read_belos('multi_frequence_ensemble2_belos_1it.text'); - -[it_3e, res_3e] = read_belos('multi_frequence_ensemble3_belos_1it.text'); -[it_4e, res_4e] = read_belos('multi_frequence_ensemble4_belos_1it.text'); - - -%% -close all -figure -semilogy(it_1e, res_1e,'o','LineWidth',0.5,... - 'MarkerSize',16,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r') -hold on -semilogy(it_2e, res_2e,'o','LineWidth',0.5,... - 'MarkerSize',16,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','g') -semilogy(it_3e, res_3e,'s','LineWidth',0.5,... - 'MarkerSize',8,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r') -semilogy(it_4e, res_4e,'s','LineWidth',0.5,... - 'MarkerSize',8,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','g') - -grid on -box on -set(gca,'fontsize',18) -xlabel('Iteration') -ylabel('(2-Norm Res Vec) / (2-Norm Prec Res0)') -hold off - -%% -format long -solution_1it_ensemble1_1 = solution_1it_ensemble1(:,1); -solution_1it_ensemble1_2 = solution_1it_ensemble1(:,2); - -solution_1it_ensemble2_1 = solution_1it_ensemble2(:,1); -solution_1it_ensemble2_2 = solution_1it_ensemble2(:,2); - -solution_1it_ensemble3_1 = solution_1it_ensemble3(:,1); -solution_1it_ensemble3_2 = solution_1it_ensemble3(:,2); - -solution_1it_ensemble4_1 = solution_1it_ensemble4(:,1); -solution_1it_ensemble4_2 = solution_1it_ensemble4(:,2); - -guess_ensemble5 = guess_ensemble2; -solution_1it_ensemble5 = [solution_1it_ensemble1(:,1),solution_1it_ensemble4(:,2)]; - -norm_r0 = zeros(5,3); - -norm_r0(1,1) = norm(b-A*guess_ensemble1(:,1)); -norm_r0(1,2) = norm(b-A*guess_ensemble1(:,2)); - -norm_r0(2,1) = norm(b-A*guess_ensemble2(:,1)); -norm_r0(2,2) = norm(b-A*guess_ensemble2(:,2)); - -norm_r0(3,1) = norm(b-A*guess_ensemble3(:,1)); -norm_r0(3,2) = norm(b-A*guess_ensemble3(:,2)); - -norm_r0(4,1) = norm(b-A*guess_ensemble4(:,1)); -norm_r0(4,2) = norm(b-A*guess_ensemble4(:,2)); - -norm_r0(5,1) = norm(b-A*guess_ensemble5(:,1)); -norm_r0(5,2) = norm(b-A*guess_ensemble5(:,2)); - -for i=1:5 - norm_r0(i,3) = sqrt(norm_r0(i,1)^2+norm_r0(i,2)^2); -end - -norm_1it = zeros(5,3); - -norm_1it(1,1) = norm(b-A*solution_1it_ensemble1_1); -norm_1it(1,2) = norm(b-A*solution_1it_ensemble1_2); - -norm_1it(2,1) = norm(b-A*solution_1it_ensemble2_1); -norm_1it(2,2) = norm(b-A*solution_1it_ensemble2_2); - -norm_1it(3,1) = norm(b-A*solution_1it_ensemble3_1); -norm_1it(3,2) = norm(b-A*solution_1it_ensemble3_2); - -norm_1it(4,1) = norm(b-A*solution_1it_ensemble4_1); -norm_1it(4,2) = norm(b-A*solution_1it_ensemble4_2); - -norm_1it(5,1) = norm(b-A*solution_1it_ensemble5(:,1)); -norm_1it(5,2) = norm(b-A*solution_1it_ensemble5(:,2)); - -for i=1:5 - norm_1it(i,3) = sqrt(norm_1it(i,1)^2+norm_1it(i,2)^2); -end - -ratio_1it_r0 = zeros(5,4); -for i=1:5 - ratio_1it_r0(i,1:3) = norm_1it(i,:)./norm_r0(i,:); -end - -ratio_1it_r0(1:4,4) = [res_1e(end);res_2e(end);res_3e(end);res_4e(end)]; - -clc -norm_r0 -norm_1it -ratio_1it_r0 - -c_1 = zeros(5,3); -max_abs_error = zeros(5,3); - -for i =1:2 - r0 = b-A*guess_ensemble1(:,i); - %r0 = r0 /norm(r0); - c_1(1,i) = r0'*(solution_1it_ensemble1(:,i)-guess_ensemble1(:,i))/norm(r0)^2; - max_abs_error(1,i) = max(abs(guess_ensemble1(:,i)+c_1(1,i)*r0-solution_1it_ensemble1(:,i))); -end - -guess = [guess_ensemble1(:,1);guess_ensemble1(:,2)]; -r0 = [b-A*guess_ensemble1(:,1);b-A*guess_ensemble1(:,2)]; -sol = [solution_1it_ensemble1(:,1);solution_1it_ensemble1(:,2)]; -%r0 = r0 /norm(r0); -c_1(1,3) = r0'*(sol-guess)/norm(r0)^2; -max_abs_error(1,3) = max(abs(guess+c_1(1,3)*r0-sol)); - -for i =1:2 - r0 = b-A*guess_ensemble2(:,i); - %r0 = r0 /norm(r0); - c_1(2,i) = r0'*(solution_1it_ensemble2(:,i)-guess_ensemble2(:,i))/norm(r0)^2; - max_abs_error(2,i) = max(abs(guess_ensemble2(:,i)+c_1(2,i)*r0-solution_1it_ensemble2(:,i))); -end - -guess = [guess_ensemble2(:,1);guess_ensemble2(:,2)]; -r0 = [b-A*guess_ensemble2(:,1);b-A*guess_ensemble2(:,2)]; -sol = [solution_1it_ensemble2(:,1);solution_1it_ensemble2(:,2)]; -%r0 = r0 /norm(r0); -c_1(2,3) = r0'*(sol-guess)/norm(r0)^2; -max_abs_error(2,3) = max(abs(guess+c_1(2,3)*r0-sol)); - -for i =1:2 - r0 = b-A*guess_ensemble3(:,i); - %r0 = r0 /norm(r0); - c_1(3,i) = r0'*(solution_1it_ensemble3(:,i)-guess_ensemble3(:,i))/norm(r0)^2; - max_abs_error(3,i) = max(abs(guess_ensemble3(:,i)+c_1(3,i)*r0-solution_1it_ensemble3(:,i))); -end - -guess = [guess_ensemble3(:,1);guess_ensemble3(:,2)]; -r0 = [b-A*guess_ensemble3(:,1);b-A*guess_ensemble3(:,2)]; -sol = [solution_1it_ensemble3(:,1);solution_1it_ensemble3(:,2)]; -%r0 = r0 /norm(r0); -c_1(3,3) = r0'*(sol-guess)/norm(r0)^2; -max_abs_error(3,3) = max(abs(guess+c_1(3,3)*r0-sol)); - -for i =1:2 - r0 = b-A*guess_ensemble4(:,i); - %r0 = r0 /norm(r0); - c_1(4,i) = r0'*(solution_1it_ensemble4(:,i)-guess_ensemble4(:,i))/norm(r0)^2; - max_abs_error(4,i) = max(abs(guess_ensemble4(:,i)+c_1(4,i)*r0-solution_1it_ensemble4(:,i))); -end - -guess = [guess_ensemble4(:,1);guess_ensemble4(:,2)]; -r0 = [b-A*guess_ensemble4(:,1);b-A*guess_ensemble4(:,2)]; -sol = [solution_1it_ensemble4(:,1);solution_1it_ensemble4(:,2)]; -%r0 = r0 /norm(r0); -c_1(4,3) = r0'*(sol-guess)/norm(r0)^2; -max_abs_error(4,3) = max(abs(guess+c_1(4,3)*r0-sol)); - -for i =1:2 - r0 = b-A*guess_ensemble5(:,i); - %r0 = r0 /norm(r0); - c_1(5,i) = r0'*(solution_1it_ensemble5(:,i)-guess_ensemble5(:,i))/norm(r0)^2; - max_abs_error(5,i) = max(abs(guess_ensemble5(:,i)+c_1(5,i)*r0-solution_1it_ensemble5(:,i))); -end - -guess = [guess_ensemble5(:,1);guess_ensemble5(:,2)]; -r0 = [b-A*guess_ensemble5(:,1);b-A*guess_ensemble5(:,2)]; -sol = [solution_1it_ensemble5(:,1);solution_1it_ensemble5(:,2)]; -%r0 = r0 /norm(r0); -c_1(5,3) = r0'*(sol-guess)/norm(r0)^2; -max_abs_error(5,3) = max(abs(guess+c_1(5,3)*r0-sol)); - -c_1 -max_abs_error \ No newline at end of file diff --git a/katoptron/matlab/Belos/test_belos8.m b/katoptron/matlab/Belos/test_belos8.m deleted file mode 100644 index a157e5f1..00000000 --- a/katoptron/matlab/Belos/test_belos8.m +++ /dev/null @@ -1,25 +0,0 @@ -%close all -clc -clear all - -[it_1g, res_1g] = read_belos('multiFGuess_belos.text'); -[it_2g, res_2g] = read_belos('multiFGuess_belos_preconditioned.text'); - -%% -close all -figure -semilogy(it_1g, res_1g,'o','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r') -hold on -semilogy(it_2g, res_2g,'o','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','g') -grid on -box on -set(gca,'fontsize',18) -xlabel('Iteration') -ylabel('(2-Norm Res Vec) / (2-Norm Prec Res0)') -hold off diff --git a/katoptron/matlab/CPU statistic/amesos2_klu2.mat b/katoptron/matlab/CPU statistic/amesos2_klu2.mat deleted file mode 100644 index f00dacc8efdaaaef8c220acc2504d01acd889e18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 694 zcmeZu4DoSvQZUssQ1EpO(M`+DN!3vZ$Vn_o%P-2c0*X0%nwjV*I2WZRmZYXA<mXu_ zgp{T#xTPj37@8;;8e5r|S{a!u7#SFvD-a79V1UunmmkP>2I7i2kCPJ;I2e-56rMF) zQaHf%)R@Uoe@0r$2j)vU4mzwyp7zN4tkL1gxhrG6BmI+g$D8R_0$zls8_dYzyvWb6 z;S9Sz$f#bpQ9l@t<T#vRJmSM605a^5p|NvR8fU;9)-_@($C!_(PGw!m!*lZI%FN7! z+8T#9jVW^6VxL<Uns9J9{AB%UIkocV&Y7K-T$(Fix~^Qwb*$hs(}Xk0hm+*ECsodI zSi^ASf8Uj}6Mk(x^zFcsmz?7DsW&p~=Gd&<^YYie8Qq4Qw?wyoW2kOdNCG*^81ASK z$o^AG^iw!@TK|-;m+m>A##N77R&j3%NuOu*b)qf9Y(MsNkk;vNtq~CaEOl%UJ@uS5 z$xVapr07zy^kpK(1_ewvB^_#>uC8la9)Iay+hI%h`q@u!vv<4+Dm$}cWBHCP1`aE? zUEO!^@||x-?wtC|)ahNOwQcRq^BZ1@)%$V<{7L>`c>1gNH*Jp<5u!P^Y4<-o^qm;> zMy<MiRYTY1b=$vNTSP`&+ZeMo{YJXxL#>Ue_6:SMf&uLSPA8I0iI20JgEB`MC} z?1=!TC6<jA%pI#;ukEy7leO`_;`Luv1;=fEn>Q+4bF1$7Ay{2GVZ)tJjlWmymi@mF y-aF&{w^<2nvza}np0EmJU-!D3J7?z<*#oy+cw`h_<;d7LTzd76k3mk!U^f7MPZym4 diff --git a/katoptron/matlab/CPU statistic/amesos_belos.mat b/katoptron/matlab/CPU statistic/amesos_belos.mat deleted file mode 100644 index 7988f8339f14b60bbff74236cf804e5464f57e51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 745 zcmeZu4DoSvQZUssQ1EpO(M`+DN!3vZ$Vn_o%P-2c0*X0%nwjV*I2WZRmZYXA<mXu_ zgac`})FcH%Qw2j4D<g9&Q)2}q14DBKVgUmTFnap(1KG|%TruZyazX+JLz0=ovxZ9w z2e_UZGa2g7NK5&^d`ZVahxN$Q9$B9?Iy^adWvq9kf3og)GyO`yi_mm~89AI6`588x zVb=#4H4SPM1CtvYo0-B<#v?vF0wBYb67>}PPV02~pYhc_r{A_RnejF2$<GXho~e#n z%+5u1Sy56E^Y}Y#B?O*rPB4s@@M>;gm=Zr>e(=oc^JmYTv3SCyS#eWltxDiA*Jn6s zW2W<Lqr%MNoJY7E{=E0N%d=8mJBQzA*1Up`;cauD9X~nw)a-TdyLU=VUJx6Y&Cej{ zrIZMAT@}=I2?-GlM{*p_FfMg$5IvR7k`$-G`)K+R^=He(o{JYV-IR2Q(cN_JZ(?Zo zU%s8!t~XjgySbl}Wuw_G=Og_$PB*taUFY<2`8UJA?fbHh)NH@bVthl!VU^3ZPOF00 z_?U##OW!bDQ%icl5Sae>0pp~w@^S`-`iaIHK`sC?p+Sw|g0p-_R6lyIwETILXO2S| z8#B+J4gSo`dhBOs{Bw>sb&-jRXMZ;#durj1eLD_Jd%bHB^Mub<7o4stava&Q;vvJe zYYUhsikml__-{~Rz}9&F7~keJrh~r09I~137#L>l&@LfhJ?|v#PJIn8-?W4WESroQ zEHc_-UcWvd{7v9jo9zUKO>(!hkA0E<wd&)seHW&^{`IJ-|6BU`h6Ca&cFBKpa9nUE mzk0)_8UF)nd-w!q-AugZBal$~p&~+c)492K85u-NEbIWebs}W| diff --git a/katoptron/matlab/CPU statistic/cube_.tex b/katoptron/matlab/CPU statistic/cube_.tex deleted file mode 100644 index ab7dfc3b..00000000 --- a/katoptron/matlab/CPU statistic/cube_.tex +++ /dev/null @@ -1,238 +0,0 @@ -% This file was created by matlab2tikz. -% Minimal pgfplots version: 1.3 -% -%The latest updates can be retrieved from -% http://www.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz -%where you can also make suggestions and rate matlab2tikz. -% -\begin{tikzpicture} - -\begin{axis}[% -width=6.027778in, -height=4.669444in, -at={(1.011111in,0.726389in)}, -scale only axis, -xmin=1, -xmax=200, -xlabel={Number of linear iterations}, -xmajorgrids, -ymin=0.3, -ymax=1, -ylabel={Scalability [-]}, -ymajorgrids, -legend style={at={(0.97,0.03)},anchor=south east,legend cell align=left,align=left,draw=white!15!black} -] -\addplot [color=blue,solid,line width=2.0pt] - table[row sep=crcr]{% -1 0.314102564102564\\ -2 0.411347517730496\\ -3 0.48030303030303\\ -4 0.531746031746032\\ -5 0.571596244131455\\ -6 0.60337552742616\\ -7 0.629310344827586\\ -8 0.650877192982456\\ -9 0.669093851132686\\ -10 0.684684684684685\\ -11 0.698179271708683\\ -12 0.70997375328084\\ -13 0.72037037037037\\ -14 0.72960372960373\\ -15 0.737858719646799\\ -16 0.745283018867924\\ -17 0.751996007984032\\ -18 0.758095238095238\\ -19 0.763661202185792\\ -20 0.768760907504363\\ -21 0.773450586264657\\ -22 0.777777777777778\\ -23 0.781782945736434\\ -24 0.785500747384155\\ -25 0.788961038961039\\ -26 0.792189679218968\\ -27 0.795209176788124\\ -28 0.798039215686274\\ -29 0.800697084917617\\ -30 0.80319803198032\\ -31 0.805555555555556\\ -32 0.807781649245064\\ -33 0.809887005649717\\ -34 0.811881188118812\\ -35 0.813772775991425\\ -36 0.815569487983281\\ -37 0.817278287461774\\ -38 0.818905472636816\\ -39 0.820456754130223\\ -40 0.821937321937322\\ -41 0.823351903435469\\ -42 0.824704813805631\\ -43 0.826\\ -44 0.827241079199304\\ -45 0.82843137254902\\ -46 0.829573934837093\\ -47 0.830671580671581\\ -48 0.831726907630522\\ -49 0.83274231678487\\ -50 0.833720030935808\\ -51 0.83466211085801\\ -52 0.835570469798658\\ -53 0.836446886446886\\ -54 0.837293016558675\\ -55 0.838110403397027\\ -56 0.838900487125957\\ -57 0.839664613278576\\ -58 0.84040404040404\\ -59 0.841119946984758\\ -60 0.841813437703849\\ -61 0.842485549132948\\ -62 0.843137254901961\\ -63 0.843769470404984\\ -64 0.844383057090239\\ -65 0.844978826376286\\ -66 0.845557543231962\\ -67 0.846119929453263\\ -68 0.846666666666667\\ -69 0.847198399085192\\ -70 0.847715736040609\\ -71 0.848219254312743\\ -72 0.848709500274574\\ -73 0.849186991869919\\ -74 0.849652220438737\\ -75 0.850105652403592\\ -76 0.850547730829421\\ -77 0.850978876867594\\ -78 0.851399491094148\\ -79 0.851809954751131\\ -80 0.852210630899156\\ -81 0.852601865488464\\ -82 0.852983988355167\\ -83 0.853357314148681\\ -84 0.853722143195828\\ -85 0.854078762306611\\ -86 0.854427445526194\\ -87 0.854768454837231\\ -88 0.855102040816327\\ -89 0.855428443248093\\ -90 0.855747891699956\\ -91 0.856060606060606\\ -92 0.856366797044763\\ -93 0.856666666666667\\ -94 0.856960408684547\\ -95 0.857248209018121\\ -96 0.85753024614101\\ -97 0.857806691449814\\ -98 0.858077709611452\\ -99 0.858343458890239\\ -100 0.858604091456077\\ -101 0.85885975367501\\ -102 0.859110586383314\\ -103 0.859356725146199\\ -104 0.859598300502124\\ -105 0.859835438193647\\ -106 0.860068259385665\\ -107 0.860296880871853\\ -108 0.860521415270019\\ -109 0.860741971207088\\ -110 0.860958653494329\\ -111 0.861171563293435\\ -112 0.861380798274002\\ -113 0.861586452762923\\ -114 0.861788617886179\\ -115 0.86198738170347\\ -116 0.862182829336114\\ -117 0.86237504308859\\ -118 0.862564102564103\\ -119 0.8627500847745\\ -120 0.862933064244871\\ -121 0.863113113113113\\ -122 0.86329030122476\\ -123 0.863464696223317\\ -124 0.863636363636364\\ -125 0.863805366957646\\ -126 0.863971767725377\\ -127 0.864135625596944\\ -128 0.864296998420221\\ -129 0.864455942301662\\ -130 0.864612511671335\\ -131 0.864766759345073\\ -132 0.86491873658387\\ -133 0.865068493150685\\ -134 0.865216077364763\\ -135 0.865361536153616\\ -136 0.86550491510277\\ -137 0.865646258503401\\ -138 0.865785609397944\\ -139 0.865923009623797\\ -140 0.866058499855199\\ -141 0.866192119643371\\ -142 0.866323907455013\\ -143 0.86645390070922\\ -144 0.866582135812905\\ -145 0.866708648194794\\ -146 0.866833472338059\\ -147 0.866956641811654\\ -148 0.867078189300412\\ -149 0.86719814663396\\ -150 0.867316544814514\\ -151 0.867433414043583\\ -152 0.867548783747661\\ -153 0.867662682602922\\ -154 0.867775138558987\\ -155 0.867886178861789\\ -156 0.86799583007558\\ -157 0.868104118104118\\ -158 0.868211068211068\\ -159 0.868316705039652\\ -160 0.868421052631579\\ -161 0.868524134445287\\ -162 0.868625973373524\\ -163 0.8687265917603\\ -164 0.868826011417225\\ -165 0.86892425363928\\ -166 0.869021339220015\\ -167 0.869117288466228\\ -168 0.869212121212121\\ -169 0.869305856832972\\ -170 0.869398514258327\\ -171 0.869490111984751\\ -172 0.869580668088131\\ -173 0.869670200235571\\ -174 0.869758725696885\\ -175 0.869846261355695\\ -176 0.869932823720176\\ -177 0.870018428933426\\ -178 0.870103092783505\\ -179 0.870186830713147\\ -180 0.870269657829141\\ -181 0.870351588911427\\ -182 0.870432638421879\\ -183 0.870512820512821\\ -184 0.870592149035263\\ -185 0.870670637546879\\ -186 0.870748299319728\\ -187 0.870825147347741\\ -188 0.870901194353963\\ -189 0.87097645279758\\ -190 0.871050934880722\\ -191 0.871124652555057\\ -192 0.871197617528185\\ -193 0.871269841269841\\ -194 0.871341335017898\\ -195 0.871412109784203\\ -196 0.871482176360225\\ -197 0.871551545322547\\ -198 0.871620227038184\\ -199 0.871688231669747\\ -200 0.871755569180462\\ -}; -\addlegendentry{Actual}; - -\addplot [color=red,dashed,line width=2.0pt] - table[row sep=crcr]{% -1 1\\ -200 1\\ -}; -\addlegendentry{Ideal}; - -\end{axis} -\end{tikzpicture}% \ No newline at end of file diff --git a/katoptron/matlab/CPU statistic/cube_test_nic4_distributed.m b/katoptron/matlab/CPU statistic/cube_test_nic4_distributed.m deleted file mode 100644 index 8d3ca747..00000000 --- a/katoptron/matlab/CPU statistic/cube_test_nic4_distributed.m +++ /dev/null @@ -1,182 +0,0 @@ -close all -clc -clear all - -np = 1:19; - -%222.9 -map = [0.1, 58.8, 27.9, 15.1, 10.2, 7.2, 5.2, 4.1, 3.3, 2.7, 2.3, 2.0, 1.6, 1.4, 1.3, 1.1, 1.0, 0.9, 0.8]; -graph = [75.4, 37.8, 27.0, 19.2, 15.7, 13.7, 11.5, 10.2, 8.7, 8.0, 7.5, 6.8, 6.4, 5.8, 5.4, 5.2, 5.0, 4.8, 4.5]; -assembly = [140.3, 71.6, 46.1, 35.9, 28.6, 23.9, 20.0, 17.9, 15.3, 13.9, 12.6, 11.7, 10.4, 10., 9.4, 8.5, 7.7, 7.5, 7.3]; - -total = map+graph+assembly; - -line_width = 1.5; -bar_width = 1; -figure -b1 = bar(np+0.5,map+graph+assembly,bar_width,'r','LineWidth',line_width); -hold on -b2 = bar(np+0.5,graph+assembly,bar_width,'g','LineWidth',line_width); -b3 = bar(np+0.5,assembly,bar_width,'b','LineWidth',line_width); -xlabel('MPI process') -ylabel('Real CPU cost [sec]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,20]) -legend([b1,b2,b3],'Map','Graph','Matrix') -%matlab2tikz('mpi_cube_real_CPU.tex') - - -figure -b1 = bar(np+0.5,(map+graph+assembly)./total,bar_width,'r','LineWidth',line_width); -hold on -b2 = bar(np+0.5,(graph+assembly)./total,bar_width,'g','LineWidth',line_width); -b3 = bar(np+0.5,assembly./total,bar_width,'b','LineWidth',line_width); -xlabel('MPI process') -ylabel('Relative CPU cost [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,20]) -legend([b1,b2,b3],'Map','Graph','Matrix', 'Location','SouthEast') -%matlab2tikz('mpi_cube_relative_CPU.tex') - -% figure -% b1 = bar(np+0.5,(map+graph+assembly).*np,bar_width,'r','LineWidth',line_width); -% hold on -% b2 = bar(np+0.5,(graph+assembly).*np,bar_width,'g','LineWidth',line_width); -% b3 = bar(np+0.5,(assembly).*np,bar_width,'b','LineWidth',line_width); -% xlabel('MPI process') -% ylabel('Used CPU cost [sec]') -% set(gca,'fontsize',18) -% grid on -% box on -% xlim([1,20]) -% legend([b1,b2,b3],'Map','Graph','Matrix') -%matlab2tikz('mpi_cube_used_CPU.tex') - -line_width = 2; - -figure -p1 = plot(np,total(1)./total,'-bo',... - 'LineWidth',line_width,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor',[.49 1 .63],... - 'MarkerSize',10); -hold on -p2 = plot(np,np,'r--','LineWidth',line_width); -xlabel('MPI process') -ylabel('Speedup [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,19]) -legend([p1,p2],'Actual','Ideal', 'Location','SouthEast') -%matlab2tikz('mpi_cube_speed_up.tex') - -figure -p1 =plot(np,(total(1))./(total.*np),'-bo',... - 'LineWidth',line_width,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor',[.49 1 .63],... - 'MarkerSize',10); -hold on -p2 = plot([1,19],[1,1],'r--','LineWidth',line_width); -xlabel('MPI process') -ylabel('Efficiency [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,19]) -legend([p1,p2],'Actual','Ideal', 'Location','SouthEast') -%matlab2tikz('mpi_cube_scalability.tex') - -%% - -figure -p1 = plot(np,assembly(1)./assembly,'-bo',... - 'LineWidth',line_width,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor',[.49 1 .63],... - 'MarkerSize',10); -hold on -p2 = plot(np,np,'r--','LineWidth',line_width); -xlabel('MPI process') -ylabel('Speedup [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,19]) -legend([p1,p2],'Actual','Ideal', 'Location','SouthEast') -%matlab2tikz('mpi_cube_speed_up.tex') - -figure -p1 =plot(np,(assembly(1))./(assembly.*np),'-bo',... - 'LineWidth',line_width,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor',[.49 1 .63],... - 'MarkerSize',10); -hold on -p2 = plot([1,19],[1,1],'r--','LineWidth',line_width); -xlabel('MPI process') -ylabel('Efficiency [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,19]) -legend([p1,p2],'Actual','Ideal', 'Location','SouthEast') -%matlab2tikz('mpi_cube_scalability.tex') - -%% - -close all -clc -clear all - -np = 12; - -n_iter = linspace(1,200,200); - -map = [0.1,2.]; -graph = [75.4,6.8]; -assembly = [140.3,11.7]; - -for i=1:length(n_iter) - total(i,:) = map(:)+graph(:)+n_iter(i)*assembly(:); -end - -line_width = 2; - -figure -p1 = plot(n_iter,total(:,1)./total(:,2),'-b',... - 'LineWidth',line_width); -hold on -p2 = plot([1,max(n_iter)],[np,np],'r--','LineWidth',line_width); -p3 = plot([1,max(n_iter)],[assembly(1)/assembly(2),assembly(1)/assembly(2)],'g--','LineWidth',line_width); -xlabel('Number of linear iterations') -ylabel('Speedup [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,max(n_iter)]) -ylim([10,12]) -legend([p1,p2,p3],'Actual','Ideal','Theoretical limit', 'Location','SouthEast') -matlab2tikz('cube_linear_speed_mpi.tex') - -figure -p1 =plot(n_iter,total(:,1)./(total(:,2)*np),'-b',... - 'LineWidth',line_width); -hold on -p2 = plot([1,max(n_iter)],[1,1],'r--','LineWidth',line_width); -p3 = plot([1,max(n_iter)],[assembly(1)/(np*assembly(2)),assembly(1)/(np*assembly(2))],'g--','LineWidth',line_width); -xlabel('Number of linear iterations') -ylabel('Efficiency [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,max(n_iter)]) -ylim([0.8,1]) -legend([p1,p2,p3],'Actual','Ideal','Theoretical limit', 'Location','SouthEast') -matlab2tikz('cube_linear_sca_mpi.tex') - diff --git a/katoptron/matlab/CPU statistic/cube_test_nic4_distributed_mean.m b/katoptron/matlab/CPU statistic/cube_test_nic4_distributed_mean.m deleted file mode 100644 index bebb6835..00000000 --- a/katoptron/matlab/CPU statistic/cube_test_nic4_distributed_mean.m +++ /dev/null @@ -1,188 +0,0 @@ -close all -clc -clear all - -np = 1:19; - -%222.9 -map = [0.04, 47.54, 21.84, 12.75, 8.53, 5.76, 4.23, 3.42, 2.6, 2.15, 1.97, 3.25, 4.48, 1.23, 1.05, 3.55, 0.78, 3.58, 3.35]; -graph = [18.92, 12.99, 8.75, 7.55, 6.10, 5.03, 4.37, 3.94, 3.26, 3.03, 2.87, 3.95, 4.84, 2.24, 2.04, 3.81, 1.82, 4.01, 3.69]; -assembly = [51.54, 25.83, 17.31, 14.68, 11.63, 9.56, 8.48, 7.13, 5.94, 5.59, 5.10, 5.98, 8.32, 4.05, 3.74, 5.23, 3.36, 6.46, 6.01]; -export = [1.28, 1.09, 0.78, 0.64, 0.53, 0.45, 0.39, 0.35, 0.33, 0.29, 0.29, 0.35, 0.42, 0.23, 0.21, 0.2, 0.23, 0.35, 0.36]; - -assembly = assembly + export; -map = 0*map; -% 10 error - - -total = map+graph+assembly; - -line_width = 1.5; -bar_width = 1; -figure -b1 = bar(np+0.5,map+graph+assembly,bar_width,'r','LineWidth',line_width); -hold on -b2 = bar(np+0.5,graph+assembly,bar_width,'g','LineWidth',line_width); -b3 = bar(np+0.5,assembly,bar_width,'b','LineWidth',line_width); -xlabel('MPI process') -ylabel('Real CPU cost [sec]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,20]) -legend([b1,b2,b3],'Map','Graph','Matrix') -%matlab2tikz('mpi_cube_real_CPU.tex') - - -figure -b1 = bar(np+0.5,(map+graph+assembly)./total,bar_width,'r','LineWidth',line_width); -hold on -b2 = bar(np+0.5,(graph+assembly)./total,bar_width,'g','LineWidth',line_width); -b3 = bar(np+0.5,assembly./total,bar_width,'b','LineWidth',line_width); -xlabel('MPI process') -ylabel('Relative CPU cost [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,20]) -legend([b1,b2,b3],'Map','Graph','Matrix', 'Location','SouthEast') -%matlab2tikz('mpi_cube_relative_CPU.tex') - -% figure -% b1 = bar(np+0.5,(map+graph+assembly).*np,bar_width,'r','LineWidth',line_width); -% hold on -% b2 = bar(np+0.5,(graph+assembly).*np,bar_width,'g','LineWidth',line_width); -% b3 = bar(np+0.5,(assembly).*np,bar_width,'b','LineWidth',line_width); -% xlabel('MPI process') -% ylabel('Used CPU cost [sec]') -% set(gca,'fontsize',18) -% grid on -% box on -% xlim([1,20]) -% legend([b1,b2,b3],'Map','Graph','Matrix') -%matlab2tikz('mpi_cube_used_CPU.tex') - -line_width = 2; - -figure -p1 = plot(np,total(1)./total,'-bo',... - 'LineWidth',line_width,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor',[.49 1 .63],... - 'MarkerSize',10); -hold on -p2 = plot(np,np,'r--','LineWidth',line_width); -xlabel('MPI process') -ylabel('Speedup [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,19]) -legend([p1,p2],'Actual','Ideal', 'Location','SouthEast') -%matlab2tikz('mpi_cube_speed_up.tex') - -figure -p1 =plot(np,(total(1))./(total.*np),'-bo',... - 'LineWidth',line_width,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor',[.49 1 .63],... - 'MarkerSize',10); -hold on -p2 = plot([1,19],[1,1],'r--','LineWidth',line_width); -xlabel('MPI process') -ylabel('Efficiency [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,19]) -legend([p1,p2],'Actual','Ideal', 'Location','SouthEast') -%matlab2tikz('mpi_cube_scalability.tex') - -%% - -figure -p1 = plot(np,assembly(1)./assembly,'-bo',... - 'LineWidth',line_width,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor',[.49 1 .63],... - 'MarkerSize',10); -hold on -p2 = plot(np,np,'r--','LineWidth',line_width); -xlabel('MPI process') -ylabel('Speedup [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,19]) -legend([p1,p2],'Actual','Ideal', 'Location','SouthEast') -%matlab2tikz('mpi_cube_speed_up.tex') - -figure -p1 =plot(np,(assembly(1))./(assembly.*np),'-bo',... - 'LineWidth',line_width,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor',[.49 1 .63],... - 'MarkerSize',10); -hold on -p2 = plot([1,19],[1,1],'r--','LineWidth',line_width); -xlabel('MPI process') -ylabel('Efficiency [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,19]) -legend([p1,p2],'Actual','Ideal', 'Location','SouthEast') -%matlab2tikz('mpi_cube_scalability.tex') - -%% - -close all -clc -clear all - -np = 12; - -n_iter = linspace(1,200,200); - -map = [0.1,2.]; -graph = [75.4,6.8]; -assembly = [140.3,11.7]; - -for i=1:length(n_iter) - total(i,:) = map(:)+graph(:)+n_iter(i)*assembly(:); -end - -line_width = 2; - -figure -p1 = plot(n_iter,total(:,1)./total(:,2),'-b',... - 'LineWidth',line_width); -hold on -p2 = plot([1,max(n_iter)],[np,np],'r--','LineWidth',line_width); -p3 = plot([1,max(n_iter)],[assembly(1)/assembly(2),assembly(1)/assembly(2)],'g--','LineWidth',line_width); -xlabel('Number of linear iterations') -ylabel('Speedup [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,max(n_iter)]) -ylim([10,12]) -legend([p1,p2,p3],'Actual','Ideal','Theoretical limit', 'Location','SouthEast') -matlab2tikz('cube_linear_speed_mpi.tex') - -figure -p1 =plot(n_iter,total(:,1)./(total(:,2)*np),'-b',... - 'LineWidth',line_width); -hold on -p2 = plot([1,max(n_iter)],[1,1],'r--','LineWidth',line_width); -p3 = plot([1,max(n_iter)],[assembly(1)/(np*assembly(2)),assembly(1)/(np*assembly(2))],'g--','LineWidth',line_width); -xlabel('Number of linear iterations') -ylabel('Efficiency [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,max(n_iter)]) -ylim([0.8,1]) -legend([p1,p2,p3],'Actual','Ideal','Theoretical limit', 'Location','SouthEast') -matlab2tikz('cube_linear_sca_mpi.tex') - diff --git a/katoptron/matlab/CPU statistic/cube_test_nic4_shared.m b/katoptron/matlab/CPU statistic/cube_test_nic4_shared.m deleted file mode 100644 index 498ceb2c..00000000 --- a/katoptron/matlab/CPU statistic/cube_test_nic4_shared.m +++ /dev/null @@ -1,283 +0,0 @@ -close all -clc -clear all - -np = 1; - -k = 1:8; - -map = [0.1, 0.1, 0.1, 0.1, 0.1, 0.1 ,0.1, 0.1]; -graph = [75.4, 75.5, 60.8,60.4,74.2,73.8,73.6,73.6]; -assembly = [140.3, 74.0, 38.,28.6,30.1,25.0,21.4,19.0]; - -total = map+graph+assembly; - -line_width = 1.5; -bar_width = 1; -figure -b1 = bar(k+0.5,map+graph+assembly,bar_width,'r','LineWidth',line_width); -hold on -b2 = bar(k+0.5,graph+assembly,bar_width,'g','LineWidth',line_width); -b3 = bar(k+0.5,assembly,bar_width,'b','LineWidth',line_width); -xlabel('Threads') -ylabel('Real CPU cost [sec]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,9]) -legend([b1,b2,b3],'Map','Graph','Matrix') -%matlab2tikz('mpi_cube_real_CPU_s1.tex') - - -figure -b1 = bar(k+0.5,(map+graph+assembly)./total,bar_width,'r','LineWidth',line_width); -hold on -b2 = bar(k+0.5,(graph+assembly)./total,bar_width,'g','LineWidth',line_width); -b3 = bar(k+0.5,assembly./total,bar_width,'b','LineWidth',line_width); -xlabel('Threads') -ylabel('Relative CPU cost [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,9]) -legend([b1,b2,b3],'Map','Graph','Matrix', 'Location','SouthEast') -%matlab2tikz('mpi_cube_relative_CPU_s1.tex') - -% figure -% b1 = bar(np+0.5,(map+graph+assembly).*np,bar_width,'r','LineWidth',line_width); -% hold on -% b2 = bar(np+0.5,(graph+assembly).*np,bar_width,'g','LineWidth',line_width); -% b3 = bar(np+0.5,(assembly).*np,bar_width,'b','LineWidth',line_width); -% xlabel('MPI process') -% ylabel('Used CPU cost [sec]') -% set(gca,'fontsize',18) -% grid on -% box on -% xlim([1,20]) -% legend([b1,b2,b3],'Map','Graph','Matrix') -%%matlab2tikz('mpi_cube_used_CPU.tex') - -line_width = 2; - -figure -p1 = plot(k,total(1)./total,'-bo',... - 'LineWidth',line_width,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor',[.49 1 .63],... - 'MarkerSize',10); -hold on -p2 = plot(k,k,'r--','LineWidth',line_width); -xlabel('Threads') -ylabel('Speedup [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,8]) -legend([p1,p2],'Actual','Ideal', 'Location','SouthEast') -%matlab2tikz('mpi_cube_speed_up_s1.tex') - -figure -p1 =plot(k,(total(1))./(total.*k),'-bo',... - 'LineWidth',line_width,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor',[.49 1 .63],... - 'MarkerSize',10); -hold on -p2 = plot([1,8],[1,1],'r--','LineWidth',line_width); -xlabel('Threads') -ylabel('Efficiency [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,8]) -legend([p1,p2],'Actual','Ideal', 'Location','SouthEast') -%matlab2tikz('mpi_cube_scalability_s1.tex') - - -%% - -close all -clc -clear all - -np = 16; - -k = 1:6; - - -map = [1.1, 1.1, 1.1, 2.6, 2.7,1.1]; -graph = [5.2, 5.2, 5.2, 10.8, 5.2,5.1]; -assembly = [8.5, 4.3, 3.0, 2.3, 1.6,1.6]; - -total = map+graph+assembly; - -line_width = 1.5; -bar_width = 1; -figure -b1 = bar(k+0.5,map+graph+assembly,bar_width,'r','LineWidth',line_width); -hold on -b2 = bar(k+0.5,graph+assembly,bar_width,'g','LineWidth',line_width); -b3 = bar(k+0.5,assembly,bar_width,'b','LineWidth',line_width); -xlabel('Threads') -ylabel('Real CPU cost [sec]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,9]) -legend([b1,b2,b3],'Map','Graph','Matrix') -%matlab2tikz('mpi_cube_real_CPU_s2.tex') - - -figure -b1 = bar(k+0.5,(map+graph+assembly)./total,bar_width,'r','LineWidth',line_width); -hold on -b2 = bar(k+0.5,(graph+assembly)./total,bar_width,'g','LineWidth',line_width); -b3 = bar(k+0.5,assembly./total,bar_width,'b','LineWidth',line_width); -xlabel('Threads') -ylabel('Relative CPU cost [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,9]) -legend([b1,b2,b3],'Map','Graph','Matrix', 'Location','SouthEast') -%matlab2tikz('mpi_cube_relative_CPU_s2.tex') - -% figure -% b1 = bar(np+0.5,(map+graph+assembly).*np,bar_width,'r','LineWidth',line_width); -% hold on -% b2 = bar(np+0.5,(graph+assembly).*np,bar_width,'g','LineWidth',line_width); -% b3 = bar(np+0.5,(assembly).*np,bar_width,'b','LineWidth',line_width); -% xlabel('MPI process') -% ylabel('Used CPU cost [sec]') -% set(gca,'fontsize',18) -% grid on -% box on -% xlim([1,20]) -% legend([b1,b2,b3],'Map','Graph','Matrix') -%%matlab2tikz('mpi_cube_used_CPU.tex') - -line_width = 2; - -figure -p1 = plot(k,total(1)./total,'-bo',... - 'LineWidth',line_width,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor',[.49 1 .63],... - 'MarkerSize',10); -hold on -p2 = plot(k,k,'r--','LineWidth',line_width); -xlabel('Threads') -ylabel('Speedup [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,8]) -legend([p1,p2],'Actual','Ideal', 'Location','SouthEast') -%matlab2tikz('mpi_cube_speed_up_s2.tex') - -figure -p1 =plot(k,(total(1))./(total.*k),'-bo',... - 'LineWidth',line_width,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor',[.49 1 .63],... - 'MarkerSize',10); -hold on -p2 = plot([1,8],[1,1],'r--','LineWidth',line_width); -xlabel('Threads') -ylabel('Efficiency [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,8]) -legend([p1,p2],'Actual','Ideal', 'Location','SouthEast') -%matlab2tikz('mpi_cube_scalability_s2.tex') - -%% - -figure -p1 = plot(k,assembly(1)./assembly,'-bo',... - 'LineWidth',line_width,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor',[.49 1 .63],... - 'MarkerSize',10); -hold on -p2 = plot(k,k,'r--','LineWidth',line_width); -xlabel('Threads') -ylabel('Speedup [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,8]) -legend([p1,p2],'Actual','Ideal', 'Location','SouthEast') -%matlab2tikz('mpi_cube_speed_up_s2.tex') - -figure -p1 =plot(k,(assembly(1))./(assembly.*k),'-bo',... - 'LineWidth',line_width,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor',[.49 1 .63],... - 'MarkerSize',10); -hold on -p2 = plot([1,8],[1,1],'r--','LineWidth',line_width); -xlabel('Threads') -ylabel('Efficiency [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,8]) -legend([p1,p2],'Actual','Ideal', 'Location','SouthEast') -%matlab2tikz('mpi_cube_scalability_s2.tex') - - -%% - -close all -clc -clear all - -np = 16; -k = 6; - -n_iter = linspace(1,500,200); - -map = [1.1,1.1]; -graph = [5.1,5.1]; -assembly = [8.5,1.6]; - -for i=1:length(n_iter) - total(i,:) = map(:)+graph(:)+n_iter(i)*assembly(:); -end - -line_width = 2; - -figure -p1 = plot(n_iter,total(:,1)./total(:,2),'-b',... - 'LineWidth',line_width); -hold on -p2 = plot([1,max(n_iter)],[k,k],'r--','LineWidth',line_width); -p3 = plot([1,max(n_iter)],[assembly(1)/assembly(2),assembly(1)/assembly(2)],'g--','LineWidth',line_width); -xlabel('Number of linear iterations') -ylabel('Speedup [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,max(n_iter)]) -ylim([1,6]) -legend([p1,p2,p3],'Actual','Ideal','Theoretical limit', 'Location','SouthEast') -%matlab2tikz('cube_linear_speed.tex') - -figure -p1 =plot(n_iter,total(:,1)./(total(:,2)*k),'-b',... - 'LineWidth',line_width); -hold on -p2 = plot([1,max(n_iter)],[1,1],'r--','LineWidth',line_width); -p3 = plot([1,max(n_iter)],[assembly(1)/(6*assembly(2)),assembly(1)/(6*assembly(2))],'g--','LineWidth',line_width); -xlabel('Number of linear iterations') -ylabel('Efficiency [-]') -set(gca,'fontsize',18) -grid on -box on -xlim([1,max(n_iter)]) -ylim([0,1]) -legend([p1,p2,p3],'Actual','Ideal','Theoretical limit', 'Location','SouthEast') -%matlab2tikz('cube_linear_sca.tex') diff --git a/katoptron/matlab/CPU statistic/read_workspace.m b/katoptron/matlab/CPU statistic/read_workspace.m deleted file mode 100644 index bdfd6a9e..00000000 --- a/katoptron/matlab/CPU statistic/read_workspace.m +++ /dev/null @@ -1,5 +0,0 @@ -function n = read_workspace(path, name, first_id, last_id) - - - -end \ No newline at end of file diff --git a/katoptron/matlab/Krylov/createVandermond.m b/katoptron/matlab/Krylov/createVandermond.m deleted file mode 100644 index 957c0fa8..00000000 --- a/katoptron/matlab/Krylov/createVandermond.m +++ /dev/null @@ -1,64 +0,0 @@ -clear all -close all -clc -lambda = [1,1,1.0000001,1.000001,3.99999,4,4.00001]; - -tol = 10^(-8); -figure -subplot(1,3,1) -plot(lambda,ones(size(lambda)),'*') -grid on -axis equal -m = length(lambda); - -%m = 10; -n = 20; - -r_eig = ones(m,1); -% lambda = ones(m,1); -% for i=1:m -% lambda(i) = m+1-i; -% end - - - - -C_eig = zeros(m,n); -C_eig(:,1) = r_eig; -ranks = zeros(1,n); -ranks(1) = 1; - -for i=2:n - C_eig(:,i) = diag(lambda)*C_eig(:,i-1); - ranks(i) = rank(C_eig(:,1:i),tol); -end - -subplot(1,3,2) -plot(1:n,ranks,'*') -xlim([1,n]) -ylim([1,n]) -grid on -axis equal - -C_eig - -max_det = zeros(1,n); -for i=1:n - if i > m - break - end - C = nchoosek(1:m,i); - - for j=1:size(C,1) - current_det = det(C_eig(C(j,:),1:i)); - if current_det > max_det(i) - max_det(i) = current_det; - end - end -end - -subplot(1,3,3) -plot(1:n,max_det,'*') -xlim([1,n]) - -grid on \ No newline at end of file diff --git a/katoptron/matlab/Multigrid/eigenvaluesOneDTest.m b/katoptron/matlab/Multigrid/eigenvaluesOneDTest.m deleted file mode 100644 index c5f1b793..00000000 --- a/katoptron/matlab/Multigrid/eigenvaluesOneDTest.m +++ /dev/null @@ -1,113 +0,0 @@ -clear all -close all -clc -format long - -L = 1; -n = 1:31; -ni = [1,3,7,15,31]; - -[ theta, eigenvaluesA, eigenvaluesAh] = oneDLaplacianEigenvalues( n, L ); - -eigenvaluesAh(:,ni) - -figure -subplot(2,2,1) -hold on -for i=1:length(n) - for j=1:n(i) - if j>(n(i)/2) - plot(i,eigenvaluesA(j,i),'o','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','g',... - 'MarkerFaceColor','g'); - else - plot(i,eigenvaluesA(j,i),'o','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','r',... - 'MarkerFaceColor','r'); - end - end -end -for i=1:(length(n)-1) - plot([i,i+1],[eigenvaluesA(n(i),i),eigenvaluesA(n(i+1),i+1)],'k','linewidth',2) - plot([i,i+1],[eigenvaluesA(1,i),eigenvaluesA(1,i+1)],'k','linewidth',2) -end -hold off -grid on -box on - -subplot(2,2,2) -hold on -for i=1:length(n) - for j=1:n(i) - if j>(n(i)/2) - plot(i,eigenvaluesAh(j,i),'o','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','g',... - 'MarkerFaceColor','g'); - else - plot(i,eigenvaluesAh(j,i),'o','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','r',... - 'MarkerFaceColor','r'); - end - end -end -for i=1:(length(n)-1) - plot([i,i+1],[eigenvaluesAh(n(i),i),eigenvaluesAh(n(i+1),i+1)],'k','linewidth',2) - plot([i,i+1],[eigenvaluesAh(1,i),eigenvaluesAh(1,i+1)],'k','linewidth',2) -end -hold off -grid on -box on - -subplot(2,2,3) -hold on -for i=1:length(ni) - for j=1:ni(i) - if j>(n(ni(i))/2) - plot(n(ni(i)),eigenvaluesA(j,ni(i)),'o','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','g',... - 'MarkerFaceColor','g'); - else - plot(n(ni(i)),eigenvaluesA(j,ni(i)),'o','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','r',... - 'MarkerFaceColor','r'); - end - end -end -for i=1:(length(n)-1) - plot([i,i+1],[eigenvaluesA(n(i),i),eigenvaluesA(n(i+1),i+1)],'k','linewidth',2) - plot([i,i+1],[eigenvaluesA(1,i),eigenvaluesA(1,i+1)],'k','linewidth',2) -end -hold off -grid on -box on - -subplot(2,2,4) -hold on -for i=1:length(ni) - for j=1:n(ni(i)) - if j>(n(ni(i))/2) - plot(n(ni(i)),eigenvaluesAh(j,ni(i)),'o','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','g',... - 'MarkerFaceColor','g'); - else - plot(n(ni(i)),eigenvaluesAh(j,ni(i)),'o','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','r',... - 'MarkerFaceColor','r'); - end - end -end -for i=1:(length(n)-1) - plot([i,i+1],[eigenvaluesAh(n(i),i),eigenvaluesAh(n(i+1),i+1)],'k','linewidth',2) - plot([i,i+1],[eigenvaluesAh(1,i),eigenvaluesAh(1,i+1)],'k','linewidth',2) -end -hold off -grid on -box on \ No newline at end of file diff --git a/katoptron/matlab/Multigrid/oneDLaplacianEigenvalues.m b/katoptron/matlab/Multigrid/oneDLaplacianEigenvalues.m deleted file mode 100644 index 738ba5e7..00000000 --- a/katoptron/matlab/Multigrid/oneDLaplacianEigenvalues.m +++ /dev/null @@ -1,17 +0,0 @@ -function [ theta, eigenvaluesA, eigenvaluesAh] = oneDLaplacianEigenvalues( n, L ) - -theta = zeros(max(n),length(n)); -eigenvaluesA = zeros(max(n),length(n)); -eigenvaluesAh = zeros(max(n),length(n)); - -for i=1:length(n) - h = L/(n(i)+1); - - for k=1:n(i) - theta(k,i) = k*pi/(n(i)+1); - eigenvaluesA(k,i) = 4*sin(theta(k,i)/2)^2; - eigenvaluesAh(k,i) = eigenvaluesA(k,i)/h^2; - end -end -end - diff --git a/katoptron/matlab/Multigrid/oneDLaplacianMatrix.m b/katoptron/matlab/Multigrid/oneDLaplacianMatrix.m deleted file mode 100644 index 6c765de6..00000000 --- a/katoptron/matlab/Multigrid/oneDLaplacianMatrix.m +++ /dev/null @@ -1,9 +0,0 @@ -function [ A,Ah,h ] = oneDLaplacianMatrix( n, L ) - - h = L/(n+1); - A = full(gallery('tridiag',n,-1,2,-1)); - Ah = (1/h^2)*A; - - -end - diff --git a/katoptron/matlab/Multigrid/oneDProlongation.m b/katoptron/matlab/Multigrid/oneDProlongation.m deleted file mode 100644 index 40ccea79..00000000 --- a/katoptron/matlab/Multigrid/oneDProlongation.m +++ /dev/null @@ -1,10 +0,0 @@ -function [I_H_h,n2] = oneDProlongation(n) - - n2 = (n-1)/2; - I_H_h = zeros(n,n2); - - for i=1:n2 - I_H_h((2*(i-1))+(1:3),i) = [1;2;1]; - end - I_H_h = I_H_h/2; -end \ No newline at end of file diff --git a/katoptron/matlab/Multigrid/oneDRestriction.m b/katoptron/matlab/Multigrid/oneDRestriction.m deleted file mode 100644 index 63a0d07b..00000000 --- a/katoptron/matlab/Multigrid/oneDRestriction.m +++ /dev/null @@ -1,10 +0,0 @@ -function [I_h_H,n2] = oneDRestriction(n) - - n2 = (n-1)/2; - I_h_H = zeros(n2,n); - - for i=1:n2 - I_h_H(i,(2*(i-1))+(1:3)) = [1,2,1]; - end - I_h_H = I_h_H/4; -end \ No newline at end of file diff --git a/katoptron/matlab/Multigrid/read_agregate.m b/katoptron/matlab/Multigrid/read_agregate.m deleted file mode 100644 index 051fa1e6..00000000 --- a/katoptron/matlab/Multigrid/read_agregate.m +++ /dev/null @@ -1,20 +0,0 @@ -function [indices] = read_agregate(filename,agg_id,proc) - - indices = []; - - fid = fopen(filename); - - line_start = ['Agg ',int2str(agg_id), ' Proc ', int2str(proc),':']; - tline = fgetl(fid); - while ischar(tline) - current_length = length(tline); - - if tline(1:length(line_start)) == line_start - indices = str2num(tline((length(line_start)+1):current_length)); - - break - end - tline = fgetl(fid); - end - fclose(fid); -end \ No newline at end of file diff --git a/katoptron/matlab/Multigrid/richardsonSmoother.m b/katoptron/matlab/Multigrid/richardsonSmoother.m deleted file mode 100644 index fdf159e9..00000000 --- a/katoptron/matlab/Multigrid/richardsonSmoother.m +++ /dev/null @@ -1,14 +0,0 @@ -function [x_new, S_nu] = richardsonSmoother(x_old,A,b,omega,nu) - - I = eye(size(A)); - S = I-omega*A; - g = omega*b; - - for i=1:nu - x_new = S*x_old+g; - x_old = x_new; - end - - S_nu = S^nu; -end - \ No newline at end of file diff --git a/katoptron/matlab/Multigrid/testOneDProlongation.m b/katoptron/matlab/Multigrid/testOneDProlongation.m deleted file mode 100644 index dfbfc579..00000000 --- a/katoptron/matlab/Multigrid/testOneDProlongation.m +++ /dev/null @@ -1,96 +0,0 @@ -clear all -close all -clc -format long - -L = 1; -nH = 7; -n = 2*nH+1; -mode = 4; -[ Ah,Ahh,h ] = oneDLaplacianMatrix( n, L ); - - - -H = 2 *h; - -[I_h_H,n2] = oneDRestriction(n); -[I_H_h,n2] = oneDProlongation(n); -AH = I_h_H * Ah * I_H_h; - - - -[Vh,D] = eig(Ah); -d = diag(D); -[VH,DH] = eig(AH); - - -V = zeros(n,n); -for k =1:n - for i =1:n - V(i,k) = sin(i*k*pi/(n+1)); - end -end - - -[Vh,Dh] = eig(Ah); - -tmp = diag(V'*Vh); -for i=1:n - if tmp(i) < 0 - Vh(:,i) = -Vh(:,i); - end -end -tmp = diag(VH'*I_h_H*Vh); -for i=1:((n-1)/2) - VH(:,i) = VH(:,i)/tmp(i); % change the norm -end - -xH = VH(:,mode); -maxx = max(abs(xH)); -xH = xH / maxx; - -xh = I_H_h * xH; - -figure -subplot(2,3,1) -plot([0:H:L],[0;xH;0],'o-','linewidth',2) - -box on -grid on -subplot(2,3,2) -plot([0:h:L],[0;xh;0],'o-','linewidth',2) -box on -grid on -subplot(2,3,3) -plot([0:h:L],[0;xh;0],'o-','linewidth',2) -hold on -plot([0:H:L],[0;xH;0],'o-','linewidth',2) -plot([0:H:L],[0;VH(:,mode);0]*norm([0;xH;0])/norm([0;VH(:,mode);0]),'o--','linewidth',2) -box on -grid on -subplot(2,3,4) - -plot(0:((n-1)/2-1),VH'*xH,'o-','linewidth',2) -box on -grid on -subplot(2,3,5) -plot(0:(n-1),Vh'*xh,'o-','linewidth',2) -box on -grid on -subplot(2,3,6) -plot(0:(n-1),Vh'*xh,'o-','linewidth',2) -hold on -plot(0:((n-1)/2-1),VH'*xH,'o-','linewidth',2) -plot(0:((n-1)/2-1),VH'*VH(:,mode)*norm([0;xH;0])/norm([0;VH(:,mode);0]),'o--','linewidth',2) - -box on -grid on - -figure -tmp = Vh'*xh; -subplot(2,2,1) -plot(0:(nH-1),VH'*xH,'o-','linewidth',2) -subplot(2,2,2) -plot(0:(nH-1),tmp(1:nH),'o-','linewidth',2) -subplot(2,2,4) -plot(0:(nH-1),tmp(n:-1:n-nH+1),'o-','linewidth',2) diff --git a/katoptron/matlab/Multigrid/testOneDRestriction.m b/katoptron/matlab/Multigrid/testOneDRestriction.m deleted file mode 100644 index 4680a027..00000000 --- a/katoptron/matlab/Multigrid/testOneDRestriction.m +++ /dev/null @@ -1,98 +0,0 @@ - -clear all -close all -clc -format long - -L = 1; -n = 15; -nH = (n-1)/2; -mode = 12; -[ Ah,Ahh,h ] = oneDLaplacianMatrix( n, L ); - - - -H = 2 *h; - -[I_h_H,n2] = oneDRestriction(n); -[I_H_h,n2] = oneDProlongation(n); -AH = I_h_H * Ah * I_H_h; - - - -[Vh,D] = eig(Ah); -d = diag(D); -[VH,DH] = eig(AH); - - -V = zeros(n,n); -for k =1:n - for i =1:n - V(i,k) = sin(i*k*pi/(n+1)); - end -end - - -[Vh,Dh] = eig(Ah); - -tmp = diag(V'*Vh); -for i=1:n - if tmp(i) < 0 - Vh(:,i) = -Vh(:,i); - end -end -tmp = diag(VH'*I_h_H*Vh); -for i=1:((n-1)/2) - VH(:,i) = VH(:,i)/tmp(i); % change the norm -end - -xh = Vh(:,mode); -maxx = max(abs(xh)); -xh = xh / maxx; - -xH = I_h_H * xh; - -figure -subplot(2,3,1) -plot([0:h:L],[0;xh;0],'o-','linewidth',2) -box on -grid on -subplot(2,3,2) -plot([0:H:L],[0;xH;0],'o-','linewidth',2) -box on -grid on -subplot(2,3,3) -plot([0:h:L],[0;xh;0],'o-','linewidth',2) -hold on -plot([0:H:L],[0;xH;0],'o-','linewidth',2) -if mode <= size(VH,2) - plot([0:H:L],[0;VH(:,mode);0]*norm([0;xH;0])/norm([0;VH(:,mode);0]),'o--','linewidth',2) -end -box on -grid on -subplot(2,3,4) -plot(0:(n-1),Vh'*xh,'o-','linewidth',2) -box on -grid on -subplot(2,3,5) -plot(0:((n-1)/2-1),VH'*xH,'o-','linewidth',2) -box on -grid on -subplot(2,3,6) -plot(0:(n-1),Vh'*xh,'o-','linewidth',2) -hold on -plot(0:((n-1)/2-1),VH'*xH,'o-','linewidth',2) -if mode <= size(VH,2) - plot(0:((n-1)/2-1),VH'*VH(:,mode)*norm([0;xH;0])/norm([0;VH(:,mode);0]),'o--','linewidth',2) -end -box on -grid on - -figure -tmp = Vh'*xh; -subplot(2,2,1) -plot(0:(nH-1),tmp(1:nH),'o-','linewidth',2) -subplot(2,2,3) -plot(0:(nH-1),tmp(n:-1:n-nH+1),'o-','linewidth',2) -subplot(2,2,2) -plot(0:(nH-1),VH'*xH,'o-','linewidth',2) \ No newline at end of file diff --git a/katoptron/matlab/Multigrid/testOneDTwoGridCycle.m b/katoptron/matlab/Multigrid/testOneDTwoGridCycle.m deleted file mode 100644 index a3602964..00000000 --- a/katoptron/matlab/Multigrid/testOneDTwoGridCycle.m +++ /dev/null @@ -1,148 +0,0 @@ - - -clear all -close all -clc -format long - -L = 1; -n = 21; - -nu1 = 10; -nu2 = 10; - -eigeninitialguess = 1; -numeigenvectors = n; -ndisplay = n*10; -b_eigenvectors = [];%[1,12]; -b_coeff = [];%[1/20,4]; - -omega = 1/4; -dimension = 1; -display = 0; - -%% -[ Ah,Ahh,h ] = oneDLaplacianMatrix( n, L ); - -V = zeros(n,n); -for k =1:n - for i =1:n - V(i,k) = sin(i*k*pi/(n+1)); - end -end - - -[Vh,Dh] = eig(Ah); - -tmp = diag(V'*Vh); -for i=1:n - if tmp(i) < 0 - Vh(:,i) = -Vh(:,i); - end -end - - -x = zeros(n,1); -xdisplay = (linspace(0,1,ndisplay))'; -ydisplay = zeros(ndisplay,1); -if eigeninitialguess - for k =1:numeigenvectors - x = x + sin(k*pi*(h:h:(L-h))');%Vh(:,k); - ydisplay = ydisplay + sin(k*pi*xdisplay);%+ max(Vh(:,k))*sin(k*pi*xdisplay)/max(sin(k*pi*xdisplay)); - end -else - x = rand(n,1)-0.5;%V(:,1)+V(:,5)+V(:,21)+V(:,29)+V(:,209); - maxx = max(abs(x)); - x = x / maxx; -end -b = zeros(size(x)); -for i =1:length(b_coeff) - b = b + b_coeff(i)*sin(b_eigenvectors(i)*pi*(h:h:(L-h))'); -end - -x_old = x; -[x,M,x1,xH1,xH,xcc,AH,I_h_H,I_H_h] = twoGridCycle(x,Ah,b,omega,nu1,nu2,dimension,display,L,h); -x_new = x; - -max(abs(x)) - - -[VH,DH] = eig(AH); - -tmp = diag(VH'*I_h_H*Vh); -for i=1:((n-1)/2) - VH(:,i) = VH(:,i)/tmp(i); % change the norm -end - -scrsz = get(groot,'Screensize'); -figure('Position',[1 1 scrsz(3) scrsz(4)]) -subplot(2,1,1) -plot([0:h:L],[0;x_old;0],'linewidth',3) -hold on -plot([0:h:L],[0;x1;0],'linewidth',3) -plot([0:2*h:L],[0;xH1;0],'linewidth',3) -plot([0:2*h:L],[0;xH;0],'linewidth',3) -plot([0:h:L],[0;xcc;0],'linewidth',3) - -box on -grid on -plot([0:h:L],[0;x_new;0],'linewidth',3) -if eigeninitialguess - plot(xdisplay,ydisplay,'--','linewidth',2) -end -hold off -legend('initial guess','smoothed guess','smoothed guess on coars mesh','coars mesh solution','coars corrected','smoothed corrected' ,'Location','northoutside','Orientation','horizontal') - - -subplot(2,1,2) -plot(0:(n-1),Vh'*x_old,'linewidth',3) -hold on -plot(0:(n-1),Vh'*x1,'linewidth',3) -plot(0:((n-1)/2-1),VH'*xH1,'linewidth',3) -plot(0:((n-1)/2-1),VH'*xH,'linewidth',3) -plot(0:(n-1),Vh'*xcc,'linewidth',3) -box on -grid on -plot(0:(n-1),Vh'*x_new,'linewidth',3) - -%plot(0:((n-1)/2-1),VH'*I_h_H*x_old,'linewidth',3) - -xlim([0,n-1]) -hold off - - -B = Ah; -[V,D] = eig(B); -d = diag(D); -figure -subplot(2,3,1) -plot(real(d),imag(d),'o') -axis equal -subplot(2,3,4) -nbins = 100; -hist(real(d),nbins) - -B = M; -[V,D] = eig(B); -d = diag(D); -subplot(2,3,2) -plot(real(d),imag(d),'o') -axis equal -subplot(2,3,5) -nbins = 100; -hist(real(d),nbins) - -B = M*Ah; -[V,D] = eig(B); -d = diag(D); -subplot(2,3,3) -plot(real(d),imag(d),'o') -axis equal -subplot(2,3,6) -nbins = 100; -hist(real(d),nbins) - -% B\(M*b) -% Ah\b -% x_new - diff --git a/katoptron/matlab/Multigrid/testRichardsonSmoother.m b/katoptron/matlab/Multigrid/testRichardsonSmoother.m deleted file mode 100644 index 4361c424..00000000 --- a/katoptron/matlab/Multigrid/testRichardsonSmoother.m +++ /dev/null @@ -1,33 +0,0 @@ - -clear all -close all -clc -format long - -L = 1; -n = 100; -[ A,Ah,h ] = oneDLaplacianMatrix( n, L ); - -[V,D] = eig(A); -d = diag(D); - -figure -plot(d) - - -x = V(:,1)+V(:,5)+V(:,52); -maxx = max(abs(x)); -x = x / maxx; -b = zeros(size(x)); - -omega = 1/4; -nu = 20; -figure -plot([0:h:L],[0;x;0],'linewidth',2) -hold on -for i=1:10 - x = richardsonSmoother(x,A,b,omega,nu); - plot([0:h:L],[0;x;0],'linewidth',2) -end -box on -grid on \ No newline at end of file diff --git a/katoptron/matlab/Multigrid/twoGridCycle.m b/katoptron/matlab/Multigrid/twoGridCycle.m deleted file mode 100644 index 08d6327a..00000000 --- a/katoptron/matlab/Multigrid/twoGridCycle.m +++ /dev/null @@ -1,101 +0,0 @@ -function [xh,M,x1,xH1,xH,xcc,AH,I_h_H,I_H_h] = twoGridCycle(xh,Ah,bh,omega,nu1,nu2,dimension,display,L,h) - -if display - scrsz = get(groot,'Screensize'); - figure('Position',[1 scrsz(4)/2 scrsz(3) scrsz(4)/2]) - plot([0:h:L],[0;xh;0],'linewidth',3) - hold on - box on - grid on -end - -I = eye(size(Ah)); - -n = size(Ah,1); -if dimension == 1 - [I_h_H,n2] = oneDRestriction(n); - [I_H_h,n2] = oneDProlongation(n); -end - -AH = I_h_H * Ah * I_H_h; - -S_nu1 = eye(size(Ah)); -if nu1 >= 1 - [xh, S_nu1] = richardsonSmoother(xh,Ah,bh,omega,nu1); -end - -x1 = xh; - -if display - plot([0:h:L],[0;xh;0],'linewidth',3) -end - -rh = bh - Ah * xh; - -rH = I_h_H * rh; - -invAH = inv(AH); -deltaH = invAH*rH; - -xH1 = I_h_H * xh; -xH = xH1 + deltaH; - - -xh = xh + I_H_h * deltaH; -max(abs(xh - I_H_h * xH)) -%xh = I_H_h * xH; -%xH = I_h_H * xh; -max(abs(invAH*I_h_H*bh)) -max(abs(xH)) - -xcc = xh; - -if display - plot([0:h:L],[0;xh;0],'linewidth',3) -end - -S_nu2 = eye(size(Ah)); -if nu2 >= 1 - [xh, S_nu2] = richardsonSmoother(xh,Ah,bh,omega,nu2); -end - -if display - plot([0:h:L],[0;xh;0],'linewidth',3) - hold off - legend('initial guess','smoothed guess','coars corrected','smoothed corrected' ,'Location','northoutside','Orientation','horizontal') -end - -disp '1' -(I-I_H_h*invAH*I_h_H*Ah)*x1 -disp '2' -xcc - -M = S_nu2*(I-I_H_h*invAH*I_h_H*Ah)*S_nu1; - -if display - rank(I_H_h*AH*I_h_H) - [V,D] = eig(I_H_h*AH*I_h_H); - [V,D2] = eig(I-inv(M)*Ah);%eig(I-I_H_h*invAH*I_h_H*Ah); - d = diag(D); - figure('Position',[1 1 scrsz(3)/2 scrsz(4)/3]) - - plot(real(d),imag(d),'o','LineWidth',1,... - 'MarkerSize',8,... - 'MarkerEdgeColor','b',... - 'MarkerFaceColor','b'); - box on - grid on - - figure('Position',[scrsz(3)/2 1 scrsz(3)/2 scrsz(4)/3]) - edges = [-0.01:0.02:1.01]; - h = histogram(real(d),edges); -% d0 = find(d < 0.5); -% d1 = find(d > 0.5); -% plot([0,1],[length(d0),length(d1)],'o','LineWidth',1,... -% 'MarkerSize',8,... -% 'MarkerEdgeColor','b',... -% 'MarkerFaceColor','b'); - box on - grid on -end -end \ No newline at end of file diff --git a/katoptron/matlab/Richardson/oneDLaplacian.m b/katoptron/matlab/Richardson/oneDLaplacian.m deleted file mode 100644 index ac4ac5f5..00000000 --- a/katoptron/matlab/Richardson/oneDLaplacian.m +++ /dev/null @@ -1,117 +0,0 @@ -clear all -close all -clc - -n = 10; -nIter = n; -A = full(gallery('tridiag',n,-1,2,-1)); - -L = 1; -l = linspace(0,L,n); -h = l(2)-l(1); -A = A*(1/h^2); -A(1,1) = 1; -A(1,2) = 0; -A(end,end-1) = 0; -A(end,end) = 1; - -b = zeros(n,1); - -[V,D] = eig(A); - -max(max(abs(A*V-V*D))) - -d = diag(D); -%[d,indices] = sort(d,'descend'); -%V = V(:,indices); - -tau = 1/max(d); - -x = zeros(n,nIter); -coef = zeros(n,nIter); -x(:,1) = V(:,1); -res = zeros(nIter,1); -res(1) = norm(b - A*x(:,1)); -coef(:,1) = V'*x(:,1); -for i=2:nIter - x(:,i) = x(:,i-1) + tau*(b - A*x(:,i-1)); - res(i) = norm(b - A*x(:,i)); - - coef(:,i) = V'*x(:,i); -end - -figure -subplot(2,2,1) -ax = gca; -plot(3,d(3),'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor',ax.ColorOrder(ax.ColorOrderIndex,:)); -hold on -for i=4:n - if ax.ColorOrderIndex > size(ax.ColorOrder,1) - ax.ColorOrderIndex = 1; - end - plot(i,d(i),'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor',ax.ColorOrder(ax.ColorOrderIndex,:)); -end -plot(1,d(1),'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r'); -plot(2,d(2),'o','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor','r'); -hold off -xlim([1,n]) - -subplot(2,2,2) -ax = gca; -plot(1:nIter,abs(coef(3,:)),'o-','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor',ax.ColorOrder(ax.ColorOrderIndex,:)); -hold on -for i=4:n - if ax.ColorOrderIndex > size(ax.ColorOrder,1) - ax.ColorOrderIndex = 1; - end - plot(1:nIter,abs(coef(i,:)),'o-','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor',ax.ColorOrder(ax.ColorOrderIndex,:)); -end -hold off -xlim([1,nIter]) - -subplot(2,2,3) -ax = gca; -plot(l,x(:,1),'o-','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor',ax.ColorOrder(ax.ColorOrderIndex,:)); -hold on -for i=2:nIter - if ax.ColorOrderIndex > size(ax.ColorOrder,1) - ax.ColorOrderIndex = 1; - end - plot(l,x(:,i),'o-','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor',ax.ColorOrder(ax.ColorOrderIndex,:)); -end -hold off - -subplot(2,2,4) -ax = gca; -plot(1:nIter,res,'o-','LineWidth',0.5,... - 'MarkerSize',6,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor',ax.ColorOrder(ax.ColorOrderIndex,:)); -xlim([1,nIter]) - -% https://www.wolframalpha.com/input/?i=g(n%2B1)%3D(1-a)*g(n)%2Bb -% https://www.wolframalpha.com/input/?i=lim+n-%3Einf+((1-a)%5En+*(-a*b%2Ba*c%2Bb)%2B(a-1)*b)%2F((a-1)*a)+if+-1+%3C+(1-a)+%3C1 diff --git a/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/.gitattributes b/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/.gitattributes deleted file mode 100755 index e966fd74..00000000 --- a/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Declare files that will always have CRLF line endings on checkout. -*.* text eol=crlf diff --git a/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/LICENSE.TXT b/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/LICENSE.TXT deleted file mode 100755 index d0381d6d..00000000 --- a/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/LICENSE.TXT +++ /dev/null @@ -1,176 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/README.md b/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/README.md deleted file mode 100755 index 4f692454..00000000 --- a/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/README.md +++ /dev/null @@ -1,85 +0,0 @@ -BrewerMap -========= - -The complete palette of ColorBrewer colormaps for MATLAB. Simple selection by scheme name and map length. - - -One function provides the complete selection of the ColorBrewer colorschemes, especially intended for mapping and plots with attractive, distinguishable colors. - -Simple to use: only the the colormap length and the colorscheme name are needed to select and define an output colormap. The colorscheme can be preselected by the user, after which only the colormap length is required to define an output colormap. - -The function can be used as a drop-in replacement for the inbuilt colormap functions and it is compatible with all MATLAB functions that require a colormap. The function consists of just one M-file that provides all of the ColorBrewer colorschemes (no mat file, no third party files, no file-clutter!). Downsampling or interpolation of the nodes occurs automatically, if required (interpolation occurs within the Lab colorspace). As an option, the colormap can be returned reversed. - -Calling brewermap('demo') creates a figure that displays all of the ColorBrewer colorschemes. - -This product includes color specifications and designs developed by Cynthia Brewer (http://colorbrewer.org/). See the ColorBrewer website for further information about each colorscheme, colorblind suitability, licensing, and citations. - -### Examples ### - - % Plot a scheme's RGB values: - rgbplot(brewermap(9,'Blues')) % standard - rgbplot(brewermap(9,'*Blues')) % reversed - - % View information about a colorscheme: - [~,num,typ] = brewermap(0,'Paired') - num = 12 - typ = 'Qualitative' - - % Multiline plot using matrices: - N = 6; - axes('ColorOrder',brewermap(N,'Pastel2'),'NextPlot','replacechildren') - X = linspace(0,pi*3,1000); - Y = bsxfun(@(x,n)n*sin(x+2*n*pi/N), X.', 1:N); - plot(X,Y, 'linewidth',4) - - % Multiline plot in a loop: - N = 6; - set(0,'DefaultAxesColorOrder',brewermap(N,'Accent')) - X = linspace(0,pi*3,1000); - Y = bsxfun(@(x,n)n*sin(x+2*n*pi/N), X.', 1:N); - for n = 1:N - plot(X(:),Y(:,n), 'linewidth',4); - hold all - end - - % New colors for the COLORMAP example: - load spine - image(X) - colormap(brewermap([],'YlGnBu')) - - % New colors for the SURF example: - [X,Y,Z] = peaks(30); - surfc(X,Y,Z) - colormap(brewermap([],'RdYlGn')) - axis([-3,3,-3,3,-10,5]) - - % New colors for the CONTOURCMAP example: - brewermap('PuOr'); % preselect the colorscheme. - load topo - load coast - figure - worldmap(topo, topolegend) - contourfm(topo, topolegend); - contourcmap('brewermap', 'Colorbar','on', 'Location','horizontal',... - 'TitleString','Contour Intervals in Meters'); - plotm(lat, long, 'k') - -### Note ### - -Note that the function BREWERMAP: -* Consists of just one convenient M-file (no .mat files or file clutter). -* No third-party file dependencies. -* Interpolates in the Lab colorspace. -* Requires just the standard ColorBrewer scheme name to select the colorscheme. -* Supports all ColorBrewer colorschemes. -* Outputs a MATLAB standard N-by-3 numeric RGB array. -* Default length is the standard MATLAB default colormap length (same length as the current colormap). -* Is compatible with all MATLAB functions that use colormaps (eg: CONTOURCMAP). -* Includes the option to reverse the colormap color sequence. -* Does not break ColorBrewer's Apache license conditions! - -### Note ### - -The following files are part of GitHub/git repository, and are not required for using this submission in MATLAB: -* .gitattributes -* README.md diff --git a/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/brewermap.m b/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/brewermap.m deleted file mode 100755 index 4d2b0dc6..00000000 --- a/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/brewermap.m +++ /dev/null @@ -1,518 +0,0 @@ -function [map,num,typ] = brewermap(N,scheme) -% The complete selection of ColorBrewer colorschemes (RGB colormaps). -% -% (c) 2017 Stephen Cobeldick -% -% Returns any RGB colormap from the ColorBrewer colorschemes, especially -% intended for mapping and plots with attractive, distinguishable colors. -% -%%% Syntax (basic): -% map = brewermap(N,scheme); % Select colormap length, select any colorscheme. -% brewermap('demo') % View a figure showing all ColorBrewer colorschemes. -% schemes = brewermap('list')% Return a list of all ColorBrewer colorschemes. -% [map,num,typ] = brewermap(...); % The current colorscheme's number of nodes and type. -% -%%% Syntax (preselect colorscheme): -% old = brewermap(scheme); % Preselect any colorscheme, return the previous scheme. -% map = brewermap(N); % Use preselected scheme, select colormap length. -% map = brewermap; % Use preselected scheme, length same as current figure's colormap. -% -% See also CUBEHELIX RGBPLOT3 RGBPLOT COLORMAP COLORBAR PLOT PLOT3 SURF IMAGE AXES SET JET LBMAP PARULA -% -%% Color Schemes %% -% -% This product includes color specifications and designs developed by Cynthia Brewer. -% See the ColorBrewer website for further information about each colorscheme, -% colour-blind suitability, licensing, and citations: http://colorbrewer.org/ -% -% To reverse the colormap sequence simply prefix the string token with '*'. -% -% Each colorscheme is defined by a set of hand-picked RGB values (nodes). -% If <N> is greater than the requested colorscheme's number of nodes then: -% * Sequential and Diverging schemes are interpolated to give a larger -% colormap. The interpolation is performed in the Lab colorspace. -% * Qualitative schemes are repeated to give a larger colormap. -% Else: -% * Exact values from the ColorBrewer sequences are returned for all schemes. -% -%%% Diverging -% -% Scheme|'BrBG'|'PRGn'|'PiYG'|'PuOr'|'RdBu'|'RdGy'|'RdYlBu'|'RdYlGn'|'Spectral'| -% ------|------|------|------|------|------|------|--------|--------|----------| -% Nodes | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 11 | 11 | -% -%%% Qualitative -% -% Scheme|'Accent'|'Dark2'|'Paired'|'Pastel1'|'Pastel2'|'Set1'|'Set2'|'Set3'| -% ------|--------|-------|--------|---------|---------|------|------|------| -% Nodes | 8 | 8 | 12 | 9 | 8 | 9 | 8 | 12 | -% -%%% Sequential -% -% Scheme|'Blues'|'BuGn'|'BuPu'|'GnBu'|'Greens'|'Greys'|'OrRd'|'Oranges'|'PuBu'| -% ------|-------|------|------|------|--------|-------|------|---------|------| -% Nodes | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | -% -% Scheme|'PuBuGn'|'PuRd'|'Purples'|'RdPu'|'Reds'|'YlGn'|'YlGnBu'|'YlOrBr'|'YlOrRd'| -% ------|--------|------|---------|------|------|------|--------|--------|--------| -% Nodes | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | -% -%% Examples %% -% -%%% Plot a scheme's RGB values: -% rgbplot(brewermap(9,'Blues')) % standard -% rgbplot(brewermap(9,'*Blues')) % reversed -% -%%% View information about a colorscheme: -% [~,num,typ] = brewermap(0,'Paired') -% num = 12 -% typ = 'Qualitative' -% -%%% Multi-line plot using matrices: -% N = 6; -% axes('ColorOrder',brewermap(N,'Pastel2'),'NextPlot','replacechildren') -% X = linspace(0,pi*3,1000); -% Y = bsxfun(@(x,n)n*sin(x+2*n*pi/N), X(:), 1:N); -% plot(X,Y, 'linewidth',4) -% -%%% Multi-line plot in a loop: -% N = 6; -% set(0,'DefaultAxesColorOrder',brewermap(N,'Accent')) -% X = linspace(0,pi*3,1000); -% Y = bsxfun(@(x,n)n*sin(x+2*n*pi/N), X(:), 1:N); -% for n = 1:N -% plot(X(:),Y(:,n), 'linewidth',4); -% hold all -% end -% -%%% New colors for the COLORMAP example: -% load spine -% image(X) -% colormap(brewermap([],'YlGnBu')) -% -%%% New colors for the SURF example: -% [X,Y,Z] = peaks(30); -% surfc(X,Y,Z) -% colormap(brewermap([],'RdYlGn')) -% axis([-3,3,-3,3,-10,5]) -% -%%% New colors for the CONTOURCMAP example: -% brewermap('PuOr'); % preselect the colorscheme. -% load topo -% load coast -% figure -% worldmap(topo, topolegend) -% contourfm(topo, topolegend); -% contourcmap('brewermap', 'Colorbar','on', 'Location','horizontal',... -% 'TitleString','Contour Intervals in Meters'); -% plotm(lat, long, 'k') -% -%% Input and Output Arguments %% -% -%%% Inputs (*=default): -% N = NumericScalar, N>=0, an integer to define the colormap length. -% = *[], use the length of the current figure's colormap (see COLORMAP). -% = StringToken, to preselect this ColorBrewer scheme for later use. -% = 'demo', create a figure showing all of the ColorBrewer schemes. -% = 'list', return a cell array of strings listing all ColorBrewer schemes. -% scheme = StringToken, a ColorBrewer scheme name to select the colorscheme. -% = *none, use the preselected colorscheme (must be set previously!). -% -%%% Outputs: -% map = NumericMatrix, size Nx3, a colormap of RGB values between 0 and 1. -% num = NumericScalar, the number of nodes defining the ColorBrewer scheme. -% typ = String, the colorscheme type: 'Diverging'/'Qualitative'/'Sequential'. -% OR -% schemes = CellArray of Strings, a list of every ColorBrewer scheme. -% -% [map,num,typ] = brewermap(*N,*scheme) -% OR -% schemes = brewermap('list') - -%% Input Wrangling %% -% -persistent tok isr -% -str = 'A colorscheme must be preselected before calling without a scheme token.'; -% -% The order of names in <vec>: case-insensitive sort by type and then by name: -vec = {'BrBG';'PiYG';'PRGn';'PuOr';'RdBu';'RdGy';'RdYlBu';'RdYlGn';'Spectral';'Accent';'Dark2';'Paired';'Pastel1';'Pastel2';'Set1';'Set2';'Set3';'Blues';'BuGn';'BuPu';'GnBu';'Greens';'Greys';'OrRd';'Oranges';'PuBu';'PuBuGn';'PuRd';'Purples';'RdPu';'Reds';'YlGn';'YlGnBu';'YlOrBr';'YlOrRd'}; -% -if nargin==0 % Current figure's colormap length and the preselected colorscheme. - assert(~isempty(tok),str) - [map,num,typ] = bmSample([],isr,tok); -elseif nargin==2 % Input colormap length and colorscheme. - assert(isnumeric(N),'The first argument must be a scalar numeric, or empty.') - assert(ischar(scheme)&&isrow(scheme),'The second argument must be a string.') - tmp = strncmp('*',scheme,1); - [map,num,typ] = bmSample(N,tmp,bmMatch(vec,scheme(1+tmp:end))); -elseif isnumeric(N) % Input colormap length and the preselected colorscheme. - assert(~isempty(tok),str) - [map,num,typ] = bmSample(N,isr,tok); -else% String - assert(ischar(N)&&isrow(N),'The first argument must be a string or scalar numeric.') - switch lower(N) - case 'demo' % Plot all colorschemes in a figure. - bmDemoFig(vec) - case 'list' % Return a list of all colorschemes. - [num,typ] = cellfun(@bmSelect,vec,'UniformOutput',false); - num = cat(1,num{:}); - map = vec; - otherwise % Store the preselected colorscheme token. - map = tok; - tmp = strncmp('*',N,1); - tok = bmMatch(vec,N(1+tmp:end)); - [num,typ] = bmSelect(tok); - isr = tmp; % only update |isr| when name is okay. - end -end -% -end -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%brewermap -function tok = bmMatch(vec,str) -idx = strcmpi(vec,str); -assert(any(idx),'Colorscheme "%s" is not supported. Check the token tables.',str) -tok = vec{idx}; -end -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%bmMatch -function [map,num,typ] = bmSample(N,isr,tok) -% Pick a colorscheme, downsample/interpolate to the requested colormap length. -% -if isempty(N) - N = size(get(gcf,'colormap'),1); -else - assert(isscalar(N)&&isreal(N),'First argument must be a real numeric scalar, or empty.') -end -% -% obtain nodes: -[num,typ,rgb] = bmSelect(tok); -% downsample: -[idx,itp] = bmIndex(N,num,typ,isr); -map = rgb(idx,:); -% interpolate: -if itp - M = [3.2406,-1.5372,-0.4986;-0.9689,1.8758,0.0415;0.0557,-0.2040,1.0570]; - wpt = [0.95047,1,1.08883]; % D65 - % - map = bmRGB2Lab(map,M,wpt); % optional - % - % Extrapolate a small amount at both ends: - %vec = linspace(0,num+1,N+2); - %map = interp1(1:num,map,vec(2:end-1),'linear','extrap'); - % Interpolation completely within ends: - map = interp1(1:num,map,linspace(1,num,N),'spline'); - % - map = bmLab2RGB(map,M,wpt); % optional -end -% -end -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%bmSample -function rgb = bmGammaCor(rgb) -% Gamma correction of RGB data. -idx = rgb <= 0.0031308; -rgb(idx) = 12.92 * rgb(idx); -rgb(~idx) = real(1.055 * rgb(~idx).^(1/2.4) - 0.055); -end -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%bmGammaCor -function rgb = bmGammaInv(rgb) -% Inverse gamma correction of RGB data. -idx = rgb <= 0.04045; -rgb(idx) = rgb(idx) / 12.92; -rgb(~idx) = real(((rgb(~idx) + 0.055) / 1.055).^2.4); -end -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%bmGammaInv -function lab = bmRGB2Lab(rgb,M,wpt) % Nx3 <- Nx3 -% Convert a matrix of RGB values to Lab. -% -%applycform(rgb,makecform('srgb2lab','AdaptedWhitePoint',wpt)) -% -% RGB2XYZ: -xyz = (M \ bmGammaInv(rgb.')).'; -% Remember to include my license when copying my implementation. -% XYZ2Lab: -xyz = bsxfun(@rdivide,xyz,wpt); -idx = xyz>(6/29)^3; -F = idx.*(xyz.^(1/3)) + ~idx.*(xyz*(29/6)^2/3+4/29); -lab(:,2:3) = bsxfun(@times,[500,200],F(:,1:2)-F(:,2:3)); -lab(:,1) = 116*F(:,2) - 16; -% -end -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%bmRGB2Lab -function rgb = bmLab2RGB(lab,M,wpt) % Nx3 <- Nx3 -% Convert a matrix of Lab values to RGB. -% -%applycform(lab,makecform('lab2srgb','AdaptedWhitePoint',wpt)) -% -% Lab2XYZ -tmp = bsxfun(@rdivide,lab(:,[2,1,3]),[500,Inf,-200]); -tmp = bsxfun(@plus,tmp,(lab(:,1)+16)/116); -idx = tmp>(6/29); -tmp = idx.*(tmp.^3) + ~idx.*(3*(6/29)^2*(tmp-4/29)); -xyz = bsxfun(@times,tmp,wpt); -% Remember to include my license when copying my implementation. -% XYZ2RGB -rgb = max(0,min(1, bmGammaCor(xyz * M.'))); -% -end -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%cbLab2RGB -function bmDemoFig(seq) -% Creates a figure showing all of the ColorBrewer colorschemes. -% -persistent cbh axh -% -xmx = max(cellfun(@bmSelect,seq)); -ymx = numel(seq); -% -if ishghandle(cbh) - figure(cbh); - delete(axh); -else - cbh = figure('HandleVisibility','callback', 'IntegerHandle','off',... - 'NumberTitle','off', 'Name',[mfilename,' Demo'],'Color','white'); -end -% -axh = axes('Parent',cbh, 'Color','none',... - 'XTick',0:xmx, 'YTick',0.5:ymx, 'YTickLabel',seq, 'YDir','reverse'); -title(axh,['ColorBrewer Color Schemes (',mfilename,'.m)'], 'Interpreter','none') -xlabel(axh,'Scheme Nodes') -ylabel(axh,'Scheme Name') -axf = get(axh,'FontName'); -% -for y = 1:ymx - [num,typ,rgb] = bmSelect(seq{y}); - map = rgb(bmIndex(num,num,typ,false),:); % downsample - for x = 1:num - patch([x-1,x-1,x,x],[y-1,y,y,y-1],1, 'FaceColor',map(x,:), 'Parent',axh) - end - text(xmx+0.1,y-0.5,typ, 'Parent',axh, 'FontName',axf) -end -% -end -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%bmDemoFig -function [idx,itp] = bmIndex(N,num,typ,isr) -% Ensure exactly the same colors as in the online ColorBrewer schemes. -% -itp = N>num; -switch typ - case 'Qualitative' - itp = false; - idx = 1+mod(0:N-1,num); - case 'Diverging' - switch N - case 1 % extrapolated - idx = 8; - case 2 % extrapolated - idx = [4,12]; - case 3 - idx = [5,8,11]; - case 4 - idx = [3,6,10,13]; - case 5 - idx = [3,6,8,10,13]; - case 6 - idx = [2,5,7,9,11,14]; - case 7 - idx = [2,5,7,8,9,11,14]; - case 8 - idx = [2,4,6,7,9,10,12,14]; - case 9 - idx = [2,4,6,7,8,9,10,12,14]; - case 10 - idx = [1,2,4,6,7,9,10,12,14,15]; - otherwise - idx = [1,2,4,6,7,8,9,10,12,14,15]; - end - case 'Sequential' - switch N - case 1 % extrapolated - idx = 6; - case 2 % extrapolated - idx = [4,8]; - case 3 - idx = [3,6,9]; - case 4 - idx = [2,5,7,10]; - case 5 - idx = [2,5,7,9,11]; - case 6 - idx = [2,4,6,7,9,11]; - case 7 - idx = [2,4,6,7,8,10,12]; - case 8 - idx = [1,3,4,6,7,8,10,12]; - otherwise - idx = [1,3,4,6,7,8,10,11,13]; - end - otherwise - error('The colorscheme type "%s" is not recognized',typ) -end -% -if isr - idx = idx(end:-1:1); -end -% -end -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%bmIndex -function [num,typ,rgb] = bmSelect(tok) -% Return the length, type and RGB values of any colorscheme. -% -switch tok % ColorName - case 'BrBG' - rgb = [84,48,5;140,81,10;166,97,26;191,129,45;216,179,101;223,194,125;246,232,195;245,245,245;199,234,229;128,205,193;90,180,172;53,151,143;1,133,113;1,102,94;0,60,48]; - typ = 'Diverging'; - case 'PiYG' - rgb = [142,1,82;197,27,125;208,28,139;222,119,174;233,163,201;241,182,218;253,224,239;247,247,247;230,245,208;184,225,134;161,215,106;127,188,65;77,172,38;77,146,33;39,100,25]; - typ = 'Diverging'; - case 'PRGn' - rgb = [64,0,75;118,42,131;123,50,148;153,112,171;175,141,195;194,165,207;231,212,232;247,247,247;217,240,211;166,219,160;127,191,123;90,174,97;0,136,55;27,120,55;0,68,27]; - typ = 'Diverging'; - case 'PuOr' - rgb = [127,59,8;179,88,6;230,97,1;224,130,20;241,163,64;253,184,99;254,224,182;247,247,247;216,218,235;178,171,210;153,142,195;128,115,172;94,60,153;84,39,136;45,0,75]; - typ = 'Diverging'; - case 'RdBu' - rgb = [103,0,31;178,24,43;202,0,32;214,96,77;239,138,98;244,165,130;253,219,199;247,247,247;209,229,240;146,197,222;103,169,207;67,147,195;5,113,176;33,102,172;5,48,97]; - typ = 'Diverging'; - case 'RdGy' - rgb = [103,0,31;178,24,43;202,0,32;214,96,77;239,138,98;244,165,130;253,219,199;255,255,255;224,224,224;186,186,186;153,153,153;135,135,135;64,64,64;77,77,77;26,26,26]; - typ = 'Diverging'; - case 'RdYlBu' - rgb = [165,0,38;215,48,39;215,25,28;244,109,67;252,141,89;253,174,97;254,224,144;255,255,191;224,243,248;171,217,233;145,191,219;116,173,209;44,123,182;69,117,180;49,54,149]; - typ = 'Diverging'; - case 'RdYlGn' - rgb = [165,0,38;215,48,39;215,25,28;244,109,67;252,141,89;253,174,97;254,224,139;255,255,191;217,239,139;166,217,106;145,207,96;102,189,99;26,150,65;26,152,80;0,104,55]; - typ = 'Diverging'; - case 'Spectral' - rgb = [158,1,66;213,62,79;215,25,28;244,109,67;252,141,89;253,174,97;254,224,139;255,255,191;230,245,152;171,221,164;153,213,148;102,194,165;43,131,186;50,136,189;94,79,162]; - typ = 'Diverging'; - case 'Accent' - rgb = [127,201,127;190,174,212;253,192,134;255,255,153;56,108,176;240,2,127;191,91,23;102,102,102]; - typ = 'Qualitative'; - case 'Dark2' - rgb = [27,158,119;217,95,2;117,112,179;231,41,138;102,166,30;230,171,2;166,118,29;102,102,102]; - typ = 'Qualitative'; - case 'Paired' - rgb = [166,206,227;31,120,180;178,223,138;51,160,44;251,154,153;227,26,28;253,191,111;255,127,0;202,178,214;106,61,154;255,255,153;177,89,40]; - typ = 'Qualitative'; - case 'Pastel1' - rgb = [251,180,174;179,205,227;204,235,197;222,203,228;254,217,166;255,255,204;229,216,189;253,218,236;242,242,242]; - typ = 'Qualitative'; - case 'Pastel2' - rgb = [179,226,205;253,205,172;203,213,232;244,202,228;230,245,201;255,242,174;241,226,204;204,204,204]; - typ = 'Qualitative'; - case 'Set1' - rgb = [228,26,28;55,126,184;77,175,74;152,78,163;255,127,0;255,255,51;166,86,40;247,129,191;153,153,153]; - typ = 'Qualitative'; - case 'Set2' - rgb = [102,194,165;252,141,98;141,160,203;231,138,195;166,216,84;255,217,47;229,196,148;179,179,179]; - typ = 'Qualitative'; - case 'Set3' - rgb = [141,211,199;255,255,179;190,186,218;251,128,114;128,177,211;253,180,98;179,222,105;252,205,229;217,217,217;188,128,189;204,235,197;255,237,111]; - typ = 'Qualitative'; - case 'Blues' - rgb = [247,251,255;239,243,255;222,235,247;198,219,239;189,215,231;158,202,225;107,174,214;66,146,198;49,130,189;33,113,181;8,81,156;8,69,148;8,48,107]; - typ = 'Sequential'; - case 'BuGn' - rgb = [247,252,253;237,248,251;229,245,249;204,236,230;178,226,226;153,216,201;102,194,164;65,174,118;44,162,95;35,139,69;0,109,44;0,88,36;0,68,27]; - typ = 'Sequential'; - case 'BuPu' - rgb = [247,252,253;237,248,251;224,236,244;191,211,230;179,205,227;158,188,218;140,150,198;140,107,177;136,86,167;136,65,157;129,15,124;110,1,107;77,0,75]; - typ = 'Sequential'; - case 'GnBu' - rgb = [247,252,240;240,249,232;224,243,219;204,235,197;186,228,188;168,221,181;123,204,196;78,179,211;67,162,202;43,140,190;8,104,172;8,88,158;8,64,129]; - typ = 'Sequential'; - case 'Greens' - rgb = [247,252,245;237,248,233;229,245,224;199,233,192;186,228,179;161,217,155;116,196,118;65,171,93;49,163,84;35,139,69;0,109,44;0,90,50;0,68,27]; - typ = 'Sequential'; - case 'Greys' - rgb = [255,255,255;247,247,247;240,240,240;217,217,217;204,204,204;189,189,189;150,150,150;115,115,115;99,99,99;82,82,82;37,37,37;37,37,37;0,0,0]; - typ = 'Sequential'; - case 'OrRd' - rgb = [255,247,236;254,240,217;254,232,200;253,212,158;253,204,138;253,187,132;252,141,89;239,101,72;227,74,51;215,48,31;179,0,0;153,0,0;127,0,0]; - typ = 'Sequential'; - case 'Oranges' - rgb = [255,245,235;254,237,222;254,230,206;253,208,162;253,190,133;253,174,107;253,141,60;241,105,19;230,85,13;217,72,1;166,54,3;140,45,4;127,39,4]; - typ = 'Sequential'; - case 'PuBu' - rgb = [255,247,251;241,238,246;236,231,242;208,209,230;189,201,225;166,189,219;116,169,207;54,144,192;43,140,190;5,112,176;4,90,141;3,78,123;2,56,88]; - typ = 'Sequential'; - case 'PuBuGn' - rgb = [255,247,251;246,239,247;236,226,240;208,209,230;189,201,225;166,189,219;103,169,207;54,144,192;28,144,153;2,129,138;1,108,89;1,100,80;1,70,54]; - typ = 'Sequential'; - case 'PuRd' - rgb = [247,244,249;241,238,246;231,225,239;212,185,218;215,181,216;201,148,199;223,101,176;231,41,138;221,28,119;206,18,86;152,0,67;145,0,63;103,0,31]; - typ = 'Sequential'; - case 'Purples' - rgb = [252,251,253;242,240,247;239,237,245;218,218,235;203,201,226;188,189,220;158,154,200;128,125,186;117,107,177;106,81,163;84,39,143;74,20,134;63,0,125]; - typ = 'Sequential'; - case 'RdPu' - rgb = [255,247,243;254,235,226;253,224,221;252,197,192;251,180,185;250,159,181;247,104,161;221,52,151;197,27,138;174,1,126;122,1,119;122,1,119;73,0,106]; - typ = 'Sequential'; - case 'Reds' - rgb = [255,245,240;254,229,217;254,224,210;252,187,161;252,174,145;252,146,114;251,106,74;239,59,44;222,45,38;203,24,29;165,15,21;153,0,13;103,0,13]; - typ = 'Sequential'; - case 'YlGn' - rgb = [255,255,229;255,255,204;247,252,185;217,240,163;194,230,153;173,221,142;120,198,121;65,171,93;49,163,84;35,132,67;0,104,55;0,90,50;0,69,41]; - typ = 'Sequential'; - case 'YlGnBu' - rgb = [255,255,217;255,255,204;237,248,177;199,233,180;161,218,180;127,205,187;65,182,196;29,145,192;44,127,184;34,94,168;37,52,148;12,44,132;8,29,88]; - typ = 'Sequential'; - case 'YlOrBr' - rgb = [255,255,229;255,255,212;255,247,188;254,227,145;254,217,142;254,196,79;254,153,41;236,112,20;217,95,14;204,76,2;153,52,4;140,45,4;102,37,6]; - typ = 'Sequential'; - case 'YlOrRd' - rgb = [255,255,204;255,255,178;255,237,160;254,217,118;254,204,92;254,178,76;253,141,60;252,78,42;240,59,32;227,26,28;189,0,38;177,0,38;128,0,38]; - typ = 'Sequential'; - otherwise - error('Colorscheme "%s" is not supported. Check the token tables.',tok) -end -% -rgb = rgb./255; -% -switch typ - case 'Diverging' - num = 11; - case 'Qualitative' - num = size(rgb,1); - case 'Sequential' - num = 9; - otherwise - error('The colorscheme type "%s" is not recognized',typ) -end -% -end -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%bmSelect -% Code and Implementation: -% Copyright (c) 2017 Stephen Cobeldick -% Color Specifications Only: -% Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State University. -% -% Licensed under the Apache License, Version 2.0 (the "License"); -% you may not use this file except in compliance with the License. -% You may obtain a copy of the License at -% -% http://www.apache.org/licenses/LICENSE-2.0 -% -% Unless required by applicable law or agreed to in writing, software -% distributed under the License is distributed on an "AS IS" BASIS, -% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -% See the License for the specific language governing permissions and limitations under the License. -% -% Redistribution and use in source and binary forms, with or without -% modification, are permitted provided that the following conditions are met: -% -% 1. Redistributions as source code must retain the above copyright notice, this -% list of conditions and the following disclaimer. -% -% 2. The end-user documentation included with the redistribution, if any, must -% include the following acknowledgment: "This product includes color -% specifications and designs developed by Cynthia Brewer -% (http://colorbrewer.org/)." Alternately, this acknowledgment may appear in the -% software itself, if and wherever such third-party acknowledgments normally appear. -% -% 4. The name "ColorBrewer" must not be used to endorse or promote products -% derived from this software without prior written permission. For written -% permission, please contact Cynthia Brewer at cbrewer@psu.edu. -% -% 5. Products derived from this software may not be called "ColorBrewer", nor -% may "ColorBrewer" appear in their name, without prior written permission of Cynthia Brewer. -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%license \ No newline at end of file diff --git a/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/brewermap_view.m b/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/brewermap_view.m deleted file mode 100755 index d1661447..00000000 --- a/katoptron/matlab/TPL/DrosteEffect-BrewerMap-c64a384/brewermap_view.m +++ /dev/null @@ -1,323 +0,0 @@ -function [map,scheme] = brewermap_view(N,scheme) -% An interactive figure for ColorBrewer colormap selection. With demo! -% -% (c) 2017 Stephen Cobeldick -% -% View Cynthia Brewer's ColorBrewer color schemes in a figure. -% -% * Two colorbars give the color scheme in color and grayscale. -% * A button toggles between 3D-cube and 2D-lineplot of the RGB values. -% * A button toggles an endless cycle through the color schemes. -% * A button reverses the colormap. -% * 35 buttons select any ColorBrewer color scheme. -% * Text with the color scheme's type (Diverging/Qualitative/Sequential) -% * Text with the color scheme's number of nodes (defining colors). -% -%%% Syntax: -% brewermap_view -% brewermap_view(N) -% brewermap_view(N,scheme) -% brewermap_view([],...) -% brewermap_view({axes/figure handles},...) % see "Adjust External Colormaps" -% [map,scheme] = brewermap_view(...) -% -% Calling the function with an output argument blocks MATLAB execution until -% the figure is deleted: the final colormap and scheme are then returned. -% -% See also BREWERMAP CUBEHELIX RGBPLOT COLORMAP COLORMAPEDITOR COLORBAR UICONTROL ADDLISTENER -% -%% Adjust Colormaps of Other Figures or Axes %% -% -%%% Example: -% -% load spine -% image(X) -% brewermap_view({gca}) -% -% Very useful! Simply provide a cell array of axes or figure handles when -% calling this function, and their colormaps will be updated in real-time: -% note that MATLAB versions <=2010 only support axes handles for this! -% -%% Input and Output Arguments %% -% -%%% Inputs (*=default): -% N = NumericScalar, an integer to define the colormap length. -% = *[], colormap length of one hundred and twenty-eight (128). -% = {axes/figure handles}, their colormaps will be updated by BREWERMAP_VIEW. -% scheme = String, a ColorBrewer color scheme name. -% -%%% Outputs (these block execution until the figure is deleted!): -% map = NumericMatrix, the colormap defined when the figure is closed. -% scheme = StringToken, the name of the color scheme given in <map>. -% -% [map,scheme] = brewermap_view(N,scheme) - -%% Input Wrangling %% -% -persistent H -% -xtH = {}; -% Parse colormap size: -if nargin<1 || isnumeric(N)&&isempty(N) - N = 128; -elseif iscell(N)&&numel(N) - ish = all(1==cellfun('prodofsize',N)&cellfun(@ishghandle,N)); - assert(ish,'Input <N> may be a cell array of scalar axes or figure handles.') - xtH = N; - N = size(colormap(xtH{1}),1); -else - assert(isnumeric(N)&&isscalar(N),'Input <N> must be a scalar numeric.') - assert(isreal(N)&&fix(N)==N&&N>0,'Input <N> must be positive real integer: %g+%gi',N,imag(N)) - N = double(N); -end -% -[mcs,mun,pyt] = brewermap('list'); -% -% Parse scheme name: -if nargin<2 - scheme = mcs{1+rem(round(now*1e7),numel(mcs))}; -else - assert(ischar(scheme)&&isrow(scheme),'Second input <scheme> must be a string.') -end -% Check if a reversed colormap was requested: -isR = strncmp(scheme,'*',1); -scheme = scheme(1+isR:end); -% -%% Create Figure %% -% -% LHS and RHS slider bounds/limits, and slider step sizes: -lbd = 1; -rbd = 128; -% -% Define the 3D cube axis order: -xyz = 'RGB'; -[~,xyz] = ismember(xyz,'RGB'); -% -if isempty(H) || ~ishghandle(H.fig) - % Check brewermap version: - ers = 'The function BREWERMAP returned an unexpected %s.'; - assert(all(35==[numel(mcs),numel(mun),numel(pyt)]),ers,'array size') - tmp = find(any(diff(+char(pyt)),2)); - assert(numel(tmp)==2&&all(tmp==[9;17]),ers,'scheme name sequence') - % - % Create a new figure: - ClBk = struct('bmvChgS',@bmvChgS, 'bmvRevM',@bmvRevM,... - 'bmv2D3D',@bmv2D3D, 'bmvDemo',@bmvDemo, 'bmvSldr',@bmvSldr); - H = bmvPlot(N,scheme, mcs, lbd, rbd, xyz, ClBk); -end -% -bmvUpDt() -% -if nargout - waitfor(H.fig); -else - clear map -end -% -%% Nested Functions %% -% - function bmvUpDt() - % Update all graphics objects in the figure. - % - % Get ColorBrewer colormap and grayscale equivalent: - [map,num,typ] = brewermap(N,[char(42*ones(1,isR)),scheme]); - mag = sum(map*[0.298936;0.587043;0.114021],2); - % - % Update colorbar values: - set(H.cbAx, 'YLim', [0,abs(N)+(N==0)]+0.5); - set(H.cbIm(1), 'CData',reshape(map,[],1,3)) - set(H.cbIm(2), 'CData',repmat(mag,[1,1,3])) - % - % Update 2D line / 3D patch values: - if get(H.D2D3, 'Value') % 2D - set(H.ln2D, 'XData',linspace(0,1,abs(N))); - set(H.ln2D, {'YData'},num2cell([map,mag],1).'); - else % 3D - set(H.pt3D,... - 'XData',map(:,xyz(1)),... - 'YData',map(:,xyz(2)),... - 'ZData',map(:,xyz(3)), 'FaceVertexCData',map) - end - % - % Update reverse button: - set(H.bRev, 'Value',isR) - % - % Update warning text: - str = {typ;sprintf('%d Nodes',num)}; - set(H.warn,'String',str); - % - % Update parameter value text: - set(H.vTxt(1), 'String',sprintf('N = %.0f',N)); - % - % Update external axes/figure: - for k = find(cellfun(@ishghandle,xtH)) - colormap(xtH{k},map); - end - end -% - function bmv2D3D(h,~) - % Switch between 2D-line and 3D-cube representation. - % - if get(h,'Value') % 2D - set(H.ax3D, 'HitTest','off', 'Visible','off') - set(H.ax2D, 'HitTest','on') - set(H.pt3D, 'Visible','off') - set(H.ln2D, 'Visible','on') - else % 3D - set(H.ax2D, 'HitTest','off') - set(H.ax3D, 'HitTest','on', 'Visible','on') - set(H.ln2D, 'Visible','off') - set(H.pt3D, 'Visible','on') - end - % - bmvUpDt(); - end -% - function bmvChgS(~,e) - % Change the color scheme. - % - scheme = get(e.NewValue,'String'); - % - bmvUpDt() - end -% - function bmvRevM(h,~) - % Reverse the colormap. - % - isR = get(h,'Value'); - % - bmvUpDt() - end -% - function bmvSldr(~,~) - % Update the slider position. - % - N = round(get(H.vSld,'Value')); - % - bmvUpDt() - end -% - function bmvDemo(h,~) - % Display all ColorBrewer schemes sequentially. - % - while ishghandle(h)&&get(h,'Value') - % - ids = 1+mod(find(strcmpi(scheme,mcs)),numel(mcs)); - set(H.bGrp,'SelectedObject',H.bEig(ids)); - scheme = mcs{ids}; - % - bmvUpDt(); - % - % Faster/slower: - pause(1.2); - end - % - end -% -end -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%brewermap_view -function H = bmvPlot(N,scheme, mcs, lbd, rbd, xyz, ClBk) -% Draw a new figure with RGBplot axes, ColorBar axes, and uicontrol sliders. -% -M = 9; % buttons per column -gap = 0.01; % gaps -bth = 0.04; % demo height -btw = 0.09; % demo width -uih = 0.40; % height of UI control group -cbw = 0.21; % width of both colorbars -axh = 1-uih-2*gap; % axes height -wdt = 1-cbw-2*gap; % axes width -stp = [1,10]; % slider step -% -H.fig = figure('HandleVisibility','callback', 'Color','white',... - 'IntegerHandle','off', 'NumberTitle','off',... - 'Name','ColorBrewer Interactive Scheme Selector'); -% -% Add 2D lineplot: -H.ax2D = axes('Parent',H.fig, 'Position',[gap, uih+gap, wdt, axh],... - 'ColorOrder',[1,0,0; 0,1,0; 0,0,1; 0.6,0.6,0.6], 'HitTest','off',... - 'Visible','off', 'XLim',[0,1], 'YLim',[0,1], 'XTick',[], 'YTick',[]); -H.ln2D = line([0,0,0,0;1,1,1,1],[0,0,0,0;1,1,1,1], 'Parent',H.ax2D, 'Visible','off'); -% -% Add 3D scatterplot: -H.ax3D = axes('Parent',H.fig, 'OuterPosition',[0, uih, wdt+2*gap, 1-uih],... - 'Visible','on', 'XLim',[0,1], 'YLim',[0,1], 'ZLim',[0,1], 'HitTest','on'); -H.pt3D = patch('Parent',H.ax3D, 'XData',[0;1], 'YData',[0;1], 'ZData',[0;1],... - 'Visible','on', 'LineStyle','none', 'FaceColor','none', 'MarkerEdgeColor','none',... - 'Marker','o', 'MarkerFaceColor','flat', 'MarkerSize',10, 'FaceVertexCData',[1,1,0;1,0,1]); -view(H.ax3D,3); -grid(H.ax3D,'on') -lbl = {'Red','Green','Blue'}; -xlabel(H.ax3D,lbl{xyz(1)}) -ylabel(H.ax3D,lbl{xyz(2)}) -zlabel(H.ax3D,lbl{xyz(3)}) -% -% Add warning text: -H.warn = text('Parent',H.ax2D, 'Units','normalized', 'Position',[1,1],... - 'HorizontalAlignment','right', 'VerticalAlignment','top', 'Color','k'); -% -% Add demo button: -H.demo = uicontrol(H.fig, 'Style','togglebutton', 'Units','normalized',... - 'Position',[gap,uih+gap+0*bth,btw,bth], 'String','Demo',... - 'Max',1, 'Min',0, 'Callback',ClBk.bmvDemo); -% Add 2D/3D button: -H.D2D3 = uicontrol(H.fig, 'Style','togglebutton', 'Units','normalized',... - 'Position',[gap,uih+gap+1*bth,btw,bth], 'String','2D / 3D',... - 'Max',1, 'Min',0, 'Callback',ClBk.bmv2D3D); -% Add reverse button: -H.bRev = uicontrol(H.fig, 'Style','togglebutton', 'Units','normalized',... - 'Position',[gap,uih+gap+2*bth,btw,bth], 'String','Reverse',... - 'Max',1, 'Min',0, 'Callback',ClBk.bmvRevM); -% -% Add colorbars: -C = reshape([1,1,1],1,[],3); -H.cbAx(1) = axes('Parent',H.fig, 'Visible','off', 'Units','normalized',... - 'Position',[1-cbw/1,gap,cbw/2-gap,1-2*gap], 'YLim',[0.5,1.5],... - 'YDir','reverse', 'HitTest','off'); -H.cbAx(2) = axes('Parent',H.fig, 'Visible','off', 'Units','normalized',... - 'Position',[1-cbw/2,gap,cbw/2-gap,1-2*gap], 'YLim',[0.5,1.5],... - 'YDir','reverse', 'HitTest','off'); -H.cbIm(1) = image('Parent',H.cbAx(1), 'CData',C); -H.cbIm(2) = image('Parent',H.cbAx(2), 'CData',C); -% -% Add parameter slider, listener, and corresponding text: -sv = max(lbd,min(rbd,N)); -H.vTxt = uicontrol(H.fig,'Style','text', 'Units','normalized',... - 'Position',[gap,uih-bth,btw,bth], 'String','X'); -H.vSld = uicontrol(H.fig,'Style','slider', 'Units','normalized',... - 'Position',[gap,gap,btw,uih-bth], 'Min',lbd(1), 'Max',rbd(1),... - 'SliderStep',stp(1,:)/(rbd(1)-lbd(1)), 'Value',sv(1)); -addlistener(H.vSld, 'Value', 'PostSet',ClBk.bmvSldr); -% -% Add scheme button group: -H.bGrp = uibuttongroup('Parent',H.fig, 'BorderType','none', 'Units','normalized',... - 'BackgroundColor','white', 'Position',[2*gap+btw,gap,wdt-btw-gap,uih-gap]); -% Determine button locations: -Z = 1:numel(mcs); -Z = Z+(Z>17); -C = (ceil(Z/M)-1)/4; -R = (M-1-mod(Z-1,M))/M; -% Add scheme buttons to group: -for k = numel(mcs):-1:1 - H.bEig(k) = uicontrol('Parent',H.bGrp, 'Style','Toggle', 'String',mcs{k},... - 'Unit','normalized', 'Position',[C(k),R(k),1/4,1/M]); -end -set(H.bGrp,'SelectedObject',H.bEig(strcmpi(scheme,mcs))); -set(H.bGrp,'SelectionChangeFcn',ClBk.bmvChgS); -% -end -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%bmvPlot -% -% Copyright (c) 2017 Stephen Cobeldick -% -% Licensed under the Apache License, Version 2.0 (the "License"); -% you may not use this file except in compliance with the License. -% You may obtain a copy of the License at -% -% http://www.apache.org/licenses/LICENSE-2.0 -% -% Unless required by applicable law or agreed to in writing, software -% distributed under the License is distributed on an "AS IS" BASIS, -% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -% See the License for the specific language governing permissions and limitations under the License. -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%license \ No newline at end of file diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/AUTHORS b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/AUTHORS deleted file mode 100644 index 2558a19f..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -Nico Schlömer designed and implemented the intial version and is the current maintainer. diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/COPYING b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/COPYING deleted file mode 100644 index 15dc1832..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/COPYING +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) 2008--2012 Nico Schlömer -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/ChangeLog b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/ChangeLog deleted file mode 100644 index 911c5e4d..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/ChangeLog +++ /dev/null @@ -1,388 +0,0 @@ -2014-11-21 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.6.0. - * Annotation support in R2014a and earlier - * New subplot positioning approach (by Klaus Broelemann) that uses absolute - instead of relative positions. - * Support stacked bar plots and others in the same axes (needs pgfplots - 1.11). - * Support legends with multiline entries. - * Support for the alpha channel in PNG output. - * Test framework updated and doesn't display figures by default. - * Major code clean-up and code complexity checks. - * Bug fixes: - - Cycle paths only when needed (#317, #49, #404) - - Don't use infinite xmin/max, etc. (#436) - - Warn about the noSize parameter (#431) - - Images aren't flipped anymore (#401) - - No scientific notation in width/height (#396) - - Axes with custom colors (#376) - - Mesh plots are exported properly (#382) - - Legend colors are handled better (#389) - - Handle Z axis properties for quiver3 (#406) - - Better text handling, e.g. degrees (#402) - - Don't output absolute paths into TikZ by default - - ... - -2014-10-20 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.5.0. - * Support for MATLAB 2014b (with it's substantial graphics changes). - All credit goes to Egon Geerardyn. - * Bugfixes: - - single bar width - - invisible bar plots - - surface options - - patch plots and cycling - - patches with literal colors - -2014-03-07 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.4.7. - * Acid tests: Remove MATLAB-based eps2pdf. - * Bugfixes: - - multiple patches - - log plot with nonzero baseline - - marker options for scatter plots - - table data formatting - - several fixes for Octave - -2014-02-07 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.4.6. - * Set externalData default to false. - * Properly check for required Pgfplots version. - * Marker scaling in scatter plots. - -2014-02-02 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.4.5. - * Arrange data in tables. - * Optionally define custom colors. - * Allow for strict setting of font sizes. - * Bugfixes: - - tick labels for log plots - - tick labels with commas - -2014-01-02 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.4.4. - * Support for color maps with scatter plots. - * Support for different-length up-down error bars. - * Input options validation. - * Bugfixes: - - legends for both area and line plots - - invisible text fields - -2013-10-20 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.4.3. - * Support for 3D quiver plots. - * Extended support for colorbar axis options. - * New logo! - * Bugfixes: - - text generation - - extraCode option - - join strings - - ... - -2013-09-12 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.4.2. - * Support for explicit color specification in 3D plots. - * Better color handling for patch plots. - * Support for various unicode characters. - * Bugfixes: - - edge colors for bar plots - - multiple color bars - - ... - -2013-08-14 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.4.1. - * Replaced option `extraTikzpictureCode` by `extraCode` - for inserting code at the beginning of the file. - * Support for relative text positioning. - * Improved documentation. - * Code cleanup: moved all figure manipulations over to cleanfigure() - * Bugfixes: - - error bars - - empty tick labels - - ... - -2013-06-26 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.4.0. - * Added cleanfigure() for removing unwanted entities from a plot - before conversion - * Add option `floatFormat` to allow for custom specification of the format - of float numbers - * Bugfixes: - - linewidth for patches - - ... - -2013-04-13 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.3.3. - * Support for: - - pictures in LaTeX subfloats - * Bugfixes: - - axes labels - - extra* options - - logscaled axes - - ... - -2013-03-14 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.3.2. - * Support for: - - waterfall plots - * Bugfixes: - - axis locations - - color handling - - stacked bars - - ... - -2013-02-15 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.3.1. - * Use table{} for plots for cleaner output files. - * Support for: - - hg transformations - - pcolor plots - * Removed command line options: - - minimumPointsDistance - * Bugfixes: - - legend positioning and alignment - - tick labels - - a bunch of fixed for Octave - - line width for markers - - axis labels for color bars - - image trimming - - subplots with bars - - ... - -2012-11-19 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.3.0. - * Support for: - - area plots - - legend position - - inner color bars - - log-scaled color bars - * New command line options: - - standalone (create compilable TeX file) - - checkForUpdates - * mlint cleanups. - * Removed deprecated options. - * Bugfixes: - - colorbar-axis association - - option parsing - - automatic updater - - unit 'px' - - ... - -2012-09-01 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.2.3. - * Multiline text for all entities. - * Support for logical images. - * Support for multiple legends (legends in subplots). - * Fixed version check bug. - * Fix minumumPointsDistance. - -2012-07-19 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.2.2. - * Support for multiline titles and axis labels. - * Respect log-scaled axes for minimumPointsDistance. - * Add support for automatic graph labels via - new option. - * About 5 bugfixes. - -2012-05-04 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.2.1. - * Support for color maps. - * Support for native color bars. - * Partial support for hist3 plots. - * Support for spectrogram plots. - * Support for rotated text. - * Native handling of Infs/NaNs. - * Better info text. - * matlab2tikz version checking. - * Line plotting code cleanup. - * About 10 bugfixes. - -2012-03-17 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.2.0. - * Greatly overhauled text handling. (Burkhart Lingner) - * Added option 'tikzFileComment'. - * Added option 'parseStrings'. - * Added option 'extraTikzpictureSettings'. - * Added proper documetion (for 'help matlab2tikz'). - * Improved legend positioning, orientation. - * Support for horizontal bar plots. - * Get bar widths right. - * Doubles are plottet with 15-digit precision now. - * Support for rectangle objects. - * Better color handling. - * Testing framework improvements. - * Several bugfixes: - - ticks handled more concisely - - line splitting bugs - - ... - -2011-11-22 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.1.4. - * Support for scatter 3D plots. - * Support for 3D parameter curves. - * Support for 3D patches. - * Support for minor ticks. - * Add option interpretTickLabelsAsTex (default false). - * Several bugfixes: - - %-sign in annotations - - fixed \omega and friends in annotations - - proper legend for bar plots - - don't override PNG files if there is - more than one image plot - - don't always close patch paths - -2011-08-22 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.1.3. - * Greatly overhauled text handling. - * Better Octave compatibility. - * Several bugfixes: - - subplot order - - environment detection - - -2011-06-02 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.1.2. - * Support for logscaled color bar. - * Support for truecolor images. - * Initial support for text handles. - * Speed up processing for line plots. - * Several bugfixes: - - axis labels, tick labels, etc. for z-axis - - marker handling for scatter plots - - fix for unicolor scatter plots - -2011-04-06 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.1.1. - * Improved Octave compatibility. - * Several bugfixes: - - input parser - -2011-01-31 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.1.0. - * Basic Octave compatibility. - * Several bugfixes: - - bar plots fix (thanks to Christoph Rüdiger) - - fix legends with split graphs - -2010-09-10 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.0.7. - * Compatibility fixes for older MATLAB installations. - * Several bugfixes: - - line plots with only one point - - certain surface plots - - orientation of triangle markers ("<" vs. ">") - - display of the color "purple" - -2010-05-06 Nico Schlömer <nico.schloemer@gmail.com> - - * Version 0.0.6. - * Support for scatter plots. - * Preliminary support for surface plots; thanks to Pooya. - * Large changes in the codebase: - - next to matlab2tikz.m, the file pgfplotsEnvironment.m - is now needed as well; it provides a much better - structured approach to storing and writing environments - when parsing the MATLAB(R) figure - * proper MATLAB(R) version check - * lots of small fixes - -2009-12-21 Nico Schlömer <nico.schloemer@ua.ac.be> - - * Version 0.0.5. - * Improvements in axis handling: - - colored axes - - allow different left and right ordinates - * Improvements for line plots: - - * Version 0.0.5. - * Improvements in axis handling: - - colored axes - - allow different left and right ordinates - * Improvements for line plots: - - far outliers are moved toward the plot, avoiding 'Dimension too - large'-type errors in LaTeX - - optional point reduction by new option 'minimumPointsDistance' - * Improvements for image handling: - - creation of a PNG file, added by '\addplot graphics' - - fixed axis orientation bug - * Bugfixes for: - - multiple axes - - CMYK colors - - legend text alignment (thanks Dragen Mitrevski) - - transparent patches (thanks Carlos Russo) - * Added support for: - - background color - - Bode plots - - zplane plots - - freqz plots - - -2009-06-09 Nico Schlömer <nico.schloemer@ua.ac.be> - - * Version 0.0.4. - * Added support for: - - error bars (thanks Robert Whittlesey for the suggestion) - * Improvents in: - - legends (thanks Theo Markettos for the patch), - - images, - - quiver plots (thanks Robert for spotting this). - * Improved options handling. - * Allow for custom file encoding (thanks Donghua Wang for the - suggestion). - * Numerous bugfixes (thanks Andreas Gäb). - -2009-03-08 Nico Schlömer <nico.schloemer@ua.ac.be> - - * Version 0.0.3. - * Added support for: - - subplots - - reverse axes - * Completed support for: - - images - -2009-01-08 Nico Schlömer <nico.schloemer@ua.ac.be> - - * Version 0.0.2. - * Added support for: - - quiver (arrow) plots - - bar plots - - stem plots - - stairs plots - * Added preliminary support for: - - images - - rose plots - - compass plots - - polar plots - * Moreover, large code improvement have been introduced, notably: - - aspect ratio handling - - color handling - - plot options handling - - -2008-11-07 Nico Schlömer <nico.schloemer@ua.ac.be> - - * Initial version 0.0.1. diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/Makefile b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/Makefile deleted file mode 100644 index 1d9d6e9b..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -# This makefile creates a release tarball. - -MATLAB2TIKZ_DIR=. -VERSION=0.4.7 - -default: release - -release: - # The license is automatically added by - # MathWorks after the upload. - @zip -r matlab2tikz_${VERSION}.zip \ - ${MATLAB2TIKZ_DIR}/AUTHORS \ - ${MATLAB2TIKZ_DIR}/ChangeLog \ - ${MATLAB2TIKZ_DIR}/README.md \ - ${MATLAB2TIKZ_DIR}/THANKS \ - ${MATLAB2TIKZ_DIR}/version-${VERSION} \ - ${MATLAB2TIKZ_DIR}/tools/ \ - ${MATLAB2TIKZ_DIR}/src/ - -clean: - rm -f matlab2tikz_${VERSION}.zip diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/README.md b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/README.md deleted file mode 100644 index aedbc18e..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/README.md +++ /dev/null @@ -1,69 +0,0 @@ - - -[](https://travis-ci.org/matlab2tikz/matlab2tikz) - -This is matlab2tikz, a MATLAB(R) script for converting MATLAB(R) figures into -native TikZ/Pgfplots figures. - -To download and rate matlab2tikz, go to its page on MathWorks -http://www.mathworks.com/matlabcentral/fileexchange/22022. - -matlab2tikz supports the conversion of most MATLAB figures, -including 2D and 3D plots. For plots constructed with third- -party packages, your mileage may vary. - -The workflow is as follows. - -0. a. Place the matlab2tikz scripts (contents of src/ folder) in a directory - where MATLAB can find it (the current directory, for example). - b. Make sure that your LaTeX installation includes the packages - * TikZ (aka PGF, >=2.00) and - * Pgfplots (>=1.3). - -1. Generate your plot in MATLAB. - -2. Invoke matlab2tikz by -```matlab ->> matlab2tikz(); -``` - or -```matlab ->> matlab2tikz('myfile.tex'); -``` - The script accepts numerous options; check them out by invoking the help, -```matlab ->> help matlab2tikz -``` -Sometimes, MATLAB makes it hard to create matching LaTeX plots by keeping -invisible objects around or stretches the plots too far beyond the bounding box. -Use -```matlab ->> cleanfigure; ->> matlab2tikz('myfile.tex'); -``` -to first clean the figure of unwanted entities, and then convert it to TeX. - -3. Add the contents of `myfile.tex` into your LaTeX source code; a - convenient way of doing so is to use `\input{/path/to/myfile.tex}`. - Also make sure that at the header of your document the Pgfplots package - is included: -```latex -\documentclass{article} -\usepackage{pgfplots} -% and optionally (as of Pgfplots 1.3): -\pgfplotsset{compat=newest} -\pgfplotsset{plot coordinates/math parser=false} -\newlength\figureheight -\newlength\figurewidth -\begin{document} -\input{myfile.tex} -\end{document} -``` - -There are reported incompatibilities with the following LaTeX packages: - * signalflowdiagram <http://www.texample.net/tikz/examples/signal-flow-building-blocks/> - (Check out <http://sourceforge.net/tracker/?func=detail&aid=3312653&group_id=224188&atid=1060656>.) - -If you experience bugs, have nice examples of what matlab2tikz can do, or if -you are just looking for more information, please visit the web page of -matlab2tikz <https://github.com/matlab2tikz/matlab2tikz>. diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/THANKS b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/THANKS deleted file mode 100644 index 74103b84..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/THANKS +++ /dev/null @@ -1,47 +0,0 @@ -matlab2tikz has once greatly profited from its ancestor, Matfig2PGF, - - http://www.mathworks.com/matlabcentral/fileexchange/12962 - -Matfig2PGF is written by Paul Wagenaars. - -Also, the authors would like to thank Christian Feuersänger for the Pgfplots -package which forms the basis for the matlab2tikz output on the LaTeX side. - -Thanks for patches, suggestions, and other contributions go to - - Katherine Elkington - Andreas Gäb - Roman Gesenhues - David Haberthür - Patrick Häcker - Mykel Kochenderfer - Henk Kortier - Theo Markettos - Dragan Mitrevski - Carlos Russo - Robert Whittlesey - Pooya Ziraksaz - Johannes Schmitz - Christoph Rüdiger - Ben Abbott - Johannes Mueller-Roemer - Julien Ridoux - Burkart Lingner - Francesco Montorsi - Ricardo Santiago Mozos - Eike Blechschmidt - Michael Schoeberl - Patrick Häcker - Egon Geerardyn - Oleg Komarov - Klaus Broelemann - Peter Pablo - ... - -and MathWorks' very own - - Martijn Aben - Bastiaan Zuurendonk - Michael Glasser - -and many more! diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/logos/matlab2tikz.svg b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/logos/matlab2tikz.svg deleted file mode 100644 index ea2a8f7d..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/logos/matlab2tikz.svg +++ /dev/null @@ -1,94 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="744.09448819" - height="1052.3622047" - id="svg3051" - version="1.1" - inkscape:version="0.48.5 r10040" - sodipodi:docname="m2t.svg"> - <defs - id="defs3053" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.25" - inkscape:cx="696.59128" - inkscape:cy="461.26734" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - inkscape:window-width="1280" - inkscape:window-height="738" - inkscape:window-x="0" - inkscape:window-y="27" - inkscape:window-maximized="1" /> - <metadata - id="metadata3056"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1"> - <path - style="fill:#ef8200;fill-opacity:1;stroke:none" - d="m 229.79347,889.91953 c -51.20296,-69.53548 -110.45905,-150.5284 -117.8477,-161.07762 -3.66043,-5.22621 -4.15923,-6.45766 -2.93039,-7.23468 0.81449,-0.51503 2.1559,-0.94763 2.9809,-0.96134 4.45183,-0.074 21.84491,-16.50352 39.70528,-37.5057 64.93246,-76.3547 212.14442,-292.5117 313.27925,-460 28.45805,-47.12908 55.23448,-94.70724 59.01417,-107.81682 2.21373,-7.67817 3.30364,-4.58186 5.54982,7.259 0.84717,4.46595 9.42069,39.94343 19.05225,78.83886 61.4356,248.09709 88.96885,376.22196 95.45994,444.21896 1.34274,14.06576 0.80116,31.67542 -1.06339,34.57694 -0.67969,1.05768 -29.41344,23.07306 -63.85279,48.92306 -46.63668,35.00526 -216.41083,162.82778 -297.77739,224.19582 l -3.13285,2.36286 z" - id="path3072" /> - <path - style="fill:#ffd912;fill-opacity:1" - d="M 828.49628,790.87316 C 751.45425,746.41551 656.62349,689.46978 647.33146,682.08395 c -2.47911,-1.97053 -2.52321,-2.17947 -1.05805,-5.01277 3.18772,-6.16438 4.02557,-14.85566 3.44538,-35.74002 -0.80529,-28.98647 -5.98761,-65.55929 -17.38517,-122.69097 -18.80756,-94.27528 -55.9766,-241.89492 -91.4729,-363.29152 -4.95189,-16.93533 -13.8484,-44.15875 -13.64905,-44.7568 0.19935,-0.59804 7.77507,16.91106 10.71396,23.16944 14.72516,31.35732 169.10504,368.5638 262.04653,572.37888 18.81036,41.25 35.965,78.78344 38.1214,83.40766 2.15641,4.62421 3.80419,8.50202 3.66173,8.61735 -0.14245,0.11533 -6.10901,-3.16608 -13.25901,-7.29204 z" - id="path3070" /> - <path - style="fill:#00b0cf;fill-opacity:1" - d="M 98.496283,712.93087 C 76.224153,691.69469 25.659453,651.42885 -55.133796,590.59166 l -36.630081,-27.58239 14.630081,-4.80606 C 1.4604828e-5,532.86436 84.848253,489.14509 155.49628,438.33721 c 90.71369,-65.23848 211.18904,-171.14032 339.75,-298.65155 14.7125,-14.59237 30.24771,-31.09621 30.24771,-30.65137 0,1.46965 -5.56006,9.74411 -33.50167,53.6059 -117.938,185.13504 -236.74752,364.94776 -300.3065,454.5 -22.45559,31.6391 -46.86362,64.24839 -58.75719,78.5 -10.15154,12.16419 -23.13943,25.02746 -25.20109,24.95928 -0.6772,-0.0224 -4.83126,-3.47326 -9.231257,-7.6686 z" - id="path2987" /> - <text - xml:space="preserve" - style="font-size:256.08959961px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ef8200;fill-opacity:1;stroke:none;font-family:Monotype Corsiva;-inkscape-font-specification:Monotype Corsiva Bold Italic" - x="835.56165" - y="469.78217" - id="text3863" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - id="tspan3865" - x="835.56165" - y="469.78217" - style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans Italic"><tspan - style="font-style:normal;-inkscape-font-specification:Liberation Sans" - id="tspan2999">MATLAB</tspan><tspan - style="font-style:italic;font-weight:bold;-inkscape-font-specification:Liberation Sans Italic" - id="tspan2997">2</tspan></tspan><tspan - sodipodi:role="line" - x="835.56165" - y="789.89417" - id="tspan3867" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ef8200;fill-opacity:1;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans" - id="tspan3875">Ti</tspan><tspan - style="font-style:italic;-inkscape-font-specification:Liberation Sans Italic" - id="tspan2995">k</tspan><tspan - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans" - id="tspan3873">Z</tspan></tspan></text> - </g> -</svg> diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/cleanfigure.m b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/cleanfigure.m deleted file mode 100644 index ffc0feef..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/cleanfigure.m +++ /dev/null @@ -1,524 +0,0 @@ -function cleanfigure(varargin) -% CLEANFIGURE() removes the unnecessary objects from your MATLAB plot -% to give you a better experience with matlab2tikz. -% CLEANFIGURE comes with several options that can be combined at will. -% -% CLEANFIGURE('handle',HANDLE,...) explicitly specifies the -% handle of the figure that is to be stored. (default: gcf) -% -% CLEANFIGURE('minimumPointsDistance',DOUBLE,...) explicitly specified the -% minimum distance between two points. (default: 1.0e-10) -% -% Example -% x = -pi:pi/1000:pi; -% y = tan(sin(x)) - sin(tan(x)); -% plot(x,y,'--rs'); -% cleanfigure(); -% - -% Copyright (c) 2013--2014, Nico Schlömer <nico.schloemer@gmail.com> -% All rights reserved. -% -% Redistribution and use in source and binary forms, with or without -% modification, are permitted provided that the following conditions are -% met: -% -% * Redistributions of source code must retain the above copyright -% notice, this list of conditions and the following disclaimer. -% * Redistributions in binary form must reproduce the above copyright -% notice, this list of conditions and the following disclaimer in -% the documentation and/or other materials provided with the distribution -% -% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -% POSSIBILITY OF SUCH DAMAGE. - - % Treat hidden handles, too. - shh = get(0, 'ShowHiddenHandles'); - set(0, 'ShowHiddenHandles', 'on'); - - % Keep track of the current axes. - meta.gca = []; - - % Set up command line options. - m2t.cmdOpts = m2tInputParser; - m2t.cmdOpts = m2t.cmdOpts.addParamValue(m2t.cmdOpts, 'minimumPointsDistance', 1.0e-10, @isnumeric); - m2t.cmdOpts = m2t.cmdOpts.addParamValue(m2t.cmdOpts, 'handle', gcf, @ishandle); - - % Finally parse all the elements. - m2t.cmdOpts = m2t.cmdOpts.parse(m2t.cmdOpts, varargin{:}); - - % Recurse down the tree of plot objects and clean up the leaves. - for h = m2t.cmdOpts.Results.handle(:)' - recursiveCleanup(meta, h, m2t.cmdOpts.Results.minimumPointsDistance, 0); - end - - % Reset to initial state. - set(0, 'ShowHiddenHandles', shh); - - return; -end -% ========================================================================= -function indent = recursiveCleanup(meta, h, minimumPointsDistance, indent) - - type = get(h, 'Type'); - - %display(sprintf([repmat(' ',1,indent), type, '->'])) - - % Don't try to be smart about quiver groups. - % NOTE: - % A better way to write `strcmp(get(h,...))` would be to use - % isa(handle(h), 'specgraph.quivergroup'). - % The handle() function isn't supported by Octave, though, so let's stick - % with strcmp(). - if strcmp(get(h, 'Type'), 'specgraph.quivergroup') - %if strcmp(class(handle(h)), 'specgraph.quivergroup') - return; - end - - % Update the current axes. - if strcmp(get(h, 'Type'), 'axes') - meta.gca = h; - end - - children = get(h, 'Children'); - if ~isempty(children) - for child = children(:)' - indent = indent + 4; - indent = recursiveCleanup(meta, child, minimumPointsDistance, indent); - indent = indent - 4; - end - else - % We're in a leaf, so apply all the fancy simplications. - - %% Skip invisible objects. - %if ~strcmp(get(h, 'Visible'), 'on') - % display(sprintf([repmat(' ',1,indent), ' invisible'])) - % return; - %end - - %display(sprintf([repmat(' ',1,indent), ' handle this'])) - - if strcmp(type, 'line') - pruneOutsideBox(meta, h); - % Move some points closer to the box to avoid TeX:DimensionTooLarge - % errors. This may involve inserting extra points. - movePointsCloser(meta, h); - % Don't be too precise. - coarsenLine(meta, h, minimumPointsDistance); - elseif strcmp(type, 'text') - % Check if text is inside bounds by checking if the Extent rectangle - % and the axes box overlap. - xlim = get(meta.gca, 'XLim'); - ylim = get(meta.gca, 'YLim'); - extent = get(h, 'Extent'); - extent(3:4) = extent(1:2) + extent(3:4); - overlap = xlim(1) < extent(3) && xlim(2) > extent(1) ... - && ylim(1) < extent(4) && ylim(2) > extent(2); - if ~overlap - % Artificially disable visibility. m2t will check and skip. - set(h, 'Visible', 'off'); - end - end - end - - return; -end -% ========================================================================= -function pruneOutsideBox(meta, handle) - % Some sections of the line may sit outside of the visible box. - % Cut those off. - - xData = get(handle, 'XData'); - yData = get(handle, 'YData'); - zData = get(handle, 'ZData'); - - if isempty(zData) - data = [xData(:), yData(:)]; - else - data = [xData(:), yData(:), zData(:)]; - end - - if isempty(data) - return; - end - - %hasLines = ~strcmp(lineStyle,'none') && lineWidth>0.0; - %hasMarkers = ~strcmp(marker,'none'); - hasLines = true; - hasMarkers = true; - xLim = get(meta.gca, 'XLim'); - yLim = get(meta.gca, 'YLim'); - - tol = 1.0e-10; - relaxedXLim = xLim + [-tol, tol]; - relaxedYLim = yLim + [-tol, tol]; - - numPoints = size(data, 1); - - % Get which points are inside a (slightly larger) box. - dataIsInBox = isInBox(data(:,1:2), ... - relaxedXLim, relaxedYLim); - - % By default, don't plot any points. - shouldPlot = false(numPoints, 1); - if hasMarkers - shouldPlot = shouldPlot | dataIsInBox; - end - if hasLines - % Check if the connecting line is in the box. - segvis = segmentVisible(data(:,1:2), ... - dataIsInBox, xLim, yLim); - % Plot points which are next to an edge which is in the box. - shouldPlot = shouldPlot | [false; segvis] | [segvis; false]; - end - - if ~all(shouldPlot) - % There are two options here: - % data = data(shouldPlot, :); - % i.e., simply removing the data that isn't supposed to be plotted. - % For line plots, this has the disadvantage that the line between two - % 'loose' ends may now appear in the figure. - % To avoid this, add a row of NaNs wherever a block of actual data is - % removed. - chunkIndices = []; - k = 1; - while k <= numPoints - % fast forward to shouldPlot==True - while k<=numPoints && ~shouldPlot(k) - k = k+1; - end - kStart = k; - % fast forward to shouldPlot==False - while k<=numPoints && shouldPlot(k) - k = k+1; - end - kEnd = k-1; - - if kStart <= kEnd - chunkIndices = [chunkIndices; ... - [kStart, kEnd]]; - end - end - - % Create masked data with NaN padding. - % Make sure that there are no NaNs at the beginning of the data since - % this would be interpreted as column names by Pgfplots. - if size(chunkIndices, 1) > 0 - ci = chunkIndices(1,:); - newData = data(ci(1):ci(2), :); - n = size(data, 2); - for ci = chunkIndices(2:end,:)' - newData = [newData; ... - NaN(1, n); ... - data(ci(1):ci(2), :)]; - end - data = newData; - end - end - - % Override with the new data. - set(handle, 'XData', data(:, 1)); - set(handle, 'YData', data(:, 2)); - if ~isempty(zData) - set(handle, 'ZData', data(:, 3)); - end - - return; -end -% ========================================================================= -function out = segmentVisible(data, dataIsInBox, xLim, yLim) - % Given a bounding box {x,y}Lim, loop through all pairs of subsequent nodes - % in p and determine whether the line between the pair crosses the box. - - n = size(data, 1); - out = false(n-1, 1); - for k = 1:n-1 - out(k) = (dataIsInBox(k) && all(isfinite(data(k+1,:)))) ... % one of the neighbors is inside the box - || (dataIsInBox(k+1) && all(isfinite(data(k,:)))) ... % and the other is finite - || segmentsIntersect(data(k,:), data(k+1,:), ... - [xLim(1);yLim(1)], [xLim(1);yLim(2)]) ... % left border - || segmentsIntersect(data(k,:), data(k+1,:), ... - [xLim(1);yLim(1)], [xLim(2);yLim(1)]) ... % bottom border - || segmentsIntersect(data(k,:), data(k+1,:), ... - [xLim(2);yLim(1)], [xLim(2);yLim(2)]) ... % right border - || segmentsIntersect(data(k,:), data(k+1,:), ... - [xLim(1);yLim(2)], [xLim(2);yLim(2)]); % top border - end - -end -% ========================================================================= -function out = segmentsIntersect(X1, X2, X3, X4) - % Checks whether the segments X1--X2 and X3--X4 intersect. - lambda = crossLines(X1, X2, X3, X4); - out = all(lambda > 0.0) && all(lambda < 1.0); - return -end -% ========================================================================= -function coarsenLine(meta, handle, minimumPointsDistance) - % Reduce the number of data points in the line handle. - % Given a minimum distance at which two nodes are considered different, - % this can help with plots that contain a large amount of data points not - % all of which need to be plotted. - % - if ( abs(minimumPointsDistance) < 1.0e-15 ) - % bail out early - return - end - - % Extract the data from the current line handle. - xData = get(handle, 'XData'); - yData = get(handle, 'YData'); - zData = get(handle, 'ZData'); - if ~isempty(zData) - % Don't do funny stuff when zData is present. - return; - end - - data = [xData(:), yData(:)]; - - if isempty(data) - return; - end - - % Generate a mask which is true for the first point, and all - % subsequent points which have a greater norm2-distance from - % the previous point than 'threshold'. - n = size(data, 1); - - % Get info about log scaling. - isXlog = strcmp(get(meta.gca, 'XScale'), 'log'); - isYlog = strcmp(get(meta.gca, 'YScale'), 'log'); - - mask = false(n, 1); - - XRef = data(1,:); - mask(1) = true; - for kk = 2:n - % Compute the visible distance of those points, - % incorporating possible log-scaling of the axes. - visDiff = XRef - data(kk,:); - if isXlog - % visDiff(1) = log10(XRef(1)) - log10(data(kk,1)); - visDiff(1) = log10(visDiff(1)); - end - if isYlog - visDiff(2) = log10(visDiff(2)); - end - % Check if it's larger than the threshold and - % update the reference point in that case. - if norm(visDiff) > minimumPointsDistance - XRef = data(kk,:); - mask(kk) = true; - end - end - mask(end) = true; - - % Make sure to keep NaNs. - mask = mask | any(isnan(data)')'; - - % Set the new (masked) data. - set(handle, 'XData', data(mask, 1)); - set(handle, 'YData', data(mask, 2)); - - return; -end -% ========================================================================= -function movePointsCloser(meta, handle) - % Move all points outside a box much larger than the visible one - % to the boundary of that box and make sure that lines in the visible - % box are preserved. This typically involves replacing one point by - % two new ones and a NaN. - - % Extract the data from the current line handle. - xData = get(handle, 'XData'); - yData = get(handle, 'YData'); - zData = get(handle, 'ZData'); - - if ~isempty(zData) && any(zData(1)~=zData) - % Don't do funny stuff with varying zData. - return; - end - - data = [xData(:), yData(:)]; - - xlim = get(meta.gca, 'XLim'); - ylim = get(meta.gca, 'YLim'); - - xWidth = xlim(2) - xlim(1); - yWidth = ylim(2) - ylim(1); - % Don't choose the larger box too large to make sure that the values inside - % it can still be treated by TeX. - extendFactor = 0.1; - largeXLim = xlim + extendFactor * [-xWidth, xWidth]; - largeYLim = ylim + extendFactor * [-yWidth, yWidth]; - - % Get which points are in an extended box (the limits of which - % don't exceed TeX's memory). - dataIsInLargeBox = isInBox(data(:,1:2), ... - largeXLim, largeYLim); - - % Count the NaNs as being inside the box. - dataIsInLargeBox = dataIsInLargeBox | any(isnan(data)')'; - - % Loop through all points which are to be included in the plot yet do not - % fit into the extended box, and gather the points by which they are to be - % replaced. - replaceIndices = find(~dataIsInLargeBox)'; - m = length(replaceIndices); - r = cell(m, 1); - for k = 1:m - i = replaceIndices(k); - r{k} = []; - if i > 1 && all(isfinite(data(i-1,:))) - newPoint = moveToBox(data(i,:), data(i-1,:), largeXLim, largeYLim); - % Don't bother if the point is inf: - % There's no intersection with the large box, so even the - % connection between the two after they have been moved - % won't be probably be visible. - if all(isfinite(newPoint)) - r{k} = [r{k}; newPoint]; - end - end - if i < size(data,1) && all(isfinite(data(i+1,:))) - newPoint = moveToBox(data(i,:), data(i+1,:), largeXLim, largeYLim); - % Don't bother if the point is inf: - % There's no intersection with the large box, so even the - % connection between the two after they have been moved - % won't be probably be visible. - if all(isfinite(newPoint)) - r{k} = [r{k}; newPoint]; - end - end - end - - % Insert all r{k}{:} at replaceIndices[k]. - dataNew = []; - lastReplIndex = 0; - lastEntryIsReplacement = false; - for k = 1:m - % Make sure that two subsequent moved points are separated by a NaN entry. - % This is to make sure that there is no visible line between two moved - % points that wasn't there before. - d = data(lastReplIndex+1:replaceIndices(k)-1,:); - if size(r{k}, 1) == 2 - % Two replacement entries -- pad them with a NaN. - rep = [r{k}(1, :); ... - NaN(1, size(r{k}, 2)); ... - r{k}(2, :)]; - else - rep = r{k}; - end - if isempty(d) && ~isempty(rep) && lastEntryIsReplacement - % The last entry was a replacment, and the first one now is. - % Prepend a NaN. - rep = [NaN(1, size(r{k}, 2)); ... - rep]; - end - % Add the data. - if ~isempty(d) - dataNew = [dataNew; ... - d]; - lastEntryIsReplacement = false; - end - if ~isempty(rep) - dataNew = [dataNew; ... - rep]; - lastEntryIsReplacement = true; - end - lastReplIndex = replaceIndices(k); - end - dataNew = [dataNew; ... - data(lastReplIndex+1:end,:)]; - - % Set the new (masked) data. - set(handle, 'XData', dataNew(:,1)); - set(handle, 'YData', dataNew(:,2)); - if ~isempty(zData) - % As per precondition, all zData entries are equal. - zDataNew = zData(1) * ones(size(dataNew,1), 1); - set(handle, 'zData', zDataNew); - end - - return; -end -% ========================================================================= -function xNew = moveToBox(x, xRef, xlim, ylim) - % Takes a box defined by xlim, ylim, one point x and a reference point - % xRef. - % Returns the point xNew that sits on the line segment between x and xRef - % *and* on the box. If several such points exist, take the closest one - % to x. - - % Find out with which border the line x---xRef intersects, and determine - % the smallest parameter alpha such that x + alpha*(xRef-x) - % sits on the boundary. - minAlpha = inf; - % left boundary: - lambda = crossLines(x, xRef, [xlim(1);ylim(1)], [xlim(1);ylim(2)]); - if 0.0 < lambda(2) && lambda(2) < 1.0 && abs(minAlpha) > abs(lambda(1)) - minAlpha = lambda(1); - end - - % bottom boundary: - lambda = crossLines(x, xRef, [xlim(1);ylim(1)], [xlim(2);ylim(1)]); - if 0.0 < lambda(2) && lambda(2) < 1.0 && abs(minAlpha) > abs(lambda(1)) - minAlpha = lambda(1); - end - - % right boundary: - lambda = crossLines(x, xRef, [xlim(2);ylim(1)], [xlim(2);ylim(2)]); - if 0.0 < lambda(2) && lambda(2) < 1.0 && abs(minAlpha) > abs(lambda(1)) - minAlpha = lambda(1); - end - - % top boundary: - lambda = crossLines(x, xRef, [xlim(1);ylim(2)], [xlim(2);ylim(2)]); - if 0.0 < lambda(2) && lambda(2) < 1.0 && abs(minAlpha) > abs(lambda(1)) - minAlpha = lambda(1); - end - - % create the new point - xNew = x + minAlpha*(xRef-x); -end -% ========================================================================= -function out = isInBox(data, xLim, yLim) - - out = data(:,1) > xLim(1) & data(:,1) < xLim(2) ... - & data(:,2) > yLim(1) & data(:,2) < yLim(2); - -end -% ========================================================================= -function lambda = crossLines(X1, X2, X3, X4) - % Given four points X_k=(x_k,y_k), k\in{1,2,3,4}, and the two lines defined - % by those, - % - % L1(lambda) = X1 + lambda (X2 - X1) - % L2(lambda) = X3 + lambda (X4 - X3) - % - % returns the lambda for which they intersect (and Inf if they are parallel). - % Technically, one needs to solve the 2x2 equation system - % - % x1 + lambda1 (x2-x1) = x3 + lambda2 (x4-x3) - % y1 + lambda1 (y2-y1) = y3 + lambda2 (y4-y3) - % - % for lambda and mu. - - rhs = X3(:) - X1(:); - % Divide by det even if it's 0: Infs are returned. - % A = [X2-X1, -(X4-X3)]; - detA = -(X2(1)-X1(1))*(X4(2)-X3(2)) + (X2(2)-X1(2))*(X4(1)-X3(1)); - invA = [-(X4(2)-X3(2)), X4(1)-X3(1);... - -(X2(2)-X1(2)), X2(1)-X1(1)] / detA; - lambda = invA * rhs; - -end -% ========================================================================= diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/cond_2 b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/cond_2 deleted file mode 100644 index 92c8bdfd..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/cond_2 +++ /dev/null @@ -1,38 +0,0 @@ -% This file was created by matlab2tikz. -% Minimal pgfplots version: 1.3 -% -%The latest updates can be retrieved from -% http://www.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz -%where you can also make suggestions and rate matlab2tikz. -% -\begin{tikzpicture} - -\begin{axis}[% -width=4.489655in, -height=3.541034in, -at={(0.753103in,0.477931in)}, -scale only axis, -separate axis lines, -every outer x axis line/.append style={black}, -every x tick label/.append style={font=\color{black}}, -xmin=1, -xmax=5, -xlabel={Nombre de paramètres}, -xmajorgrids, -every outer y axis line/.append style={black}, -every y tick label/.append style={font=\color{black}}, -ymin=80, -ymax=170, -ylabel={Conditionnement}, -ymajorgrids -] -\addplot [color=red,solid,line width=2.0pt,forget plot] - table[row sep=crcr]{% -1 88.563537144876\\ -2 105.940559773145\\ -3 124.236088112109\\ -4 143.61998422876\\ -5 164.222442760817\\ -}; -\end{axis} -\end{tikzpicture}% \ No newline at end of file diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/cond_2.tex b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/cond_2.tex deleted file mode 100644 index 92c8bdfd..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/cond_2.tex +++ /dev/null @@ -1,38 +0,0 @@ -% This file was created by matlab2tikz. -% Minimal pgfplots version: 1.3 -% -%The latest updates can be retrieved from -% http://www.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz -%where you can also make suggestions and rate matlab2tikz. -% -\begin{tikzpicture} - -\begin{axis}[% -width=4.489655in, -height=3.541034in, -at={(0.753103in,0.477931in)}, -scale only axis, -separate axis lines, -every outer x axis line/.append style={black}, -every x tick label/.append style={font=\color{black}}, -xmin=1, -xmax=5, -xlabel={Nombre de paramètres}, -xmajorgrids, -every outer y axis line/.append style={black}, -every y tick label/.append style={font=\color{black}}, -ymin=80, -ymax=170, -ylabel={Conditionnement}, -ymajorgrids -] -\addplot [color=red,solid,line width=2.0pt,forget plot] - table[row sep=crcr]{% -1 88.563537144876\\ -2 105.940559773145\\ -3 124.236088112109\\ -4 143.61998422876\\ -5 164.222442760817\\ -}; -\end{axis} -\end{tikzpicture}% \ No newline at end of file diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/figure2dot.m b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/figure2dot.m deleted file mode 100644 index 73df420d..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/figure2dot.m +++ /dev/null @@ -1,155 +0,0 @@ -function figure2dot(filename) -%FIGURE2DOT Save figure in Graphviz (.dot) file. -% FIGURE2DOT() saves the current figure as dot-file. -% - -% Copyright (c) 2008--2014, Nico Schlömer <nico.schloemer@gmail.com> -% All rights reserved. -% -% Redistribution and use in source and binary forms, with or without -% modification, are permitted provided that the following conditions are -% met: -% -% * Redistributions of source code must retain the above copyright -% notice, this list of conditions and the following disclaimer. -% * Redistributions in binary form must reproduce the above copyright -% notice, this list of conditions and the following disclaimer in -% the documentation and/or other materials provided with the distribution -% -% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -% POSSIBILITY OF SUCH DAMAGE. -% -% ========================================================================= - global node_number - - % also show hidden handles - set(0, 'ShowHiddenHandles', 'on'); - - filehandle = fopen(filename, 'w'); - - % start printing - fprintf(filehandle, 'digraph simple_hierarchy {\n\n'); - - fprintf(filehandle, 'node[shape=box];\n\n'); - - % define the root node - node_number = 0; - p = get(gcf, 'Parent'); - % define root element - type = get(p, 'Type'); - fprintf(filehandle, 'N%d [label="%s"]\n\n', node_number, type); - - % start recursion - plot_children(filehandle, p, node_number); - - % finish off - fprintf(filehandle, '}'); - fclose(filehandle); - set(0, 'ShowHiddenHandles', 'off'); - -end -% ========================================================================= -function plot_children(fh, h, id) - - global node_number - - % get the children - children = get(h, 'Children'); - - % ----------------------------------------------------------------------- - % loop through the children - for child = children(:)' - % define child number - node_number = node_number + 1; - type = get(child, 'Type'); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % skip certain entries - if strcmp(type, 'uimenu' ) || ... - strcmp(type, 'uitoolbar' ) || ... - strcmp(type, 'uicontextmenu') - continue; - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - label = cell(0); - label = [label, sprintf('Type: %s', type)]; - - hClass = class(handle(child)); - label = [label, sprintf('Class: %s', hClass)]; - - tag = get(child, 'Tag'); - if ~isempty(tag) - label = [label, sprintf('Tag: %s', tag)]; - end - - visibility = get(child, 'Visible'); - color = []; % set default value - if ~strcmp(visibility, 'on') - label = [label, sprintf('Visible: %s', visibility)]; - color = 'gray'; - end - - handlevisibility = get(child, 'HandleVisibility'); - if ~strcmp(handlevisibility, 'on') - label = [label, sprintf('HandleVisibility: %s', handlevisibility)]; - end - - % gather options - options = cell(0); - if ~isempty(label) - options = [options, ['label=', collapse(label,'\n')]]; - end - if ~isempty(color) - options = [options, ['color=', color]]; - end - - % print node - fprintf(fh, 'N%d [label="%s"]\n', node_number, collapse(label, '\n')); - - % connect to the child - fprintf(fh, 'N%d -> N%d;\n\n', id, node_number); - - % recurse - plot_children(fh, child, node_number); - end - % ----------------------------------------------------------------------- - -end -% ========================================================================= -function newstr = collapse(cellstr, delimiter) - % This function collapses a cell of strings to a single string (with a - % given delimiter inbetween two strings, if desired). - % - % Example of usage: - % collapse(cellstr, ',') - - if length(cellstr)<1 - newstr = []; - return - end - - if isnumeric(cellstr{1}) - newstr = my_num2str(cellstr{1}); - else - newstr = cellstr{1}; - end - - for k = 2:length(cellstr) - if isnumeric(cellstr{k}) - str = my_num2str(cellstr{k}); - else - str = cellstr{k}; - end - newstr = [newstr, delimiter, str]; - end - -end -% ========================================================================= diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/m2tInputParser.m b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/m2tInputParser.m deleted file mode 100644 index 30147cdd..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/m2tInputParser.m +++ /dev/null @@ -1,256 +0,0 @@ -function parser = m2tInputParser() -%MATLAB2TIKZINPUTPARSER Input parsing for matlab2tikz.. -% This implementation exists because Octave is lacking one. - -% Copyright (c) 2008--2014 Nico Schlömer -% All rights reserved. -% -% Redistribution and use in source and binary forms, with or without -% modification, are permitted provided that the following conditions are -% met: -% -% * Redistributions of source code must retain the above copyright -% notice, this list of conditions and the following disclaimer. -% * Redistributions in binary form must reproduce the above copyright -% notice, this list of conditions and the following disclaimer in -% the documentation and/or other materials provided with the distribution -% -% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -% POSSIBILITY OF SUCH DAMAGE. -% ========================================================================= - % Initialize the structure. - parser = struct (); - % Public Properties - parser.Results = {}; - % Enabel/disable parameters case sensitivity. - parser.CaseSensitive = false; - % Keep parameters not defined by the constructor. - parser.KeepUnmatched = false; - % Enable/disable warning for parameters not defined by the constructor. - parser.WarnUnmatched = true; - % Enable/disable passing arguments in a structure. - parser.StructExpand = true; - % Names of parameters defined in input parser constructor. - parser.Parameters = {}; - % Names of parameters not defined in the constructor. - parser.Unmatched = struct (); - % Names of parameters using default values. - parser.UsingDefaults = {}; - % Names of deprecated parameters and their alternatives - parser.DeprecatedParameters = struct(); - - % Handles for functions that act on the object. - parser.addRequired = @addRequired; - parser.addOptional = @addOptional; - parser.addParamValue = @addParamValue; - parser.deprecateParam = @deprecateParam; - parser.parse = @parse; - - % Initialize the parser plan - parser.plan = {}; -end -% ========================================================================= -function p = parser_plan (q, arg_type, name, default, validator) - p = q; - plan = p.plan; - if (isempty (plan)) - plan = struct (); - n = 1; - else - n = numel (plan) + 1; - end - plan(n).type = arg_type; - plan(n).name = name; - plan(n).default = default; - plan(n).validator = validator; - p.plan = plan; -end -% ========================================================================= -function p = addRequired (p, name, validator) - p = parser_plan (p, 'required', name, [], validator); -end -% ========================================================================= -function p = addOptional (p, name, default, validator) - p = parser_plan (p, 'optional', name, default, validator); -end -% ========================================================================= -function p = addParamValue (p, name, default, validator) - p = parser_plan (p, 'paramvalue', name, default, validator); -end -% ========================================================================= -function p = deprecateParam (p, name, alternatives) - if isempty(alternatives) - alternatives = {}; - elseif ischar(alternatives) - alternatives = {alternatives}; % make cellstr - elseif ~iscellstr(alternatives) - error('m2tInputParser:BadAlternatives',... - 'Alternatives for a deprecated parameter must be a char or cellstr'); - end - p.DeprecatedParameters.(name) = alternatives; -end -% ========================================================================= -function p = parse (p, varargin) - plan = p.plan; - results = p.Results; - using_defaults = {}; - if (p.CaseSensitive) - name_cmp = @strcmp; - else - name_cmp = @strcmpi; - end - if (p.StructExpand) - k = find (cellfun (@isstruct, varargin)); - for m = numel(k):-1:1 - n = k(m); - s = varargin{n}; - c = [fieldnames(s).'; struct2cell(s).']; - c = c(:).'; - if (n > 1 && n < numel (varargin)) - varargin = horzcat (varargin(1:n-1), c, varargin(n+1:end)); - elseif (numel (varargin) == 1) - varargin = c; - elseif (n == 1); - varargin = horzcat (c, varargin(n+1:end)); - else % n == numel (varargin) - varargin = horzcat (varargin(1:n-1), c); - end - end - end - if (isempty (results)) - results = struct (); - end - type = {plan.type}; - n = find( strcmp( type, 'paramvalue' ) ); - m = setdiff (1:numel( plan ), n ); - plan = plan ([n,m]); - for n = 1 : numel (plan) - found = false; - results.(plan(n).name) = plan(n).default; - if (~ isempty (varargin)) - switch plan(n).type - case 'required' - found = true; - if (strcmpi (varargin{1}, plan(n).name)) - varargin(1) = []; - end - value = varargin{1}; - varargin(1) = []; - case 'optional' - m = find (cellfun (@ischar, varargin)); - k = find (name_cmp (plan(n).name, varargin(m))); - if (isempty (k) && validate_arg (plan(n).validator, varargin{1})) - found = true; - value = varargin{1}; - varargin(1) = []; - elseif (~ isempty (k)) - m = m(k); - found = true; - value = varargin{max(m)+1}; - varargin(union(m,m+1)) = []; - end - case 'paramvalue' - m = find( cellfun (@ischar, varargin) ); - k = find (name_cmp (plan(n).name, varargin(m))); - if (~ isempty (k)) - found = true; - m = m(k); - value = varargin{max(m)+1}; - varargin(union(m,m+1)) = []; - end - otherwise - error( sprintf ('%s:parse', mfilename), ... - 'parse (%s): Invalid argument type.', mfilename ... - ) - end - end - if (found) - if (validate_arg (plan(n).validator, value)) - results.(plan(n).name) = value; - else - error( sprintf ('%s:invalidinput', mfilename), ... - '%s: Input argument ''%s'' has invalid value.\n', mfilename, plan(n).name ... - ); - end - p.Parameters = union (p.Parameters, {plan(n).name}); - elseif (strcmp (plan(n).type, 'required')) - error( sprintf ('%s:missinginput', mfilename), ... - '%s: input ''%s'' is missing.\n', mfilename, plan(n).name ... - ); - else - using_defaults = union (using_defaults, {plan(n).name}); - end - end - - if ~isempty(varargin) - % Include properties that do not match specified properties - for n = 1:2:numel(varargin) - if ischar(varargin{n}) - if p.KeepUnmatched - results.(varargin{n}) = varargin{n+1}; - end - if p.WarnUnmatched - warning(sprintf('%s:unmatchedArgument',mfilename), ... - 'Ignoring unknown argument "%s"', varargin{n}); - end - p.Unmatched.(varargin{n}) = varargin{n+1}; - else - error (sprintf ('%s:invalidinput', mfilename), ... - '%s: invalid input', mfilename) - end - end - end - - % Store the results of the parsing - p.Results = results; - p.UsingDefaults = using_defaults; - - warnForDeprecatedParameters(p); -end -% ========================================================================= -function result = validate_arg (validator, arg) - try - result = validator (arg); - catch %#ok - result = false; - end -end -% ========================================================================= -function warnForDeprecatedParameters(p) - usedDeprecatedParameters = intersect(p.Parameters, fieldnames(p.DeprecatedParameters)); - - for iParam = 1:numel(usedDeprecatedParameters) - oldParameter = usedDeprecatedParameters{iParam}; - alternatives = p.DeprecatedParameters.(oldParameter); - - switch numel(alternatives) - case 0 - replacements = ''; - case 1 - replacements = ['''' alternatives{1} '''']; - otherwise - replacements = deblank(sprintf('''%s'' and ',alternatives{:})); - replacements = regexprep(replacements,' and$',''); - end - if ~isempty(replacements) - replacements = sprintf('From now on, please use %s to control the output.\n',replacements); - end - - message = ['\n===============================================================================\n', ... - 'You are using the deprecated parameter ''%s''.\n', ... - '%s', ... - '===============================================================================']; - warning('matlab2tikz:deprecatedParameter', ... - message, oldParameter, replacements); - - end -end diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/matlab2tikz.m b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/matlab2tikz.m deleted file mode 100644 index faae1d05..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/matlab2tikz.m +++ /dev/null @@ -1,5555 +0,0 @@ -function matlab2tikz(varargin) -%MATLAB2TIKZ Save figure in native LaTeX (TikZ/Pgfplots). -% MATLAB2TIKZ() saves the current figure as LaTeX file. -% MATLAB2TIKZ comes with several options that can be combined at will. -% -% MATLAB2TIKZ(FILENAME,...) or MATLAB2TIKZ('filename',FILENAME,...) -% stores the LaTeX code in FILENAME. -% -% MATLAB2TIKZ('filehandle',FILEHANDLE,...) stores the LaTeX code in the file -% referenced by FILEHANDLE. (default: []) -% -% MATLAB2TIKZ('figurehandle',FIGUREHANDLE,...) explicitly specifies the -% handle of the figure that is to be stored. (default: gcf) -% -% MATLAB2TIKZ('colormap',DOUBLE,...) explicitly specifies the colormap to be -% used. (default: current color map) -% -% MATLAB2TIKZ('strict',BOOL,...) tells MATLAB2TIKZ to adhere to MATLAB(R) -% conventions wherever there is room for relaxation. (default: false) -% -% MATLAB2TIKZ('strictFontSize',BOOL,...) retains the exact font sizes -% specified in MATLAB for the TikZ code. This goes against normal LaTeX -% practice. (default: false) -% -% MATLAB2TIKZ('showInfo',BOOL,...) turns informational output on or off. -% (default: true) -% -% MATLAB2TIKZ('showWarnings',BOOL,...) turns warnings on or off. -% (default: true) -% -% MATLAB2TIKZ('imagesAsPng',BOOL,...) stores MATLAB(R) images as (lossless) -% PNG files. This is more efficient than storing the image color data as TikZ -% matrix. (default: true) -% -% MATLAB2TIKZ('externalData',BOOL,...) stores all data points in external -% files as tab separated values (TSV files). (default: false) -% -% MATLAB2TIKZ('dataPath',CHAR, ...) defines where external data files -% and/or PNG figures are saved. It can be either an absolute or a relative -% path with respect to your MATLAB work directory. By default, data files are -% placed in the same directory as the TikZ output file. To place data files -% in your MATLAB work directory, you can use '.'. (default: []) -% -% MATLAB2TIKZ('relativeDataPath',CHAR, ...) tells MATLAB2TIKZ to use the -% given path to follow the external data files and PNG files. This is the -% relative path from your main LaTeX file to the data file directory. -% By default the same directory is used as the output (default: []) -% -% MATLAB2TIKZ('height',CHAR,...) sets the height of the image. This can be -% any LaTeX-compatible length, e.g., '3in' or '5cm' or '0.5\textwidth'. If -% unspecified, MATLAB2TIKZ tries to make a reasonable guess. -% -% MATLAB2TIKZ('width',CHAR,...) sets the width of the image. -% If unspecified, MATLAB2TIKZ tries to make a reasonable guess. -% -% MATLAB2TIKZ('noSize',BOOL,...) determines whether 'width', 'height', and -% 'scale only axis' are specified in the generated TikZ output. For compatibility with the -% tikzscale package set this to true. (default: false) -% -% MATLAB2TIKZ('extraCode',CHAR or CELLCHAR,...) explicitly adds extra code -% at the beginning of the output file. (default: []) -% -% MATLAB2TIKZ('extraCodeAtEnd',CHAR or CELLCHAR,...) explicitly adds extra -% code at the end of the output file. (default: []) -% -% MATLAB2TIKZ('extraAxisOptions',CHAR or CELLCHAR,...) explicitly adds extra -% options to the Pgfplots axis environment. (default: []) -% -% MATLAB2TIKZ('extraColors', {{'name',[R G B]}, ...} , ...) adds -% user-defined named RGB-color definitions to the TikZ output. -% R, G and B are expected between 0 and 1. (default: {}) -% -% MATLAB2TIKZ('extraTikzpictureOptions',CHAR or CELLCHAR,...) -% explicitly adds extra options to the tikzpicture environment. (default: []) -% -% MATLAB2TIKZ('encoding',CHAR,...) sets the encoding of the output file. -% -% MATLAB2TIKZ('floatFormat',CHAR,...) sets the format used for float values. -% You can use this to decrease the file size. (default: '%.15g') -% -% MATLAB2TIKZ('maxChunkLength',INT,...) sets maximum number of data points -% per \addplot for line plots (default: 4000) -% -% MATLAB2TIKZ('parseStrings',BOOL,...) determines whether title, axes labels -% and the like are parsed into LaTeX by MATLAB2TIKZ's parser. -% If you want greater flexibility, set this to false and use straight LaTeX -% for your labels. (default: true) -% -% MATLAB2TIKZ('parseStringsAsMath',BOOL,...) determines whether to use TeX's -% math mode for more characters (e.g. operators and figures). (default: false) -% -% MATLAB2TIKZ('showHiddenStrings',BOOL,...) determines whether to show -% strings whose were deliberately hidden. This is usually unnecessary, but -% can come in handy for unusual plot types (e.g., polar plots). (default: -% false) -% -% MATLAB2TIKZ('interpretTickLabelsAsTex',BOOL,...) determines whether to -% interpret tick labels as TeX. MATLAB(R) doesn't do that by default. -% (default: false) -% -% MATLAB2TIKZ('tikzFileComment',CHAR,...) adds a custom comment to the header -% of the output file. (default: '') -% -% MATLAB2TIKZ('automaticLabels',BOOL,...) determines whether to automatically -% add labels to plots (where applicable) which make it possible to refer -% to them using \ref{...} (e.g., in the caption of a figure). (default: false) -% -% MATLAB2TIKZ('standalone',BOOL,...) determines whether to produce -% a standalone compilable LaTeX file. Setting this to true may be useful for -% taking a peek at what the figure will look like. (default: false) -% -% MATLAB2TIKZ('checkForUpdates',BOOL,...) determines whether to automatically -% check for updates of matlab2tikz. (default: true) -% -% Example -% x = -pi:pi/10:pi; -% y = tan(sin(x)) - sin(tan(x)); -% plot(x,y,'--rs'); -% matlab2tikz('myfile.tex'); -% - -% Copyright (c) 2008--2014, Nico Schlömer <nico.schloemer@gmail.com> -% All rights reserved. -% -% Redistribution and use in source and binary forms, with or without -% modification, are permitted provided that the following conditions are -% met: -% -% * Redistributions of source code must retain the above copyright -% notice, this list of conditions and the following disclaimer. -% * Redistributions in binary form must reproduce the above copyright -% notice, this list of conditions and the following disclaimer in -% the documentation and/or other materials provided with the distribution -% -% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -% POSSIBILITY OF SUCH DAMAGE. - -% Note: -% This program was based on Paul Wagenaars' Matfig2PGF that can be -% found on http://www.mathworks.com/matlabcentral/fileexchange/12962 . - -%% Check if we are in MATLAB or Octave. -[m2t.env, m2t.envVersion] = getEnvironment(); - -minimalVersion = struct('MATLAB', struct('name','2014a', 'num',[8 3]), ... - 'Octave', struct('name','3.8', 'num',[3 8])); -checkDeprecatedEnvironment(m2t, minimalVersion); - -m2t.cmdOpts = []; -m2t.currentHandles = []; - -m2t.transform = []; % For hgtransform groups -m2t.pgfplotsVersion = [1,3]; -m2t.name = 'matlab2tikz'; -m2t.version = '0.6.0'; -m2t.author = 'Nico Schlömer'; -m2t.authorEmail = 'nico.schloemer@gmail.com'; -m2t.years = '2008--2014'; -m2t.website = 'http://www.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz'; -VCID = VersionControlIdentifier(); -m2t.versionFull = strtrim(sprintf('v%s %s', m2t.version, VCID)); - -m2t.tol = 1.0e-15; % numerical tolerance (e.g. used to test equality of doubles) -m2t.imageAsPngNo = 0; -m2t.dataFileNo = 0; -m2t.barplotId = 0; % identification flag for bar plots -m2t.quiverId = 0; % identification flag for quiver plot styles -m2t.automaticLabelIndex = 0; - -% definition of color depth -m2t.colorDepth = 48; %[bit] RGB color depth (typical values: 24, 30, 48) -m2t.colorPrecision = 2^(-m2t.colorDepth/3); -m2t.colorFormat = sprintf('%%0.%df',ceil(-log10(m2t.colorPrecision))); - -% the actual contents of the TikZ file go here -m2t.content = struct('name', '', ... - 'comment', [], ... - 'options', {opts_new()}, ... - 'content', {cell(0)}, ... - 'children', {cell(0)}); -m2t.preamble = sprintf(['\\usepackage{pgfplots}\n', ... - '\\usepackage{grffile}\n', ... - '\\pgfplotsset{compat=newest}\n', ... - '\\usetikzlibrary{plotmarks}\n', ... - '\\usepackage{amsmath}\n']); - -%% scan the options -ipp = m2tInputParser; - -ipp = ipp.addOptional(ipp, 'filename', '', @(x) filenameValidation(x,ipp)); -ipp = ipp.addOptional(ipp, 'filehandle', [], @filehandleValidation); - -ipp = ipp.addParamValue(ipp, 'figurehandle', get(0,'CurrentFigure'), @ishandle); -ipp = ipp.addParamValue(ipp, 'colormap', [], @isnumeric); -ipp = ipp.addParamValue(ipp, 'strict', false, @islogical); -ipp = ipp.addParamValue(ipp, 'strictFontSize', false, @islogical); -ipp = ipp.addParamValue(ipp, 'showInfo', true, @islogical); -ipp = ipp.addParamValue(ipp, 'showWarnings', true, @islogical); -ipp = ipp.addParamValue(ipp, 'checkForUpdates', true, @islogical); - -ipp = ipp.addParamValue(ipp, 'encoding' , '', @ischar); -ipp = ipp.addParamValue(ipp, 'standalone', false, @islogical); -ipp = ipp.addParamValue(ipp, 'tikzFileComment', '', @ischar); -ipp = ipp.addParamValue(ipp, 'extraColors', {}, @iscolordefinitions); -ipp = ipp.addParamValue(ipp, 'extraCode', {}, @isCellOrChar); -ipp = ipp.addParamValue(ipp, 'extraCodeAtEnd', {}, @isCellOrChar); -ipp = ipp.addParamValue(ipp, 'extraAxisOptions', {}, @isCellOrChar); -ipp = ipp.addParamValue(ipp, 'extraTikzpictureOptions', {}, @isCellOrChar); -ipp = ipp.addParamValue(ipp, 'floatFormat', '%.15g', @ischar); -ipp = ipp.addParamValue(ipp, 'automaticLabels', false, @islogical); -ipp = ipp.addParamValue(ipp, 'showHiddenStrings', false, @islogical); -ipp = ipp.addParamValue(ipp, 'height', '', @ischar); -ipp = ipp.addParamValue(ipp, 'width' , '', @ischar); -ipp = ipp.addParamValue(ipp, 'imagesAsPng', true, @islogical); -ipp = ipp.addParamValue(ipp, 'externalData', false, @islogical); -ipp = ipp.addParamValue(ipp, 'dataPath', '', @ischar); -ipp = ipp.addParamValue(ipp, 'relativeDataPath', '', @ischar); -ipp = ipp.addParamValue(ipp, 'noSize', false, @islogical); - -% Maximum chunk length. -% TeX parses files line by line with a buffer of size buf_size. If the -% plot has too many data points, pdfTeX's buffer size may be exceeded. -% As a work-around, the plot is split into several smaller chunks. -% -% What is a "large" array? -% TeX parser buffer is buf_size=200 000 char on Mac TeXLive, let's say -% 100 000 to be on the safe side. -% 1 point is represented by 25 characters (estimation): 2 coordinates (10 -% char), 2 brackets, comma and white space, + 1 extra char. -% That gives a magic arbitrary number of 4000 data points per array. -ipp = ipp.addParamValue(ipp, 'maxChunkLength', 4000, @isnumeric); - -% By default strings like axis labels are parsed to match the appearance of -% strings as closely as possible to that generated by MATLAB. -% If the user wants to have particular strings in the matlab2tikz output that -% can't be generated in MATLAB, they can disable string parsing. In that case -% all strings are piped literally to the LaTeX output. -ipp = ipp.addParamValue(ipp, 'parseStrings', true, @islogical); - -% In addition to regular string parsing, an additional stage can be enabled -% which uses TeX's math mode for more characters like figures and operators. -ipp = ipp.addParamValue(ipp, 'parseStringsAsMath', false, @islogical); - -% As opposed to titles, axis labels and such, MATLAB(R) does not interpret tick -% labels as TeX. matlab2tikz retains this behavior, but if it is desired to -% interpret the tick labels as TeX, set this option to true. -ipp = ipp.addParamValue(ipp, 'interpretTickLabelsAsTex', false, @islogical); - -%% deprecated parameters (will auto-generate warnings upon parse) -ipp = ipp.addParamValue(ipp, 'relativePngPath', '', @ischar); -ipp = ipp.deprecateParam(ipp, 'relativePngPath', 'relativeDataPath'); - -%% Finally parse all the arguments -ipp = ipp.parse(ipp, varargin{:}); -m2t.cmdOpts = ipp; % store the input parser back into the m2t data struct - -%% inform users of potentially dangerous options -warnAboutParameter(m2t, 'parseStringsAsMath', @(opt)(opt==true), ... - ['This may produce undesirable string output. For full control over output\n', ... - 'strings please set the parameter "parseStrings" to false.']); -warnAboutParameter(m2t, 'noSize', @(opt)(opt==true), ... - 'This may impede both axes sizing and placement!'); -warnAboutParameter(m2t, 'imagesAsPng', @(opt)(opt==false), ... - ['It is highly recommended to use PNG data to store images.\n', ... - 'Make sure to set "imagesAsPng" to true.']); - -% The following color RGB-values which will need to be defined. -% 'extraRgbColorNames' contains their designated names, 'extraRgbColorSpecs' -% their specifications. -[m2t.extraRgbColorNames, m2t.extraRgbColorSpecs] = ... - dealColorDefinitions(m2t.cmdOpts.Results.extraColors); - -%% shortcut -m2t.ff = m2t.cmdOpts.Results.floatFormat; - -%% add global elements -if isempty(m2t.cmdOpts.Results.figurehandle) - error('matlab2tikz:figureNotFound','MATLAB figure not found.'); -end -m2t.currentHandles.gcf = m2t.cmdOpts.Results.figurehandle; -if m2t.cmdOpts.Results.colormap - m2t.currentHandles.colormap = m2t.cmdOpts.Results.colormap; -else - m2t.currentHandles.colormap = get(m2t.currentHandles.gcf, 'colormap'); -end - -%% handle output file handle/file name -[m2t, fid, fileWasOpen] = openFileForOutput(m2t); - -% By default, reference the PNG (if required) from the TikZ file -% as the file path of the TikZ file itself. This works if the MATLAB script -% is executed in the same folder where the TeX file sits. -if isempty(m2t.cmdOpts.Results.relativeDataPath) - if ~isempty(m2t.cmdOpts.Results.relativePngPath) - %NOTE: eventually break backwards compatibility of relative PNG path - m2t.relativeDataPath = m2t.cmdOpts.Results.relativePngPath; - userWarning(m2t, ['Using "relativePngPath" for "relativeDataPath".', ... - ' This will stop working in a future release.']); - else - m2t.relativeDataPath = m2t.cmdOpts.Results.relativeDataPath; - end -else - m2t.relativeDataPath = m2t.cmdOpts.Results.relativeDataPath; -end -if isempty(m2t.cmdOpts.Results.dataPath) - m2t.dataPath = fileparts(m2t.tikzFileName); -else - m2t.dataPath = m2t.cmdOpts.Results.dataPath; -end - - -userInfo(m2t, ['(To disable info messages, pass [''showInfo'', false] to matlab2tikz.)\n', ... - '(For all other options, type ''help matlab2tikz''.)\n']); - -userInfo(m2t, '\nThis is %s %s.\n', m2t.name, m2t.versionFull) - -%% Check for a new matlab2tikz version outside version control -if m2t.cmdOpts.Results.checkForUpdates && isempty(VCID) - m2tUpdater(... - m2t.name, ... - m2t.website, ... - m2t.version, ... - m2t.cmdOpts.Results.showInfo, ... - m2t.env... - ); -end - -%% print some version info to the screen -versionInfo = ['The latest updates can be retrieved from\n' ,... - ' %s\n' ,... - 'where you can also make suggestions and rate %s.\n' ,... - 'For usage instructions, bug reports, the latest ' ,... - 'development versions and more, see\n' ,... - ' https://github.com/matlab2tikz/matlab2tikz,\n' ,... - ' https://github.com/matlab2tikz/matlab2tikz/wiki,\n' ,... - ' https://github.com/matlab2tikz/matlab2tikz/issues.\n']; -userInfo(m2t, versionInfo, m2t.website, m2t.name); - -%% Save the figure as TikZ to file -saveToFile(m2t, fid, fileWasOpen); -end -% ============================================================================== -function [m2t, fid, fileWasOpen] = openFileForOutput(m2t) -% opens the output file and/or show a dialog to select one -if ~isempty(m2t.cmdOpts.Results.filehandle) - fid = m2t.cmdOpts.Results.filehandle; - fileWasOpen = true; - if ~isempty(m2t.cmdOpts.Results.filename) - userWarning(m2t, ... - 'File handle AND file name for output given. File handle used, file name discarded.') - end -else - fileWasOpen = false; - % set filename - if ~isempty(m2t.cmdOpts.Results.filename) - filename = m2t.cmdOpts.Results.filename; - else - [filename, pathname] = uiputfile({'*.tex;*.tikz'; '*.*'}, 'Save File'); - filename = fullfile(pathname, filename); - end - - fid = fileOpenForWrite(m2t, filename); -end -m2t.tikzFileName = fopen(fid); -end -% ============================================================================== -function l = filenameValidation(x, p) -% is the filename argument NOT another keyword? - l = ischar(x) && ~any(strcmp(x,p.Parameters)); -end -% ============================================================================== -function l = filehandleValidation(x) -% is the filehandle the handle to an opened file? - l = isnumeric(x) && any(x==fopen('all')); -end -% ============================================================================== -function l = isCellOrChar(x) - l = iscell(x) || ischar(x); -end -% ============================================================================== -function isValid = iscolordefinitions(colors) - isRGBTuple = @(c)( numel(c) == 3 && all(0<=c & c<=1) ); - isValidEntry = @(e)( iscell(e) && ischar(e{1}) && isRGBTuple(e{2}) ); - - isValid = iscell(colors) && all(cellfun(isValidEntry, colors)); -end -% ============================================================================== -function fid = fileOpenForWrite(m2t, filename) - encoding = switchMatOct(m2t, {'native', m2t.cmdOpts.Results.encoding}, {}); - - fid = fopen(filename, 'w', encoding{:}); - if fid == -1 - error('matlab2tikz:fileOpenError', ... - 'Unable to open file ''%s'' for writing.', filename); - end -end -% ============================================================================== -function path = TeXpath(path) - path = strrep(path, filesep, '/'); -% TeX uses '/' as a file separator (as UNIX). Windows, however, uses -% '\' which is not supported by TeX as a file separator -end -% ============================================================================== -function m2t = saveToFile(m2t, fid, fileWasOpen) -% Save the figure as TikZ to a file. All other routines are called from here. - - % It is important to turn hidden handles on, as visible lines (such as the - % axes in polar plots, for example), are otherwise hidden from their - % parental handles (and can hence not be discovered by matlab2tikz). - % With ShowHiddenHandles 'on', there is no escape. :) - set(0, 'ShowHiddenHandles', 'on'); - - % get all axes handles - [m2t, axesHandles] = findPlotAxes(m2t, m2t.currentHandles.gcf); - - % Turn around the handles vector to make sure that plots that appeared - % first also appear first in the vector. This has effects on the alignment - % and the order in which the plots appear in the final TikZ file. - % In fact, this is not really important but makes things more 'natural'. - axesHandles = axesHandles(end:-1:1); - - % Alternative Positioning of axes. - % Select relevant Axes and draw them. - [relevantAxesHandles, axesBoundingBox] = getRelevantAxes(m2t, axesHandles); - - m2t.axesBoundingBox = axesBoundingBox; - m2t.axesContainers = {}; - for relevantAxesHandle = relevantAxesHandles - m2t = drawAxes(m2t, relevantAxesHandle); - end - - % Handle color bars. - for cbar = m2t.cbarHandles(:)' - m2t = handleColorbar(m2t, cbar); - end - - % Add all axes containers to the file contents. - for axesContainer = m2t.axesContainers - m2t.content = addChildren(m2t.content, axesContainer); - end - - set(0, 'ShowHiddenHandles', 'off'); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % actually print the stuff - minimalPgfplotsVersion = formatPgfplotsVersion(m2t, m2t.pgfplotsVersion); - - environment = sprintf('%s %s',m2t.env, m2t.envVersion); - m2t.content.comment = sprintf(['This file was created by %s.\n', ... - ' Minimal pgfplots version: %s\n'], ... - m2t.name, ... - minimalPgfplotsVersion); - - if m2t.cmdOpts.Results.showInfo - % disable this info if showInfo=false - m2t.content.comment = [m2t.content.comment, ... - sprintf(['\n',... - 'The latest updates can be retrieved from\n', ... - ' %s\n', ... - 'where you can also make suggestions and rate %s.\n'], ... - m2t.website, m2t.name ) ... - ]; - end - - userInfo(m2t, 'You will need pgfplots version %s or newer to compile the TikZ output.',... - minimalPgfplotsVersion); - - % Add custom comment. - if ~isempty(m2t.cmdOpts.Results.tikzFileComment) - m2t.content.comment = [m2t.content.comment, ... - sprintf('\n%s\n', m2t.cmdOpts.Results.tikzFileComment) - ]; - end - - m2t.content.name = 'tikzpicture'; - - % Add custom TikZ options if any given. - m2t.content.options = opts_append_userdefined(m2t.content.options, ... - m2t.cmdOpts.Results.extraTikzpictureOptions); - - m2t.content.colors = generateColorDefinitions(m2t.extraRgbColorNames, ... - m2t.extraRgbColorSpecs, m2t.colorFormat); - - % Finally print it to the file, - addComments(fid, m2t.content.comment); - - if m2t.cmdOpts.Results.standalone - fprintf(fid, '\\documentclass[tikz]{standalone}\n%s\n', m2t.preamble); - end - - addCustomCode(fid, '', m2t.cmdOpts.Results.extraCode, ''); - - if m2t.cmdOpts.Results.standalone - fprintf(fid, '\\begin{document}\n'); - end - % printAll() handles the actual figure plotting. - printAll(m2t, m2t.content, fid); - - addCustomCode(fid, '\n', m2t.cmdOpts.Results.extraCodeAtEnd, ''); - - if m2t.cmdOpts.Results.standalone - fprintf(fid, '\n\\end{document}'); - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % close the file if necessary - if ~fileWasOpen - fclose(fid); - end -end -% ============================================================================== -function str = generateColorDefinitions(names, specs, colorFormat) -% output the color definitions to LaTeX - str = ''; - ff = colorFormat; - if ~isempty(names) - m2t.content.colors = sprintf('%%\n%% defining custom colors\n'); - for k = 1:length(names) - % make sure to append with '%' to avoid spacing woes - str = [str, ... - sprintf(['\\definecolor{%s}{rgb}{', ff, ',', ff, ',', ff,'}%%\n'], ... - names{k}', specs{k})]; - end - str = [str sprintf('%%\n')]; - end -end -% ============================================================================== -function [m2t, axesHandles] = findPlotAxes(m2t, fh) -% find axes handles that are not legends/colorbars - % NOTE: also do R2014b to avoid code duplication - axesHandles = findobj(fh, 'type', 'axes'); - - % Remove all legend handles as they are treated separately. - if ~isempty(axesHandles) - % TODO fix for octave - tagKeyword = switchMatOct(m2t, 'Tag', 'tag'); - % Find all legend handles. This is MATLAB-only. - m2t.legendHandles = findobj(fh, tagKeyword, 'legend'); - m2t.legendHandles = m2t.legendHandles(:)'; - axesHandles = setdiff(axesHandles, m2t.legendHandles); - end - - % Remove all legend handles as they are treated separately. - if ~isempty(axesHandles) - colorbarKeyword = switchMatOct(m2t, 'Colorbar', 'colorbar'); - % Find all colorbar handles. This is MATLAB-only. - cbarHandles = findobj(fh, tagKeyword, colorbarKeyword); - % Octave also finds text handles here; no idea why. Filter. - m2t.cbarHandles = []; - for h = cbarHandles(:)' - if strcmpi(get(h, 'Type'),'axes') - m2t.cbarHandles = [m2t.cbarHandles, h]; - end - end - m2t.cbarHandles = m2t.cbarHandles(:)'; - axesHandles = setdiff(axesHandles, m2t.cbarHandles); - else - m2t.cbarHandles = []; - end - -end -% ============================================================================== -function addComments(fid, comment) -% prints TeX comments to file stream |fid| - if ~isempty(comment) - newline = sprintf('\n'); - newlineTeX = sprintf('\n%%'); - fprintf(fid, '%% %s\n', strrep(comment, newline, newlineTeX)); - end -end -% ============================================================================== -function addCustomCode(fid, before, code, after) - if ~isempty(code) - fprintf(fid, before); - if ischar(code) - code = {code}; - end - if iscellstr(code) - for str = code(:)' - fprintf(fid, '%s\n', str{1}); - end - else - error('matlab2tikz:saveToFile', 'Need str or cellstr.'); - end - fprintf(fid,after); - end -end -% ============================================================================== -function [m2t, pgfEnvironments] = handleAllChildren(m2t, handle) -% Draw all children of a graphics object (if they need to be drawn). -% #COMPLEX: mainly a switch-case - str = ''; - children = get(handle, 'Children'); - - % prepare cell array of pgfEnvironments - pgfEnvironments = cell(0); - - % It's important that we go from back to front here, as this is - % how MATLAB does it, too. Significant for patch (contour) plots, - % and the order of plotting the colored patches. - for child = children(end:-1:1)' - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [m2t, legendString, interpreter] = findLegendInformation(m2t, child); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - switch char(get(child, 'Type')) - % 'axes' environments are treated separately. - - case 'line' - [m2t, str] = drawLine(m2t, child); - - case 'patch' - [m2t, str] = drawPatch(m2t, child); - - case 'image' - [m2t, str] = drawImage(m2t, child); - - case 'contour' - [m2t, str] = drawContour(m2t, child); - - case {'hggroup', 'matlab.graphics.primitive.Group', ... - 'scatter', 'bar', 'stair', 'stem' ,'errorbar', 'area', ... - 'quiver'} - [m2t, str] = drawHggroup(m2t, child); - - case 'hgtransform' - % From http://www.mathworks.de/de/help/matlab/ref/hgtransformproperties.html: - % Matrix: 4-by-4 matrix - % Transformation matrix applied to hgtransform object and its - % children. The hgtransform object applies the transformation - % matrix to all its children. - % More information at http://www.mathworks.de/de/help/matlab/creating_plots/group-objects.html. - m2t.transform = get(child, 'Matrix'); - [m2t, str] = handleAllChildren(m2t, child); - m2t.transform = []; - - case 'surface' - [m2t, str] = drawSurface(m2t, child); - - case 'text' - [m2t, str] = drawVisibleText(m2t, child); - - case 'rectangle' - [m2t, str] = drawRectangle(m2t, child); - - case {'uitoolbar', 'uimenu', 'uicontextmenu', 'uitoggletool',... - 'uitogglesplittool', 'uipushtool', 'hgjavacomponent'} - % don't to anything for these handles and its children - str = ''; - - case '' - warning('matlab2tikz:NoChildren',... - ['No children found for handle %d. ',... - 'Carrying on as if nothing happened'], handle); - - otherwise - error('matlab2tikz:handleAllChildren', ... - 'I don''t know how to handle this object: %s\n', ... - get(child, 'Type')); - - end - - [m2t, str] = addLegendInformation(m2t, str, legendString, interpreter); - - % append the environment - pgfEnvironments{end+1} = str; - end -end -% ============================================================================== -function [m2t, legendString, interpreter] = findLegendInformation(m2t, child) -% Check if 'child' is referenced in a legend. -% If yes, some plot types may want to add stuff (e.g. 'forget plot'). -% Add '\addlegendentry{...}' then after the plot. -legendString = ''; -interpreter = ''; -hasLegend = false; - -% Check if current handle is referenced in a legend. -switch m2t.env - case 'MATLAB' - if ~isempty(m2t.legendHandles) - % Make sure that m2t.legendHandles is a row vector. - for legendHandle = m2t.legendHandles(:)' - ud = get(legendHandle, 'UserData'); - if isfield(ud, 'handles') - plotChildren = ud.handles; - else - plotChildren = getOrDefault(legendHandle, 'PlotChildren', []); - end - if ~isempty(child) - k = find(child == plotChildren); - if isempty(k) - % Lines of error bar plots are not referenced - % directly in legends as an error bars plot contains - % two "lines": the data and the deviations. Here, the - % legends refer to the specgraph.errorbarseries - % handle which is 'Parent' to the line handle. - k = find(get(child,'Parent') == plotChildren); - end - if ~isempty(k) - % Legend entry found. Add it to the plot. - hasLegend = true; - interpreter = get(legendHandle, 'Interpreter'); - if ~isempty(ud) && isfield(ud,'strings') - legendString = ud.lstrings(k); - else - legendString = get(child, 'DisplayName'); - end - end - end - end - end - case 'Octave' - % Octave associates legends with axes, not with (line) plot. - % The variable m2t.gcaHasLegend is set in drawAxes(). - hasLegend = ~isempty(m2t.gcaAssociatedLegend); - interpreter = get(m2t.gcaAssociatedLegend, 'interpreter'); - legendString = getOrDefault(child,'displayname',''); - otherwise - errorUnknownEnvironment(); -end - -% split string to cell, if newline character '\n' (ASCII 10) is present -delimeter = sprintf('\n'); -legendString = regexp(legendString,delimeter,'split'); - -m2t.currentHandleHasLegend = hasLegend && ~isempty(legendString); -end -% ============================================================================== -function [m2t, str] = addLegendInformation(m2t, str, legendString, interpreter) -% Add legend after the plot data. -% The test for ischar(str) && ~isempty(str) is a workaround for hggroups; -% the output might not necessarily be a string, but a cellstr. - if ischar(str) && ~isempty(str) && m2t.currentHandleHasLegend - c = prettyPrint(m2t, legendString, interpreter); - % We also need a legend alignment option to make multiline - % legend entries work. This is added by default in getLegendOpts(). - str = [str, sprintf('\\addlegendentry{%s};\n\n', join(m2t, c, '\\'))]; - end -end -% ============================================================================== -function data = applyHgTransform(m2t, data) - if ~isempty(m2t.transform) - R = m2t.transform(1:3,1:3); - t = m2t.transform(1:3,4); - n = size(data, 1); - data = data * R' + kron(ones(n,1), t'); - end -end -% ============================================================================== -function m2t = drawAxes(m2t, handle) -% Input arguments: -% handle.................The axes environment handle. - -% Handle special cases. - switch lower(get(handle, 'Tag')) - case 'colorbar' - m2t = handleColorbar(m2t, handle); - return - case 'legend' - % In MATLAB, an axis and its legend are siblings, while in Pgfplots, - % the \legend (or \addlegendentry) command must appear within the axis - % environment, so handle it there. - return - otherwise - % continue as usual - end - - % Initialize empty environment. - % Use a struct instead of a custom subclass of hgsetget (which would - % facilitate writing clean code) as structs are more portable (old MATLAB(R) - % versions, GNU Octave). - m2t.axesContainers{end+1} = struct('handle', handle, ... - 'name', '', ... - 'comment', [], ... - 'options', {opts_new()}, ... - 'content', {cell(0)}, ... - 'children', {cell(0)}); - - % update gca - m2t.currentHandles.gca = handle; - - % Bar plots need to have some values counted per axis. Setting - % m2t.barplotId to 0 makes sure these are recomputed in drawBarSeries() - % TODO: find nicer approach for barplots - m2t.barplotId = 0; - - m2t.gcaAssociatedLegend = getAssociatedLegend(m2t, handle); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % get the axes position - pos = getAxesPosition(m2t, handle, ... - m2t.cmdOpts.Results.width, ... - m2t.cmdOpts.Results.height, ... - m2t.axesBoundingBox); - % Axes should not be in px any more - - % set the width - if (~m2t.cmdOpts.Results.noSize) - % optionally prevents setting the width and height of the axis - m2t = setDimensionOfAxes(m2t, 'width', pos.w); - m2t = setDimensionOfAxes(m2t, 'height', pos.h); - - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, 'at', ... - ['{(' formatDim(pos.x.value, pos.x.unit) ','... - formatDim(pos.y.value, pos.y.unit) ')}']); - % the following is general MATLAB behavior: - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'scale only axis', []); - end - % Add the physical dimension of one unit of length in the coordinate system. - % This is used later on to translate lengths to physical units where - % necessary (e.g., in bar plots). - m2t.unitlength.x.unit = pos.w.unit; - xLim = get(m2t.currentHandles.gca, 'XLim'); - m2t.unitlength.x.value = pos.w.value / (xLim(2)-xLim(1)); - m2t.unitlength.y.unit = pos.h.unit; - yLim = get(m2t.currentHandles.gca, 'YLim'); - m2t.unitlength.y.value = pos.h.value / (yLim(2)-yLim(1)); - for axis = 'xyz' - m2t.([axis 'AxisReversed']) = ... - strcmp(get(handle,[upper(axis),'Dir']), 'reverse'); - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % In MATLAB, all plots are treated as 3D plots; it's just the view that - % makes 2D plots appear like 2D. - % Recurse into the children of this environment. Do this here to give the - % contained plots the chance to set m2t.currentAxesContain3dData to true. - m2t.currentAxesContain3dData = false; - [m2t, childrenEnvs] = handleAllChildren(m2t, handle); - m2t.axesContainers{end} = addChildren(m2t.axesContainers{end}, childrenEnvs); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % The rest of this is handling axes options. - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % Get other axis options (ticks, axis color, label,...). - % This is set here such that the axis orientation indicator in m2t is set - % before -- if ~isVisible(handle) -- the handle's children are called. - [m2t, xopts] = getAxisOptions(m2t, handle, 'x'); - [m2t, yopts] = getAxisOptions(m2t, handle, 'y'); - - m2t.axesContainers{end}.options = opts_merge(m2t.axesContainers{end}.options, ... - xopts, yopts); - if m2t.currentAxesContain3dData - [m2t, zopts] = getAxisOptions(m2t, handle, 'z'); - m2t.axesContainers{end}.options = opts_merge(m2t.axesContainers{end}.options, zopts); - - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'view', sprintf(['{', m2t.ff, '}{', m2t.ff, '}'], get(handle, 'View'))); - end - hasXGrid = false; - hasYGrid = false; - hasZGrid = false; - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if ~isVisible(handle) - % Setting hide{x,y} axis also hides the axis labels in Pgfplots whereas - % in MATLAB, they may still be visible. Well. - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, 'hide axis', []); - % % An invisible axes container *can* have visible children, so don't - % % immediately bail out here. - % children = get(handle, 'Children'); - % for child = children(:)' - % if isVisible(child) - % % If the axes contain something that's visible, add an invisible - % % axes pair. - % m2t.axesContainers{end}.name = 'axis'; - % m2t.axesContainers{end}.options = {m2t.axesContainers{end}.options{:}, ... - % 'hide x axis', 'hide y axis'}; - % m2t.axesContainers{end}.comment = getTag(handle); - % break; - % end - % end - % % recurse into the children of this environment - % [m2t, childrenEnvs] = handleAllChildren(m2t, handle); - % m2t.axesContainers{end} = addChildren(m2t.axesContainers{end}, childrenEnvs); - % return - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - m2t.axesContainers{end}.name = 'axis'; - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % background color - m2t = drawBackgroundOfAxes(m2t, handle); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % title - m2t = drawTitleOfAxes(m2t, handle); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % axes locations - m2t = drawBoxAndLineLocationsOfAxes(m2t, handle); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % grid line style - if hasXGrid || hasYGrid || hasZGrid - matlabGridLineStyle = get(handle, 'GridLineStyle'); - % Take over the grid line style in any case when in strict mode. - % If not, don't add anything in case of default line grid line style - % and effectively take Pgfplots' default. - defaultMatlabGridLineStyle = ':'; - if m2t.cmdOpts.Results.strict ... - || ~strcmp(matlabGridLineStyle,defaultMatlabGridLineStyle) - gls = translateLineStyle(matlabGridLineStyle); - axisGridOpts = {'grid style', sprintf('{%s}', gls)}; - m2t.axesContainers{end}.options = cat(1, ... - m2t.axesContainers{end}.options,... - axisGridOpts); - end - else - % When specifying 'axis on top', the axes stay above all graphs (which is - % default MATLAB behavior), but so do the grids (which is not default - % behavior). - %TODO: use proper grid ordering - if m2t.cmdOpts.Results.strict - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'axis on top', []); - end - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - m2t = drawLegendOptionsOfAxes(m2t, handle); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % add manually given extra axis options - m2t.axesContainers{end}.options = opts_append_userdefined(... - m2t.axesContainers{end}.options, m2t.cmdOpts.Results.extraAxisOptions); -end -% ============================================================================== -function legendhandle = getAssociatedLegend(m2t, handle) -% Check if the axis is referenced by a legend (only necessary for Octave) - legendhandle = []; - switch m2t.env - case 'Octave' - if ~isempty(m2t.legendHandles) - % Make sure that m2t.legendHandles is a row vector. - for lhandle = m2t.legendHandles(:)' - ud = get(lhandle, 'UserData'); - if any(handle == ud.handle) - legendhandle = lhandle; - break; - end - end - end - case 'MATLAB' - % no action needed - otherwise - errorUnknownEnvironment(); - end -end -% ============================================================================== -function m2t = setDimensionOfAxes(m2t, widthOrHeight, dimension) -% sets the dimension "name" of the current axes to the struct "dim" - m2t.axesContainers{end}.options = opts_add(... - m2t.axesContainers{end}.options, widthOrHeight, ... - formatDim(dimension.value, dimension.unit)); -end -% ============================================================================== -function m2t = drawBackgroundOfAxes(m2t, handle) -% draw the background color of the current axes - backgroundColor = get(handle, 'Color'); - if ~isNone(backgroundColor) - [m2t, col] = getColor(m2t, handle, backgroundColor, 'patch'); - if ~strcmp(col, 'white') - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'axis background/.style', sprintf('{fill=%s}', col)); - end - end -end -% ============================================================================== -function m2t = drawTitleOfAxes(m2t, handle) -% processes the title of an axes object - title = get(get(handle, 'Title'), 'String'); - if ~isempty(title) - titleInterpreter = get(get(handle, 'Title'), 'Interpreter'); - title = prettyPrint(m2t, title, titleInterpreter); - titleStyle = getFontStyle(m2t, get(handle,'Title')); - if length(title) > 1 - titleStyle = opts_add(titleStyle, 'align', 'center'); - end - if ~isempty(titleStyle) - m2t.axesContainers{end}.options = opts_add(... - m2t.axesContainers{end}.options, 'title style', ... - sprintf('{%s}', opts_print(m2t, titleStyle, ','))); - end - title = join(m2t, title, '\\[1ex]'); - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'title', sprintf('{%s}', title)); - end -end -% ============================================================================== -function m2t = drawBoxAndLineLocationsOfAxes(m2t, handle) -% draw the box and axis line location of an axes object - isboxOn = strcmp(get(handle, 'box'), 'on'); - xloc = get(handle, 'XAxisLocation'); - if isboxOn - if strcmp(xloc, 'bottom') - % default; nothing added - elseif strcmp(xloc, 'top') - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'axis x line*', 'top'); - else - error('matlab2tikz:drawAxes', ... - 'Illegal axis location ''%s''.', xloc); - end - else % box off - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'axis x line*', xloc); - end - yloc = get(handle, 'YAxisLocation'); - if isboxOn - if strcmp(yloc, 'left') - % default; nothing added - elseif strcmp(yloc, 'right') - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'axis y line*', 'right'); - else - error('matlab2tikz:drawAxes', ... - 'Illegal axis location ''%s''.', yloc); - end - else % box off - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'axis y line*', yloc); - end - if m2t.currentAxesContain3dData - % There's no such attribute as 'ZAxisLocation'. - % Instead, the default seems to be 'left'. - if ~isboxOn - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'axis z line*', 'left'); - end - end -end -% ============================================================================== -function m2t = drawLegendOptionsOfAxes(m2t, handle) - % See if there are any legends that need to be plotted. - % Since the legends are at the same level as axes in the hierarchy, - % we can't work out which relates to which using the tree - % so we have to do it by looking for a plot inside which the legend sits. - % This could be done better with a heuristic of finding - % the nearest legend to a plot, which would cope with legends outside - % plot boundaries. - switch m2t.env - case 'MATLAB' - legendHandle = legend(handle); - if ~isempty(legendHandle) - [m2t, key, legendOpts] = getLegendOpts(m2t, legendHandle); - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - key, ... - ['{', legendOpts, '}']); - end - case 'Octave' - % TODO: How to uniquely connect a legend with a pair of axes in Octave? - axisDims = pos2dims(get(handle,'Position')); %#ok - % siblings of this handle: - siblings = get(get(handle,'Parent'), 'Children'); - % "siblings" always(?) is a column vector. Iterating over the column - % with the for statement below wouldn't return the individual vector - % elements but the same column vector, resulting in no legends exported. - % So let's make sure "siblings" is a row vector by reshaping it: - siblings = reshape(siblings, 1, []); - for sibling = siblings - if sibling && strcmp(get(sibling,'Type'), 'axes') && strcmp(get(sibling,'Tag'), 'legend') - legDims = pos2dims(get(sibling, 'Position')); %#ok - - % TODO The following logic does not work for 3D plots. - % => Commented out. - % This creates problems though for stacked plots with legends. - % if ( legDims.left > axisDims.left ... - % && legDims.bottom > axisDims.bottom ... - % && legDims.left + legDims.width < axisDims.left + axisDims.width ... - % && legDims.bottom + legDims.height < axisDims.bottom + axisDims.height) - [m2t, key, legendOpts] = getLegendOpts(m2t, sibling); - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - key, ... - ['{', legendOpts, '}']); - % end - end - end - otherwise - errorUnknownEnvironment(); - end -end -% ============================================================================== -function m2t = handleColorbar(m2t, handle) - if isempty(handle) - return; - end - - % Find the axes environment that this colorbar belongs to. - parentAxesHandle = double(get(handle,'axes')); - parentFound = false; - for k = 1:length(m2t.axesContainers) - if m2t.axesContainers{k}.handle == parentAxesHandle - k0 = k; - parentFound = true; - break; - end - end - if parentFound - m2t.axesContainers{k0}.options = ... - opts_append(m2t.axesContainers{k0}.options, ... - matlab2pgfplotsColormap(m2t, m2t.currentHandles.colormap), []); - % Append cell string. - m2t.axesContainers{k0}.options = cat(1,... - m2t.axesContainers{k0}.options, ... - getColorbarOptions(m2t, handle)); - else - warning('matlab2tikz:parentAxesOfColorBarNotFound',... - 'Could not find parent axes for color bar. Skipping.'); - end -end -% ============================================================================== -function tag = getTag(handle) - % if a tag is given, use it as comment - tag = get(handle, 'tag'); - if ~isempty(tag) - tag = sprintf('Axis "%s"', tag); - else - tag = sprintf('Axis at [%.2g %.2f %.2g %.2g]', get(handle, 'position')); - end -end -% ============================================================================== -function [m2t, options] = getAxisOptions(m2t, handle, axis) - if ~ismember(axis, {'x','y','z'}) - error('matlab2tikz:illegalAxisSpecifier',... - 'Illegal axis specifier ''%s''.', axis); - end - options = opts_new(); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % axis colors - [color, isDfltColor] = getAndCheckDefault('Axes', handle, ... - [upper(axis),'Color'], [ 0 0 0 ]); - if ~isDfltColor || m2t.cmdOpts.Results.strict - [m2t, col] = getColor(m2t, handle, color, 'patch'); - if strcmp(get(handle, 'box'), 'on') - % If the axes are arranged as a box, make sure that the individual - % axes are drawn as four separate paths. This makes the alignment - % at the box corners somewhat less nice, but allows for different - % axis styles (e.g., colors). - options = opts_add(options, 'separate axis lines', []); - end - options = ... - opts_add(options, ... - ['every outer ', axis, ' axis line/.append style'], ... - ['{', col, '}']); - options = ... - opts_add(options, ... - ['every ',axis,' tick label/.append style'], ... - ['{font=\color{',col,'}}']); - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % handle the orientation - isAxisReversed = strcmp(get(handle,[upper(axis),'Dir']), 'reverse'); - m2t.([axis 'AxisReversed']) = isAxisReversed; - if isAxisReversed - options = opts_add(options, [axis, ' dir'], 'reverse'); - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - axisScale = getOrDefault(handle, [upper(axis) 'Scale'], 'lin'); - if strcmp(axisScale, 'log'); - options = opts_add(options, [axis,'mode'], 'log'); - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % get axis limits - limits = get(handle, [upper(axis),'Lim']); - if isfinite(limits(1)) - options = opts_add(options, [axis,'min'], sprintf(m2t.ff, limits(1))); - end - if isfinite(limits(2)) - options = opts_add(options, [axis,'max'], sprintf(m2t.ff, limits(2))); - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % get ticks along with the labels - [ticks, tickLabels, hasMinorTicks, tickDir] = getAxisTicks(m2t, handle, axis); - - % According to http://www.mathworks.com/help/techdoc/ref/axes_props.html, - % the number of minor ticks is automatically determined by MATLAB(R) to - % fit the size of the axis. Until we know how to extract this number, use - % a reasonable default. - matlabDefaultNumMinorTicks = 3; - if ~isempty(ticks) - options = opts_add(options, ... - [axis,'tick'], sprintf('{%s}', ticks)); - end - if ~isempty(tickLabels) - options = opts_add(options, ... - [axis,'ticklabels'], sprintf('{%s}', tickLabels)); - end - if hasMinorTicks - options = opts_add(options, ... - [axis,'minorticks'], 'true'); - if m2t.cmdOpts.Results.strict - options = ... - opts_add(options, ... - sprintf('minor %s tick num', axis), ... - sprintf('{%d}', matlabDefaultNumMinorTicks)); - end - end - if strcmpi(tickDir,'out') - options = opts_add(options, ... - 'tick align','outside'); - elseif strcmpi(tickDir,'both') - options = opts_add(options, ... - 'tick align','center'); - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % get axis label - axisLabel = get(get(handle, [upper(axis),'Label']), 'String'); - if ~isempty(axisLabel) - axisLabelInterpreter = ... - get(get(handle, [upper(axis),'Label']), 'Interpreter'); - label = prettyPrint(m2t, axisLabel, axisLabelInterpreter); - if length(label) > 1 - % If there's more than one cell item, the list - % is displayed multi-row in MATLAB(R). - % To replicate the same in Pgfplots, one can - % use xlabel={first\\second\\third} only if the - % alignment or the width of the "label box" - % is defined. This is a restriction that comes with - % TikZ nodes. - options = opts_add(options, ... - [axis, 'label style'], '{align=center}'); - end - label = join(m2t, label,'\\[1ex]'); - %if isVisible(handle) - options = opts_add(options, ... - [axis, 'label'], sprintf('{%s}', label)); - %else - % m2t.axesContainers{end}.options{end+1} = ... - % sprintf(['extra description/.code={\n', ... - % '\\node[/pgfplots/every axis label,/pgfplots/every axis %s label]{%s};\n', ... - % '}'], axis, label); - %end - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % get grids - if strcmp(getOrDefault(handle, [upper(axis),'Grid'], 'off'), 'on'); - options = opts_add(options, [axis, 'majorgrids'], []); - end - if strcmp(getOrDefault(handle, [upper(axis),'MinorGrid'], 'off'), 'on'); - options = opts_add(options, [axis, 'minorgrids'], []); - end -end -% ============================================================================== -function bool = axisIsVisible(axisHandle) - if ~isVisible(axisHandle) - % An invisible axes container *can* have visible children, so don't - % immediately bail out here. - children = get(axisHandle, 'Children'); - bool = false; - for child = children(:)' - if isVisible(child) - bool = true; - return; - end - end - else - bool = true; - end -end -% ============================================================================== -function [m2t, str] = drawLine(m2t, handle, yDeviation) -% Returns the code for drawing a regular line and error bars. -% This is an extremely common operation and takes place in most of the -% not too fancy plots. - str = ''; - - if ~isVisible(handle) - return - end - - lineStyle = get(handle, 'LineStyle'); - lineWidth = get(handle, 'LineWidth'); - marker = get(handle, 'Marker'); - - % Get draw options. - color = get(handle, 'Color'); - [m2t, xcolor] = getColor(m2t, handle, color, 'patch'); - lineOptions = getLineOptions(m2t, lineStyle, lineWidth); - [m2t, markerOptions] = getMarkerOptions(m2t, handle); - drawOptions = [{sprintf('color=%s', xcolor)}, ... % color - lineOptions, ... - markerOptions]; - - % Check for "special" lines, e.g.: - if strcmp(get(handle, 'Tag'), 'zplane_unitcircle') - % Draw unit circle and axes. - % TODO Don't hardcode "10". - opts = join(m2t, drawOptions, ','); - str = [sprintf('\\draw[%s] (axis cs:0,0) circle[radius=1];\n', opts),... - sprintf('\\draw[%s] (axis cs:-10,0)--(axis cs:10,0);\n', opts), ... - sprintf('\\draw[%s] (axis cs:0,-10)--(axis cs:0,10);\n', opts)]; - return - end - - hasLines = ~isNone(lineStyle) && lineWidth>0.0; - hasMarkers = ~isNone(marker); - if ~hasLines && ~hasMarkers - return - end - - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % Plot the actual line data. - % First put them all together in one multiarray. - % This also implicitly makes sure that the lengths match. - xData = get(handle, 'XData'); - yData = get(handle, 'YData'); - zData = getOrDefault(handle, 'ZData', []); - % We would like to do - % data = [xData(:), yData(:), zData(:)], - % but Octave fails. Hence this isempty() construction. - if isempty(zData) - data = [xData(:), yData(:)]; - else - data = applyHgTransform(m2t, [xData(:), yData(:), zData(:)]); - end - - % check if the *optional* argument 'yDeviation' was given - hasDeviations = false; - if nargin > 2 - data = [data, yDeviation(:,1:2)]; - hasDeviations = true; - end - - % Check if any value is infinite/NaN. In that case, add appropriate option. - if any(~isfinite(data(:))) - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, 'unbounded coords', 'jump'); - end - - if ~isempty(zData) - % Don't try to be smart in parametric 3d plots: Just plot all the data. - [m2t, table] = makeTable(m2t, {'','',''}, data); - str = sprintf('%s\\addplot3 [%s]\n table[row sep=crcr] {%s};\n ', ... - str, join(m2t, drawOptions, ','), table); - - m2t.currentAxesContain3dData = true; - else - % split the data into logical chunks - dataCell = splitLine(m2t, hasLines, data); - - % plot them - for k = 1:length(dataCell) - % If the line has a legend string, make sure to only include a legend - % entry for the *last* occurrence of the plot series. - % Hence the condition k<length(xDataCell). - %if ~isempty(m2t.legendHandles) && (~m2t.currentHandleHasLegend || k < length(dataCell)) - if ~m2t.currentHandleHasLegend || k < length(dataCell) - % No legend entry found. Don't include plot in legend. - opts = join(m2t, [drawOptions, {'forget plot'}], ','); - else - opts = join(m2t, drawOptions, ','); - end - - [m2t, Part] = plotLine2d(m2t, opts, dataCell{k}); - str = [str, Part]; - end - end - - if m2t.cmdOpts.Results.automaticLabels - [m2t, label] = addLabel(m2t); - str = [str, label]; - end -end -% ============================================================================== -function [m2t, str] = addLabel(m2t) - [pathstr, name] = fileparts(m2t.cmdOpts.Results.filename); %#ok - label = sprintf('addplot:%s%d', name, m2t.automaticLabelIndex); - str = sprintf('\\label{%s}\n', label); - m2t.automaticLabelIndex = m2t.automaticLabelIndex + 1; - - userWarning(m2t, 'Automatically added label ''%s'' for line plot.', label); -end -% ============================================================================== -function [m2t,str] = plotLine2d(m2t, opts, data) - errorbarMode = (size(data,2) == 4); % is (optional) yDeviation given? - - str = ''; - if errorbarMode - m2t = needsPgfplotsVersion(m2t, [1,9]); - str = sprintf('plot [error bars/.cd, y dir = both, y explicit]\n'); - end - - % Convert to string array then cell to call sprintf once (and no loops). - if errorbarMode - tabOpts = 'row sep=crcr, y error plus index=2, y error minus index=3'; - else - tabOpts = 'row sep=crcr'; - end - [m2t, table] = makeTable(m2t, repmat({''}, size(data,2)), data); - str = sprintf('\\addplot [%s]\n %s table[%s]{%s};\n',... - opts, str, tabOpts, table); -end -% ============================================================================== -function dataCell = splitLine(m2t, hasLines, data) -% Split the xData, yData into several chunks of data for each of which -% an \addplot will be generated. - dataCell{1} = data; - - % Split each of the current chunks further with respect to outliers. - dataCell = splitByArraySize(m2t, hasLines, dataCell); -end -% ============================================================================== -function dataCellNew = splitByArraySize(m2t, hasLines, dataCell) -% TeX parses files line by line with a buffer of size buf_size. If the -% plot has too many data points, pdfTeX's buffer size may be exceeded. -% As a work-around, the plot is split into several smaller plots, and this -% function does the job. - dataCellNew = cell(0); - - for data = dataCell - chunkStart = 1; - len = size(data{1}, 1); - while chunkStart <= len - chunkEnd = min(chunkStart + m2t.cmdOpts.Results.maxChunkLength - 1, len); - - % Copy over the data to the new containers. - dataCellNew{end+1} = data{1}(chunkStart:chunkEnd,:); - - % If the plot has lines, add an extra (overlap) point to the data - % stream; otherwise the line between two data chunks would be broken. - if hasLines && chunkEnd~=len - dataCellNew{end} = [dataCellNew{end};... - data{1}(chunkEnd+1,:)]; - end - - chunkStart = chunkEnd + 1; - end - end -end -% ============================================================================== -function lineOpts = getLineOptions(m2t, lineStyle, lineWidth) -% Gathers the line options. - lineOpts = cell(0); - - if ~isNone(lineStyle) && (lineWidth > m2t.tol) - lineOpts{end+1} = sprintf('%s', translateLineStyle(lineStyle)); - end - - % Take over the line width in any case when in strict mode. If not, don't add - % anything in case of default line width and effectively take Pgfplots' - % default. - % Also apply the line width if no actual line is there; the markers make use - % of this, too. - matlabDefaultLineWidth = 0.5; - if m2t.cmdOpts.Results.strict ... - || ~abs(lineWidth-matlabDefaultLineWidth) <= m2t.tol - lineOpts{end+1} = sprintf('line width=%.1fpt', lineWidth); - end -end -% ============================================================================== -function [m2t, drawOptions] = getMarkerOptions(m2t, h) -% Handles the marker properties of a line (or any other) plot. - drawOptions = cell(0); - - marker = get(h, 'Marker'); - - if ~isNone(marker) - markerSize = get(h, 'MarkerSize'); - lineStyle = get(h, 'LineStyle'); - lineWidth = get(h, 'LineWidth'); - - [tikzMarkerSize, isDefault] = ... - translateMarkerSize(m2t, marker, markerSize); - - % take over the marker size in any case when in strict mode; - % if not, don't add anything in case of default marker size - % and effectively take Pgfplots' default. - if m2t.cmdOpts.Results.strict || ~isDefault - drawOptions{end+1} = sprintf('mark size=%.1fpt', tikzMarkerSize); - end - - markOptions = cell(0); - % make sure that the markers get painted in solid (and not dashed) - % if the 'lineStyle' is not solid (otherwise there is no problem) - if ~strcmp(lineStyle, 'solid') - markOptions{end+1} = 'solid'; - end - - % print no lines - if isNone(lineStyle) || lineWidth==0 - drawOptions{end+1} = 'only marks'; - end - - % get the marker color right - markerFaceColor = get(h, 'markerfaceColor'); - markerEdgeColor = get(h, 'markeredgeColor'); - [tikzMarker, markOptions] = translateMarker(m2t, marker, ... - markOptions, ~isNone(markerFaceColor)); - if ~isNone(markerFaceColor) - [m2t, xcolor] = getColor(m2t, h, markerFaceColor, 'patch'); - if ~isempty(xcolor) - markOptions{end+1} = sprintf('fill=%s', xcolor); - end - end - if ~isNone(markerEdgeColor) && ~strcmp(markerEdgeColor,'auto') - [m2t, xcolor] = getColor(m2t, h, markerEdgeColor, 'patch'); - if ~isempty(xcolor) - markOptions{end+1} = sprintf('draw=%s', xcolor); - end - end - - % add it all to drawOptions - drawOptions{end+1} = sprintf('mark=%s', tikzMarker); - - if ~isempty(markOptions) - mo = join(m2t, markOptions, ','); - drawOptions{end+1} = ['mark options={', mo, '}']; - end - end -end -% ============================================================================== -function [tikzMarkerSize, isDefault] = ... - translateMarkerSize(m2t, matlabMarker, matlabMarkerSize) -% The markersizes of Matlab and TikZ are related, but not equal. This -% is because -% -% 1.) MATLAB uses the MarkerSize property to describe something like -% the diameter of the mark, while TikZ refers to the 'radius', -% 2.) MATLAB and TikZ take different measures (e.g. the -% edge of a square vs. its diagonal). - if(~ischar(matlabMarker)) - error('matlab2tikz:translateMarkerSize', ... - 'Variable matlabMarker is not a string.'); - end - - if(~isnumeric(matlabMarkerSize)) - error('matlab2tikz:translateMarkerSize', ... - 'Variable matlabMarkerSize is not a numeral.'); - end - - % 6pt is the default MATLAB marker size for all markers - defaultMatlabMarkerSize = 6; - isDefault = abs(matlabMarkerSize(1)-defaultMatlabMarkerSize)<m2t.tol; - % matlabMarkerSize can be vector data, use first index to check the default - % marker size. When the script also handles different markers together with - % changing size and color, the test should be extended to a vector norm, e.g. - % sqrt(e^T*e) < tol, where e=matlabMarkerSize-defaultMatlabMarkerSize - - switch (matlabMarker) - case 'none' - tikzMarkerSize = []; - case {'+','o','x','*','p','pentagram','h','hexagram'} - % In MATLAB, the marker size refers to the edge length of a - % square (for example) (~diameter), whereas in TikZ the - % distance of an edge to the center is the measure (~radius). - % Hence divide by 2. - tikzMarkerSize = matlabMarkerSize(:) / 2; - case '.' - % as documented on the Matlab help pages: - % - % Note that MATLAB draws the point marker (specified by the '.' - % symbol) at one-third the specified size. - % The point (.) marker type does not change size when the - % specified value is less than 5. - % - tikzMarkerSize = matlabMarkerSize(:) / 2 / 3; - case {'s','square'} - % Matlab measures the diameter, TikZ half the edge length - tikzMarkerSize = matlabMarkerSize(:) / 2 / sqrt(2); - case {'d','diamond'} - % MATLAB measures the width, TikZ the height of the diamond; - % the acute angle (at the top and the bottom of the diamond) - % is a manually measured 75 degrees (in TikZ, and MATLAB - % probably very similar); use this as a base for calculations - tikzMarkerSize = matlabMarkerSize(:) / 2 / atan(75/2 *pi/180); - case {'^','v','<','>'} - % for triangles, matlab takes the height - % and tikz the circumcircle radius; - % the triangles are always equiangular - tikzMarkerSize = matlabMarkerSize(:) / 2 * (2/3); - otherwise - error('matlab2tikz:translateMarkerSize', ... - 'Unknown matlabMarker ''%s''.', matlabMarker); - end -end -% ============================================================================== -function [tikzMarker, markOptions] = ... - translateMarker(m2t, matlabMarker, markOptions, faceColorToggle) -% Translates MATLAB markers to their Tikz equivalents -% #COMPLEX: inherently large switch-case - if ~ischar(matlabMarker) - error('matlab2tikz:translateMarker:MarkerNotAString',... - 'matlabMarker is not a string.'); - end - - switch (matlabMarker) - case 'none' - tikzMarker = ''; - case '+' - tikzMarker = '+'; - case 'o' - if faceColorToggle - tikzMarker = '*'; - else - tikzMarker = 'o'; - end - case '.' - tikzMarker = '*'; - case 'x' - tikzMarker = 'x'; - otherwise % the following markers are only available with PGF's - % plotmarks library - userInfo(m2t, '\nMake sure to load \\usetikzlibrary{plotmarks} in the preamble.\n'); - hasFilledVariant = true; - switch (matlabMarker) - - case '*' - tikzMarker = 'asterisk'; - hasFilledVariant = false; - - case {'s','square'} - tikzMarker = 'square'; - - case {'d','diamond'} - tikzMarker = 'diamond'; - - case '^' - tikzMarker = 'triangle'; - - case 'v' - tikzMarker = 'triangle'; - markOptions{end+1} = 'rotate=180'; - - case '<' - tikzMarker = 'triangle'; - markOptions{end+1} = 'rotate=90'; - - case '>' - tikzMarker = 'triangle'; - markOptions{end+1} = 'rotate=270'; - - case {'p','pentagram'} - tikzMarker = 'star'; - - case {'h','hexagram'} - userWarning(m2t, 'MATLAB''s marker ''hexagram'' not available in TikZ. Replacing by ''star''.'); - tikzMarker = 'star'; - - otherwise - error('matlab2tikz:translateMarker:unknownMatlabMarker',... - 'Unknown matlabMarker ''%s''.',matlabMarker); - end - if faceColorToggle && hasFilledVariant - tikzMarker = [tikzMarker '*']; - end - end -end -% ============================================================================== -function [m2t, str] = drawPatch(m2t, handle) -% Draws a 'patch' graphics object (as found in contourf plots, for example). -% - str = ''; - - if ~isVisible(handle) - return - end - - % MATLAB's patch elements are matrices in which each column represents a a - % distinct graphical object. Usually there is only one column, but there may - % be more (-->hist plots, although they are now handled within the barplot - % framework). - XData = get(handle, 'XData'); - YData = get(handle, 'YData'); - ZData = get(handle, 'ZData'); - - % see if individual color values are present - CData = get(handle, 'CData'); - - % If the data points are given in three vectors, we are dealing with one - % single patch. If they are all matrices, then the columns of matrix - % represent one patch each. - if min(size(XData)) == 1 - % Make sure vectors are column vectors. - XData = XData(:); - YData = YData(:); - ZData = ZData(:); - CData = CData(:); - end - - numPatches = size(XData, 2); - - % Ensure that if we have multiple patches and only FaceColor is specified, - % that it doesn't error when creating each patch with cData = CData(:, k);; - if isempty(CData) - CData = zeros(1,numPatches); - end - if length(CData) == 1 - CData = CData(1,1) * ones(1,numPatches); - end - - for k = 1:numPatches - xData = XData(:, k); - yData = YData(:, k); - - if isempty(ZData) - columnNames = {'x', 'y'}; - data = [xData(:), yData(:)]; - plotType = 'addplot'; - else - zData = ZData(:, k); - columnNames = {'x', 'y', 'z'}; - data = applyHgTransform(m2t, [xData(:), yData(:), zData(:)]); - plotType = 'addplot3'; - m2t.currentAxesContain3dData = true; - end - - cData = CData(:, k); - % ----------------------------------------------------------------------- - % gather the draw options - % Make sure that legends are shown in area mode. - drawOptions = {'area legend'}; - - % Use the '\\' as a row separator to make sure that the generated figures - % work in subplot environments. - tableOptions = {'row sep=crcr'}; - - [m2t, markerOptions] = getMarkerOptions(m2t, handle); - drawOptions = [drawOptions, markerOptions]; - - % Add the proper color map even if the map data isn't directly used in - % the plot to make sure that we get correct color bars. - if ~all(cData == cData(1)) && length(cData) == length(xData) - % Add the color map. - m2t.axesContainers{end}.options = ... - opts_append(m2t.axesContainers{end}.options, ... - matlab2pgfplotsColormap(m2t, m2t.currentHandles.colormap), []); - end - % If full color data is provided, we can use point meta color data. - % For some reason, this only works for filled contours in Pgfplots, so - % fall back to explicit color specifications for line plots. - if ~all(cData == cData(1)) && length(cData) == length(xData) ... - && ~isNone(get(handle, 'FaceColor')) - data = [data, cData(:)]; - drawOptions{end+1} = 'patch'; - columnNames{end+1} = 'c'; - tableOptions{end+1} = 'point meta=\thisrow{c}'; - else - % Probably one color only, so things we're probably only dealing with - % one patch here. - % line width - lineStyle = get(handle, 'LineStyle'); - lineWidth = get(handle, 'LineWidth'); - lineOptions = getLineOptions(m2t, lineStyle, lineWidth); - drawOptions = [drawOptions, lineOptions]; - - % Find out color values. - % fill color - faceColor = get(handle, 'FaceColor'); - - % If it still has 'interp', then the CData for the patch is - % just an index into the colormap. Convert to RGB - if strcmpi(faceColor,'interp') - [m2t, index] = cdata2colorindex(m2t, cData(1),handle); - faceColor = m2t.currentHandles.colormap(index,:); - end - - if ~isNone(faceColor) - [m2t, xFaceColor] = getColor(m2t, handle, faceColor, 'patch'); - drawOptions{end+1} = sprintf('fill=%s', xFaceColor); - xFaceAlpha = get(handle, 'FaceAlpha'); - if abs(xFaceAlpha - 1.0) > m2t.tol - drawOptions{end+1} = sprintf('opacity=%s', xFaceAlpha); - end - end - - % draw color - edgeColor = get(handle, 'EdgeColor'); - lineStyle = get(handle, 'LineStyle'); - if isNone(lineStyle) || isNone(edgeColor) - drawOptions{end+1} = 'draw=none'; - else - [m2t, xEdgeColor] = getColor(m2t, handle, edgeColor, 'patch'); - if isempty(xEdgeColor) - % getColor() wasn't able to return a color. This is because - % cdata was an actual vector with different values in it, - % meaning that the color changes along the edge. This is the - % case, for example, with waterfall() plots. - % An actual color maps is needed here. - % - drawOptions{end+1} = 'mesh'; % or surf - m2t.axesContainers{end}.options = ... - opts_append(m2t.axesContainers{end}.options, ... - matlab2pgfplotsColormap(m2t, m2t.currentHandles.colormap), []); - % Append upper and lower limit of the color mapping. - clim = caxis; - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'point meta min', sprintf(m2t.ff, clim(1))); - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'point meta max', sprintf(m2t.ff, clim(2))); - % Note: - % Pgfplots can't currently use FaceColor and colormapped edge - % color in one go. The option 'surf' makes sure that - % colormapped edge colors are used. Face colors are not - % displayed. - else - % getColor() returned a reasonable color value. - drawOptions{end+1} = sprintf('draw=%s', xEdgeColor); - end - end - end - - if ~m2t.currentHandleHasLegend - % No legend entry found. Don't include plot in legend. - drawOptions{end+1} = 'forget plot'; - end - - drawOpts = join(m2t, drawOptions, ','); - % ----------------------------------------------------------------------- - if any(~isfinite(data(:))) - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'unbounded coords', 'jump'); - end - % Plot the actual data. - [m2t, table] = makeTable(m2t, columnNames, data); - - cycle = conditionallyCyclePath(data); - str = sprintf('%s\n\\%s[%s]\ntable[%s] {%s}%s;\n\n',... - str, plotType, drawOpts, join(m2t, tableOptions, ', '), table, cycle); -end -end -% ============================================================================== -function [cycle] = conditionallyCyclePath(data) -% returns "--cycle" when the path should be cyclic in pgfplots -% Mostly, this is the case UNLESS the data record starts or ends with a NaN -% record (i.e. a break in the path) - if any(~isfinite(data([1 end],:))) - cycle = ''; - else - cycle = '--cycle'; - end -end -% ============================================================================== -function [m2t, str] = drawImage(m2t, handle) - str = ''; - - if ~isVisible(handle) - return - end - - % read x-, y-, and color-data - xData = get(handle, 'XData'); - yData = get(handle, 'YData'); - cData = get(handle, 'CData'); - - % Flip the image over as the PNG gets written starting at (0,0), - % which is the top left corner. - cData = cData(end:-1:1,:,:); - - if (m2t.cmdOpts.Results.imagesAsPng) - [m2t, str] = imageAsPNG(m2t, handle, xData, yData, cData); - else - [m2t, str] = imageAsTikZ(m2t, handle, xData, yData, cData); - end - - % Make sure that the axes are still visible above the image. - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'axis on top', []); -end -% ============================================================================== -function [m2t, str] = imageAsPNG(m2t, handle, xData, yData, cData) - m2t.imageAsPngNo = m2t.imageAsPngNo + 1; - % ------------------------------------------------------------------------ - % draw a png image - [pngFileName, pngReferencePath] = externalFilename(m2t, m2t.imageAsPngNo, '.png'); - - % Get color indices for indexed images and truecolor values otherwise - if ndims(cData) == 2 %#ok don't use ismatrix (cfr. #143) - [m2t, colorData] = cdata2colorindex(m2t, cData, handle); - else - colorData = cData; - end - - m = size(cData, 1); - n = size(cData, 2); - - colorData = flipImageIfAxesReversed(m2t, colorData); - - % Write an indexed or a truecolor image - alpha = normalizedAlphaValues(m2t, get(handle,'AlphaData'), handle); - if numel(alpha)==1 - alpha = alpha(ones(size(colorData(:,:,1)))); - end - hasAlpha = ~all(alpha(:)==1); - if hasAlpha - alphaOpts = {'Alpha', alpha}; - else - alphaOpts = {}; - end - if (ndims(colorData) == 2) %#ok don't use ismatrix (cfr. #143) - if size(m2t.currentHandles.colormap, 1) <= 256 && ~hasAlpha - % imwrite supports maximum 256 values in a colormap (i.e. 8 bit) - % and no alpha channel for indexed PNG images. - imwrite(colorData, m2t.currentHandles.colormap, ... - pngFileName, 'png'); - else % use true-color instead - imwrite(ind2rgb(colorData, m2t.currentHandles.colormap), ... - pngFileName, 'png', alphaOpts{:}); - end - else - imwrite(colorData, pngFileName, 'png', alphaOpts{:}); - end - % ----------------------------------------------------------------------- - % dimensions of a pixel in axes units - if n == 1 - xLim = get(m2t.currentHandles.gca, 'XLim'); - xw = xLim(2) - xLim(1); - else - xw = (xData(end)-xData(1)) / (n-1); - end - if m == 1 - yLim = get(m2t.currentHandles.gca, 'YLim'); - yw = yLim(2) - yLim(1); - else - yw = (yData(end)-yData(1)) / (m-1); - end - - opts = opts_new(); - opts = opts_add(opts, 'xmin', sprintf(m2t.ff, xData(1 ) - xw/2)); - opts = opts_add(opts, 'xmax', sprintf(m2t.ff, xData(end) + xw/2)); - opts = opts_add(opts, 'ymin', sprintf(m2t.ff, yData(1 ) - yw/2)); - opts = opts_add(opts, 'ymax', sprintf(m2t.ff, yData(end) + yw/2)); - - str = sprintf('\\addplot [forget plot] graphics [%s] {%s};\n', ... - opts_print(m2t, opts, ','), pngReferencePath); - - userInfo(m2t, ... - ['\nA PNG file is stored at ''%s'' for which\n', ... - 'the TikZ file contains a reference to ''%s''.\n', ... - 'You may need to adapt this, depending on the relative\n', ... - 'locations of the master TeX file and the included TikZ file.\n'], ... - pngFileName, pngReferencePath); -end -function [m2t, str] = imageAsTikZ(m2t, handle, xData, yData, cData) -% writes an image as raw TikZ commands (STRONGLY DISCOURAGED) - str = ''; - - % Generate uniformly distributed X, Y, although xData and yData may be - % non-uniform. - % This is MATLAB(R) behavior. - switch length(xData) - case 2 % only the limits given; common for generic image plots - hX = 1; - case size(cData,1) % specific x-data is given - hX = (xData(end)-xData(1)) / (length(xData)-1); - otherwise - error('drawImage:arrayLengthMismatch', ... - 'Array lengths not matching (%d = size(cdata,1) ~= length(xData) = %d).', m, length(xData)); - end - X = xData(1):hX:xData(end); - - switch length(yData) - case 2 % only the limits given; common for generic image plots - hY = 1; - case size(cData,2) % specific y-data is given - hY = (yData(end)-yData(1)) / (length(yData)-1); - otherwise - error('drawImage:arrayLengthMismatch', ... - 'Array lengths not matching (%d = size(cdata,2) ~= length(yData) = %d).', n, length(yData)); - end - Y = yData(1):hY:yData(end); - - m = length(X); - n = length(Y); - [m2t, xcolor] = getColor(m2t, handle, cData, 'image'); - - % The following section takes pretty long to execute, although in - % principle it is discouraged to use TikZ for those; LaTeX will take - % forever to compile. - % Still, a bug has been filed on MathWorks to allow for one-line - % sprintf'ing with (string+num) cells (Request ID: 1-9WHK4W); - % <http://www.mathworks.de/support/service_requests/Service_Request_Detail.do?ID=183481&filter=&sort=&statusorder=0&dateorder=0>. - % An alternative approach could be to use 'surf' or 'patch' of pgfplots - % with inline tables. - - for i = 1:m - for j = 1:n - str = [str, ... - sprintf(['\t\\fill [%s] (axis cs:', m2t.ff,',', m2t.ff,') rectangle (axis cs:',m2t.ff,',',m2t.ff,');\n'], ... - xcolor{m-i+1,j}, Y(j)-hY/2, X(i)-hX/2, Y(j)+hY/2, X(i)+hX/2 )]; - end - end -end -% ============================================================================== -function [colorData] = flipImageIfAxesReversed(m2t, colorData) -% flip the image if reversed - if m2t.xAxisReversed - colorData = colorData(:, end:-1:1, :); - end - if m2t.yAxisReversed - colorData = colorData(end:-1:1, :, :); - end -end -% ============================================================================== -function alpha = normalizedAlphaValues(m2t, alpha, handle) - alphaDataMapping = getOrDefault(handle, 'AlphaDataMapping', 'none'); - switch lower(alphaDataMapping) - case 'none' % no rescaling needed - case 'scaled' - ALim = get(m2t.currentHandles.gca, 'ALim'); - AMax = ALim(2); - AMin = ALim(1); - if ~isfinite(AMax) - AMax = max(alpha(:)); %NOTE: is this right? - end - alpha = (alpha - AMin)./(AMax - AMin); - case 'direct' - alpha = ind2rgb(alpha, get(m2t.currentHandles.gcf, 'Alphamap')); - otherwise - error('matlab2tikz:UnknownAlphaMapping', ... - 'Unknown alpha mapping "%s"', alphaMapping); - end - alpha = min(1,max(alpha,0)); % clip at range [0, 1] -end -% ============================================================================== -function [m2t, str] = drawContour(m2t, h) -% draw a contour group (MATLAB R2014b and newer only) -plotoptions = opts_new(); -plotoptions = opts_add(plotoptions,'contour prepared'); -plotoptions = opts_add(plotoptions,'contour prepared format','matlab'); -if strcmpi(get(h,'ShowText'),'off') - plotoptions = opts_add(plotoptions,'contour/labels','false'); -end -if strcmpi(get(h,'Fill'),'on') - userWarning(m2t, 'Filled contour replaced by unfilled contour plot.'); - %FIXME: implement colored contour plots -end -%TODO: explicit color handling for contour plots - -contours = get(h,'ContourMatrix'); - -[m2t, table] = makeTable(m2t, {'',''}, contours.'); - -str = sprintf('\\addplot[%s] table[row sep=crcr] {%%\n%s};\n', ... - opts_print(m2t, plotoptions, ', '), table); - -end -% ============================================================================== -function [m2t, str] = drawHggroup(m2t, h) -% Octave doesn't have the handle() function, so there's no way to determine -% the nature of the plot anymore at this point. Set to 'unknown' to force -% fallback handling. This produces something for bar plots, for example. -% #COMPLEX: big switch-case - try - cl = class(handle(h)); - catch %#ok - cl = 'unknown'; - end - - switch(cl) - case {'specgraph.barseries', 'matlab.graphics.chart.primitive.Bar'} - % hist plots and friends - [m2t, str] = drawBarseries(m2t, h); - - case {'specgraph.stemseries', 'matlab.graphics.chart.primitive.Stem'} - % stem plots - [m2t, str] = drawStemSeries(m2t, h); - - case {'specgraph.stairseries', 'matlab.graphics.chart.primitive.Stair'} - % stair plots - [m2t, str] = drawStairSeries(m2t, h); - - case {'specgraph.areaseries', 'matlab.graphics.chart.primitive.Area'} - % scatter plots - [m2t,str] = drawAreaSeries(m2t, h); - - case {'specgraph.quivergroup', 'matlab.graphics.chart.primitive.Quiver'} - % quiver arrows - [m2t, str] = drawQuiverGroup(m2t, h); - - case {'specgraph.errorbarseries', 'matlab.graphics.chart.primitive.ErrorBar'} - % error bars - [m2t,str] = drawErrorBars(m2t, h); - - case {'specgraph.scattergroup','matlab.graphics.chart.primitive.Scatter'} - % scatter plots - [m2t,str] = drawScatterPlot(m2t, h); - - case {'specgraph.contourgroup', 'hggroup', 'matlab.graphics.primitive.Group'} - % handle all those the usual way - [m2t, str] = handleAllChildren(m2t, h); - - case 'scribe.scribeellipse' - % Annotation: ellipse - [m2t, str] = drawEllipse(m2t, h); - - case {'scribe.arrow', 'scribe.doublearrow', 'scribe.line'} - % Annotation: single and double Arrow, line - % These annotations are fully represented by their children - [m2t, str] = handleAllChildren(m2t, h); - - case 'scribe.textbox' - % Annotation: text box - [m2t, str] = drawText(m2t, h); - - case 'scribe.textarrow' - % Annotation: text arrow - [m2t, str] = drawTextarrow(m2t, h); - - case 'scribe.scriberect' - % Annotation: rectangle - [m2t, str] = drawRectangle(m2t, h); - - case 'unknown' - % Weird spurious class from Octave. - [m2t, str] = handleAllChildren(m2t, h); - - otherwise - userWarning(m2t, 'Don''t know class ''%s''. Default handling.', cl); - try - m2tBackup = m2t; - [m2t, str] = handleAllChildren(m2t, h); - catch ME - userWarning(m2t, 'Default handling for ''%s'' failed. Continuing as if it did not occur. \n Original Message:\n %s', cl, getReport(ME)); - [m2t, str] = deal(m2tBackup, ''); % roll-back - end - end -end -% ============================================================================== -function [m2t,env] = drawSurface(m2t, handle) - str = ''; - [m2t, opts, plotType] = surfaceOpts(m2t, handle); - - % Allow for empty surf - if isNone(plotType) - m2t.currentAxesContain3dData = true; - env = str; - return - end - - dx = get(handle, 'XData'); - dy = get(handle, 'YData'); - dz = get(handle, 'ZData'); - if any(~isfinite(dx(:))) || any(~isfinite(dy(:))) || any(~isfinite(dz(:))) - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'unbounded coords', 'jump'); - end - - [numcols, numrows] = size(dz); - - % If dx or dy are given as vectors, convert them to the (wasteful) matrix - % representation first. This makes sure we can treat the data with one - % single sprintf() command below. - if isvector(dx) - dx = ones(numcols,1) * dx(:)'; - end - if isvector(dy) - dy = dy(:) * ones(1,numrows); - end - - % Add 'z buffer=sort' to the options to make sphere plot and the like not - % overlap. There are different options here some of which may be more - % advantageous in other situations; check out Pgfplots' manual here. - % Since 'z buffer=sort' is computationally more expensive for LaTeX, try - % to avoid it for the most default situations, e.g., when dx and dy are - % rank-1-matrices. - if any(~isnan(dx(1,:)) & dx(1,:) ~= dx(2,:)) ... - || any(~isnan(dy(:,1)) & dy(:,1) ~= dy(:,2)) - opts{end+1} = 'z buffer=sort'; - end - - % There are several possibilities of how colors are specified for surface - % plots: - % * explicitly by RGB-values, - % * implicitly through a color map with a point-meta coordinate, - % * implicitly through a color map with a given coordinate (e.g., z). - % - - % Check if we need extra CData. - colors = get(handle, 'CData'); - if length(size(colors)) == 3 && size(colors, 3) == 3 - % Explicit RGB-coded colors. - opts{end+1} = 'mesh/color input=explicit'; - - formatType = 'table[row sep=crcr,header=false,meta index=3]'; - r = colors(:, :, 1); - g = colors(:, :, 2); - b = colors(:, :, 3); - colorFormat = join(m2t, repmat({m2t.ff},[3 1]),','); - color = arrayfun(@(r,g,b)(sprintf(colorFormat,r,g,b)), ... - r(:),g(:),b(:),'UniformOutput',false); - - %formatType = 'table[row sep=crcr,header=false]'; - %formatString = [m2t.ff, ' ', m2t.ff, ' ', m2t.ff, '\\\\\n']; - %data = applyHgTransform(m2t, [dx(:), dy(:), dz(:)]); - - %elseif length(size(colors)) > 2 || any(isnan(colors(:))) - % needsPointmeta = false; - else - opts{end+1} = matlab2pgfplotsColormap(m2t, ... - m2t.currentHandles.colormap); - % If NaNs are present in the color specifications, don't use them for - % Pgfplots; they may be interpreted as strings there. The option - % 'header=false' will be explicitly added. - % Note: - % Pgfplots actually does a better job than MATLAB in determining what - % colors to use for the patches. The circular test case on - % http://www.mathworks.de/de/help/matlab/ref/pcolor.html, for example - % yields a symmetric setup in Pgfplots (and doesn't in MATLAB). - needsPointmeta = any(xor(isnan(dz), isnan(colors)) ... - | (abs(colors - dz) > 1.0e-10)); - if needsPointmeta - % Get color map. - formatType = 'table[row sep=crcr,header=false,meta index=3]'; - opts{end+1} = 'point meta=explicit'; - color = colors(:); - else - formatType = 'table[row sep=crcr,header=false]'; - color = ''; - end - end - data = applyHgTransform(m2t, [dx(:), dy(:), dz(:)]); - - % Add mesh/rows=<num rows> for specifying the row data instead of empty - % lines in the data list below. This makes it possible to reduce the - % data writing to one single sprintf() call. - opts{end+1} = sprintf('mesh/rows=%d', numrows); - - opts = join(m2t, opts, ',\n'); - str = [str, sprintf(['\n\\addplot3[%%\n%s,\n', opts ,']'], plotType)]; - - % TODO Check if surf plot is 'spectrogram' or 'surf' and run corresponding - % algorithm. - % Spectrograms need to have the grid removed, - % m2t.axesContainers{end}.options{end+1} = 'grid=none'; - % Here is where everything is put together. - tabArgs = {'',data(:,1),'',data(:,2),'',data(:,3)}; - if ~isempty(color) - tabArgs(end+1:end+2) = {'',color}; - end - [m2t, table] = makeTable(m2t, tabArgs{:}); - - str = sprintf('%s\n%s {%%\n%s};\n', str, formatType, table); - env = str; - - % TODO: - % - remove grids in spectrogram by either removing grid command - % or adding: 'grid=none' from/in axis options - % - handling of huge data amounts in LaTeX. - - if m2t.cmdOpts.Results.automaticLabels - [m2t, label] = addLabel(m2t); - str = [str, label]; %#ok - end - - m2t.currentAxesContain3dData = true; -end -% ============================================================================== -function [m2t, str] = drawVisibleText(m2t, handle) -% Wrapper for drawText() that only draws visible text - - % There may be some text objects floating around a MATLAB figure which are - % handled by other subfunctions (labels etc.) or don't need to be handled at - % all. - % The HandleVisibility says something about whether the text handle is - % visible as a data structure or not. Typically, a handle is hidden if the - % graphics aren't supposed to be altered, e.g., axis labels. Most of those - % entities are captured by matlab2tikz one way or another, but sometimes they - % are not. This is the case, for example, with polar plots and the axis - % descriptions therein. Also, Matlab treats text objects with a NaN in the - % position as invisible. - if any(isnan(get(handle, 'Position')) | isnan(get(handle, 'Rotation'))) ... - || strcmp(get(handle, 'Visible'), 'off') ... - || (strcmp(get(handle, 'HandleVisibility'), 'off') && ... - ~m2t.cmdOpts.Results.showHiddenStrings) - - str = ''; - return; - end - - [m2t, str] = drawText(m2t, handle); - -end -% ============================================================================== -function [m2t, str] = drawText(m2t, handle) -% Adding text node anywhere in the axes environment. -% Not that, in Pgfplots, long texts get cut off at the axes. This is -% Different from the default MATLAB behavior. To fix this, one could use -% /pgfplots/after end axis/.code. - - str = ''; - - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % get required properties - color = get(handle, 'Color'); - [m2t, tcolor] = getColor(m2t, handle, color, 'patch'); - bgColor = get(handle,'BackgroundColor'); - EdgeColor = get(handle, 'EdgeColor'); - HorizontalAlignment = get(handle, 'HorizontalAlignment'); - String = get(handle, 'String'); - Interpreter = get(handle, 'Interpreter'); - String = prettyPrint(m2t, String, Interpreter); - % Concatenate multiple lines - String = join(m2t, String, '\\'); - VerticalAlignment = get(handle, 'VerticalAlignment'); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % translate them to pgf style - style = opts_new(); - if ~isNone(bgColor) - [m2t, bcolor] = getColor(m2t, handle, bgColor, 'patch'); - style = opts_add(style, 'fill', bcolor); - end - switch VerticalAlignment - case {'top', 'cap'} - style = opts_add(style, 'below'); - case {'baseline', 'bottom'} - style = opts_add(style, 'above'); - end - switch HorizontalAlignment - case 'left' - style = opts_add(style, 'right'); - case 'right' - style = opts_add(style, 'left'); - end - % Add Horizontal alignment - style = opts_add(style, 'align', HorizontalAlignment); - - % remove invisible border around \node to make the text align precisely - style = opts_add(style, 'inner sep', '0mm'); - - % Add rotation, if existing - defaultRotation = 0.0; - rot = getOrDefault(handle, 'Rotation', defaultRotation); - if rot ~= defaultRotation - style = opts_add(style, 'rotate', sprintf(m2t.ff, rot)); - end - - style = opts_merge(style, getFontStyle(m2t, handle)); - - style = opts_add(style, 'text', tcolor); - if ~isNone(EdgeColor) - [m2t, ecolor] = getColor(m2t, handle, EdgeColor, 'patch'); - style = opts_add(style, 'draw', ecolor); - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % plot the thing - pos = get(handle, 'Position'); - units = get(handle, 'Units'); - switch length(pos) - case 2 % Text within a 2d plot - switch units - case 'normalized' - posString = sprintf(['(rel axis cs:', m2t.ff, ',', m2t.ff, ')'], pos); - case 'data' - posString = sprintf(['(axis cs:', m2t.ff, ',', m2t.ff, ')'], pos); - otherwise - defaultUnit = 'cm'; - pos = convertUnits(pos, units, defaultUnit); - posString = ['(' formatDim(pos(1), defaultUnit) ',' ... - formatDim(pos(2), defaultUnit) ')']; - end - - xlim = get(m2t.currentHandles.gca,'XLim'); - ylim = get(m2t.currentHandles.gca,'YLim'); - if pos(1) < xlim(1) || pos(1) > xlim(2) ... - || pos(2) < ylim(1) || pos(2) > ylim(2) - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'clip', 'false'); - end - case 3 % Text within a 3d plot - pos = applyHgTransform(m2t, pos); - if strcmp(units, 'normalized') - posString = sprintf(['(rel axis cs:',m2t.ff,',',m2t.ff,',',m2t.ff,')'], pos); - else - posString = sprintf(['(axis cs:',m2t.ff,',',m2t.ff,',',m2t.ff,')'], pos); - end - - xlim = get(m2t.currentHandles.gca, 'XLim'); - ylim = get(m2t.currentHandles.gca, 'YLim'); - zlim = get(m2t.currentHandles.gca, 'ZLim'); - if pos(1) < xlim(1) || pos(1) > xlim(2) ... - || pos(2) < ylim(1) || pos(2) > ylim(2) ... - || pos(3) < zlim(1) || pos(3) > zlim(2) - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'clip', 'false'); - end - case 4 % Textbox - % TODO: - % - size of the box (e.g. using node attributes minimum width / height) - % - Alignment of the resized box - switch units - case 'normalized' - posString = sprintf(['(rel axis cs:', m2t.ff, ',', m2t.ff, ')'], pos(1:2)); - case 'data' - posString = sprintf(['(axis cs:', m2t.ff, ',', m2t.ff, ')'], pos(1:2)); - otherwise - defaultUnit = 'cm'; - pos = convertUnits(pos, units, defaultUnit); - posString = ['(' formatDim(pos(1), defaultUnit) ',' ... - formatDim(pos(2), defaultUnit) ')']; - end - - xlim = get(m2t.currentHandles.gca,'XLim'); - ylim = get(m2t.currentHandles.gca,'YLim'); - if pos(1) < xlim(1) || pos(1) > xlim(2) ... - || pos(2) < ylim(1) || pos(2) > ylim(2) - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'clip', 'false'); - end - otherwise - error('matlab2tikz:drawText', ... - 'Illegal text position specification.'); - end - str = sprintf('\\node[%s]\nat %s {%s};\n', ... - opts_print(m2t, style, ', '), posString, String); -end -% ============================================================================== -function [m2t, str] = drawRectangle(m2t, handle) - str = ''; - - % there may be some text objects floating around a Matlab figure which - % are handled by other subfunctions (labels etc.) or don't need to be - % handled at all - if strcmp(get(handle, 'Visible'), 'off') ... - || strcmp(get(handle, 'HandleVisibility'), 'off') - return; - end - - % TODO handle Curvature = [0.8 0.4] - - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - lineStyle = get(handle, 'LineStyle'); - lineWidth = get(handle, 'LineWidth'); - if isNone(lineStyle) || lineWidth==0 - return - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % Get draw options. - lineOptions = getLineOptions(m2t, lineStyle, lineWidth); - - colorOptions = cell(0); - % fill color - faceColor = get(handle, 'FaceColor'); - if ~isNone(faceColor) - [m2t, xFaceColor] = getColor(m2t, handle, faceColor, 'patch'); - colorOptions{end+1} = sprintf('fill=%s', xFaceColor); - end - % draw color - edgeColor = get(handle, 'EdgeColor'); - lineStyle = get(handle, 'LineStyle'); - if isNone(lineStyle) || isNone(edgeColor) - colorOptions{end+1} = 'draw=none'; - else - [m2t, xEdgeColor] = getColor(m2t, handle, edgeColor, 'patch'); - colorOptions{end+1} = sprintf('draw=%s', xEdgeColor); - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pos = pos2dims(get(handle, 'Position')); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - drawOptions = [lineOptions, colorOptions]; - % plot the thing - str = sprintf(['\\draw[%s] (axis cs:',m2t.ff,',',m2t.ff, ')', ... - ' rectangle (axis cs:',m2t.ff,',',m2t.ff,');\n'], ... - join(m2t, drawOptions,', '), pos.left, pos.bottom, pos.right, pos.top); -end -% ============================================================================== -function [m2t,surfOptions,plotType] = surfaceOpts(m2t, handle) - faceColor = get(handle, 'FaceColor'); - edgeColor = get(handle, 'EdgeColor'); - - % Check for surf or mesh plot. Second argument in if-check corresponds to - % default values for mesh plot in MATLAB. - if isNone(faceColor) - plotType = 'mesh'; - else - plotType = 'surf'; - end - - surfOptions = cell(0); - - % Set opacity if FaceAlpha < 1 in MATLAB - faceAlpha = get(handle, 'FaceAlpha'); - if isnumeric(faceAlpha) && faceAlpha ~= 1.0 - surfOptions{end+1} = sprintf(['opacity=', m2t.ff], faceAlpha); - end - - % TODO Revisit this selection and create a bunch of test plots. - switch plotType - - % SURFACE - case 'surf' - - % Edge 'none' - if isNone(edgeColor) - if strcmpi(faceColor, 'flat') - surfOptions{end+1} = 'shader=flat'; - elseif strcmpi(faceColor, 'interp'); - surfOptions{end+1} = 'shader=interp'; - end - - % Edge 'interp' - elseif strcmpi(edgeColor, 'interp') - if strcmpi(faceColor, 'interp') - surfOptions{end+1} = 'shader=interp'; - else - surfOptions{end+1} = 'shader=faceted'; - [m2t,xFaceColor] = getColor(m2t, handle, faceColor, 'patch'); - surfOptions{end+1} = sprintf('color=%s',xFaceColor); - end - - % Edge 'flat' - elseif strcmpi(edgeColor, 'flat') - if strcmpi(faceColor, 'flat') - surfOptions{end+1} = 'shader=flat'; - elseif strcmpi(faceColor, 'interp') - surfOptions{end+1} = 'shader=faceted interp'; - elseif isnumeric(faceColor) - [m2t, xFaceColor] = getColor(m2t, handle, faceColor, 'patch'); - surfOptions{end+1} = sprintf('fill=%s',xFaceColor); - end - - % Edge RGB - else - [m2t, xEdgeColor] = getColor(m2t, handle, edgeColor, 'patch'); - surfOptions{end+1} = sprintf('faceted color=%s', xEdgeColor); - if isnumeric(faceColor) - [m2t, xFaceColor] = getColor(m2t, handle, faceColor, 'patch'); - surfOptions{end+1} = sprintf('color=%s', xFaceColor); - else - surfOptions{end+1} = 'shader=faceted'; - end - end - - % MESH - case 'mesh' - if ~isNone(edgeColor) - - % Edge 'interp' - if strcmpi(edgeColor, 'interp') - surfOptions{end+1} = 'shader=flat'; - - % Edge RGB - else - [m2t, xEdgeColor] = getColor(m2t, handle, edgeColor, 'patch'); - surfOptions{end+1} = sprintf('color=%s', xEdgeColor); - end - else - plotType = 'none'; - end - end -end -% ============================================================================== -function [m2t, str] = drawScatterPlot(m2t, h) - str = ''; - - xData = get(h, 'XData'); - yData = get(h, 'YData'); - zData = get(h, 'ZData'); - cData = get(h, 'CData'); - sData = get(h, 'SizeData'); - - matlabMarker = get(h, 'Marker'); - markerFaceColor = get(h, 'MarkerFaceColor'); - markerEdgeColor = get(h, 'MarkerEdgeColor'); - hasFaceColor = ~isNone(markerFaceColor); - hasEdgeColor = ~isNone(markerEdgeColor); - markOptions = cell(0); - [tikzMarker, markOptions] = translateMarker(m2t, matlabMarker, ... - markOptions, hasFaceColor); - - constMarkerkSize = length(sData) == 1; % constant marker size - - % Rescale marker size (not definitive, follow discussion on: - % https://github.com/matlab2tikz/matlab2tikz/pull/316) - sData = translateMarkerSize(m2t, matlabMarker, sqrt(sData)/2); - - if length(cData) == 3 - % No special treatment for the colors or markers are needed. - % All markers have the same color. - if hasFaceColor && ~strcmp(markerFaceColor,'flat'); - [m2t, xcolor] = getColor(m2t, h, markerFaceColor,'patch'); - else - [m2t, xcolor] = getColor(m2t, h, cData, 'patch'); - end - if hasEdgeColor && ~strcmp(markerEdgeColor,'flat'); - [m2t, ecolor] = getColor(m2t, h, markerEdgeColor,'patch'); - else - [m2t, ecolor] = getColor(m2t, h, cData, 'patch'); - end - if constMarkerkSize - drawOptions = { 'only marks', ... - ['mark=' tikzMarker], ... - ['mark options={', join(m2t, markOptions, ','), '}'],... - sprintf('mark size=%.4fpt', sData)}; - if hasFaceColor && hasEdgeColor - drawOptions{end+1} = { ['draw=' ecolor], ... - ['fill=' xcolor] }; - else - drawOptions{end+1} = ['color=' xcolor]; - end - else % if changing marker size but same color on all marks - markerOptions = { ['mark=', tikzMarker], ... - ['mark options={', join(m2t, markOptions, ','), '}'] }; - if hasEdgeColor - markerOptions{end+1} = ['draw=' ecolor]; - else - markerOptions{end+1} = ['draw=' xcolor]; - end - if hasFaceColor - markerOptions{end+1} = ['fill=' xcolor]; - end - % for changing marker size, the 'scatter' option has to be added - drawOptions = { 'scatter', ... - 'only marks', ... - ['color=' xcolor], ... - ['mark=' tikzMarker], ... - ['mark options={', join(m2t, markOptions, ','), '}'] }; - if ~hasFaceColor - drawOptions{end+1} = { ['scatter/use mapped color=' xcolor] }; - else - drawOptions{end+1} = { ['scatter/use mapped color={', join(m2t, markerOptions,','), '}'] }; - end - end - elseif size(cData,2) == 3 - drawOptions = { 'only marks' ... - % TODO Get this in order as soon as Pgfplots can do "scatter rgb". - % 'scatter rgb' ... - }; - else - markerOptions = { ['mark=', tikzMarker], ... - ['mark options={', join(m2t, markOptions, ','), '}'] }; - if hasEdgeColor && hasFaceColor - [m2t, ecolor] = getColor(m2t, h, markerEdgeColor,'patch'); - markerOptions{end+1} = ['draw=' ecolor]; - else - markerOptions{end+1} = 'draw=mapped color'; - end - if hasFaceColor - markerOptions{end+1} = 'fill=mapped color'; - end - drawOptions = { 'scatter', ... - 'only marks', ... - 'scatter src=explicit', ... - ['scatter/use mapped color={', join(m2t, markerOptions,','), '}'] }; - % Add color map. - m2t.axesContainers{end}.options = ... - opts_append(m2t.axesContainers{end}.options, ... - matlab2pgfplotsColormap(m2t, m2t.currentHandles.colormap), []); - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % Plot the thing. - if isempty(zData) - env = 'addplot'; - if length(sData) == 1 - nColumns = 2; - data = [xData(:), yData(:)]; - else - nColumns = 3; - sColumn = 2; - data = [xData(:), yData(:), sData(:)]; - end - else - env = 'addplot3'; - m2t.currentAxesContain3dData = true; - if length(sData) == 1 - nColumns = 3; - data = applyHgTransform(m2t, [xData(:),yData(:),zData(:)]); - else - nColumns = 4; - sColumn = 3; - data = applyHgTransform(m2t, [xData(:),yData(:),zData(:),sData(:)]); - end - end - if ~constMarkerkSize % - drawOptions{end+1} = { ['visualization depends on={\thisrowno{', num2str(sColumn), '} \as \perpointmarksize}'], ... - 'scatter/@pre marker code/.append style={/tikz/mark size=\perpointmarksize}' }; - end - drawOpts = join(m2t, drawOptions, ','); - - metaPart = ''; - if length(cData) == 3 - % If size(cData,1)==1, then all the colors are the same and have - % already been accounted for above. - - elseif size(cData,2) == 3 - %TODO Hm, can't deal with this? - %[m2t, col] = rgb2colorliteral(m2t, cData(k,:)); - %str = strcat(str, sprintf(' [%s]\n', col)); - else - metaPart = sprintf('meta index=%d',size(data,2)); - data = [data, cData(:)]; - nColumns = nColumns + 1; - end - - % The actual printing. - [m2t, table] = makeTable(m2t, repmat({''},1,nColumns), data); - str = sprintf('%s\\%s[%s] plot table[row sep=crcr,%s]{%s};\n', str, env, ... - drawOpts, metaPart, table); -end -% ============================================================================== -function [m2t, str] = drawBarseries(m2t, h) -% Takes care of plots like the ones produced by MATLAB's hist. -% The main pillar is Pgfplots's '{x,y}bar' plot. -% -% TODO Get rid of code duplication with 'drawAxes'. - - str = ''; - - if ~isVisible(h) - return; % don't bother drawing invisible things - end - - % drawAxes sets m2t.barplotId to 0, so all values are recomputed for subplots. - if m2t.barplotId == 0 - % 'barplotId' provides a consecutively numbered ID for each - % barseries plot. This allows for a proper handling of multiple bars. - m2t.barplotTotalNumber = []; - m2t.barShifts = []; - m2t.barAddedAxisOption = false; - end - - % Add 'log origin = infty' if BaseValue differs from zero (log origin=0 is - % the default behaviour since Pgfplots v1.5). - baseValue = get(h, 'BaseValue'); - if baseValue ~= 0.0 - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'log origin', 'infty'); - end - - [m2t, numBars] = countBarplotSiblings(m2t, h); - - xData = get(h, 'XData'); - yData = get(h, 'YData'); - - % init drawOptions - drawOptions = opts_new(); - - barlayout = get(h, 'BarLayout'); - isHoriz = strcmp(get(h, 'Horizontal'), 'on'); - if (isHoriz) - barType = 'xbar'; - else - barType = 'ybar'; - end - switch barlayout - case 'grouped' % grouped bar plots - m2t.barplotId = m2t.barplotId + 1; - - % Maximum group width relative to the minimum distance between two - % x-values. See <MATLAB>/toolbox/matlab/specgraph/makebars.m - maxGroupWidth = 0.8; - if numBars == 1 - groupWidth = 1.0; - else - groupWidth = min(maxGroupWidth, numBars/(numBars+1.5)); - end - - % Calculate the width of each bar and the center point shift as in - % makebars.m - if isempty(m2t.barShifts) - % Get the shifts of the bar centers. - % In case of numBars==1, this returns 0, - % In case of numBars==2, this returns [-1/4, 1/4], - % In case of numBars==3, this returns [-1/3, 0, 1/3], - % and so forth. - barWidth = groupWidth/numBars; % assumption - m2t.barShifts = ((1:numBars) - 0.5) * barWidth - groupWidth/2; - end - - % From http://www.mathworks.com/help/techdoc/ref/bar.html: - % bar(...,width) sets the relative bar width and controls the - % separation of bars within a group. The default width is 0.8, so if - % you do not specify X, the bars within a group have a slight - % separation. If width is 1, the bars within a group touch one - % another. The value of width must be a scalar. - barWidth = get(h, 'BarWidth') * groupWidth / numBars; - - if numel(xData) == 1 - dx = 1; - else - dx = min(diff(xData)); % used as scaling factor for all other lengths - end - - % MATLAB treats shift and width in normalized coordinate units, - % whereas Pgfplots requires physical units (pt,cm,...); hence - % have the units converted. - if (isHoriz) - physicalBarWidth = dx * barWidth * m2t.unitlength.y.value; - physicalBarShift = dx * m2t.barShifts(m2t.barplotId) * m2t.unitlength.y.value; - physicalBarUnit = m2t.unitlength.y.unit; - else - physicalBarWidth = dx * barWidth * m2t.unitlength.x.value; - physicalBarShift = dx * m2t.barShifts(m2t.barplotId) * m2t.unitlength.x.value; - physicalBarUnit = m2t.unitlength.x.unit; - end - drawOptions = opts_add(drawOptions, barType); - drawOptions = opts_add(drawOptions, 'bar width', ... - formatDim(physicalBarWidth, physicalBarUnit)); - if physicalBarShift ~= 0.0 - drawOptions = opts_add(drawOptions, 'bar shift', ... - formatDim(physicalBarShift, physicalBarUnit)); - end - - case 'stacked' % stacked plots - % Pass option to parent axis & disallow anything but stacked plots - % Make sure this happens exactly *once*. - - if ~m2t.barAddedAxisOption - bWFactor = get(h, 'BarWidth'); - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, ... - 'bar width', ... - formatDim(m2t.unitlength.x.value*bWFactor, m2t.unitlength.x.unit)); - m2t.barAddedAxisOption = true; - end - - % Somewhere between pgfplots 1.5 and 1.8 and starting - % again from 1.11, the option {x|y}bar stacked can be applied to - % \addplot instead of the figure and thus allows to combine stacked - % bar plots and other kinds of plots in the same axis. - % Thus, it is advisable to use pgfplots 1.11. In older versions, the - % plot will only contain a single bar series, but should compile fine. - m2t = needsPgfplotsVersion(m2t, [1,11]); - drawOptions = opts_add(drawOptions, [barType ' stacked']); - otherwise - error('matlab2tikz:drawBarseries', ... - 'Don''t know how to handle BarLayout ''%s''.', barlayout); - end - - % define edge color - edgeColor = get(h, 'EdgeColor'); - lineStyle = get(h, 'LineStyle'); - if isNone(lineStyle) || isNone(edgeColor) - drawOptions = opts_add(drawOptions, 'draw', 'none'); - else - [m2t, xEdgeColor] = getColor(m2t, h, edgeColor, 'patch'); - drawOptions = opts_add(drawOptions, 'draw', xEdgeColor); - end - - [m2t, drawOptions] = getFaceColorOfBar(m2t, h, drawOptions); - - % Add 'area legend' to the options as otherwise the legend indicators - % will just highlight the edges. - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, 'area legend'); - - % plot the thing - if isHoriz - [yDataPlot, xDataPlot] = deal(xData, yData); % swap values - else - [xDataPlot, yDataPlot] = deal(xData, yData); - end - - drawOpts = opts_print(m2t, drawOptions, ','); - [m2t, table ] = makeTable(m2t, '', xDataPlot, '', yDataPlot); - str = sprintf('\\addplot[%s] plot table[row sep=crcr] {%s};\n', drawOpts, table); -end -% ============================================================================== -function [m2t, numBars] = countBarplotSiblings(m2t, h) -% Count the number of sibling bar plots - if isempty(m2t.barplotTotalNumber) - m2t.barplotTotalNumber = 0; - siblings = get(get(h, 'Parent'), 'Children'); - for s = siblings(:)' - - if ~isVisible(s) - continue; % skip invisible objects - end - - if any(strcmpi(get(s, 'Type'), {'hggroup','Bar'})) - cl = class(handle(s)); - switch cl - case {'specgraph.barseries', 'matlab.graphics.chart.primitive.Bar'} - m2t.barplotTotalNumber = m2t.barplotTotalNumber + 1; - case 'specgraph.errorbarseries' - % TODO - % Unfortunately, MATLAB(R) treats error bars and - % corresponding bar plots as siblings of a common axes - % object. For error bars to work with bar plots -- which - % is trivially possible in Pgfplots -- one has to match - % errorbar and bar objects (probably by their values). - userWarning(m2t, 'Error bars discarded (to be implemented).'); - otherwise - error('matlab2tikz:drawBarseries', ... - 'Unknown class''%s''.', cl); - end - end - end - end - numBars = m2t.barplotTotalNumber; -end -% ============================================================================== -function [m2t, drawOptions] = getFaceColorOfBar(m2t, h, drawOptions) -% retrieve the FaceColor of a barseries object - if ~isempty(get(h,'Children')) - % quite oddly, before MATLAB R2014b this value is stored in a child - % patch and not in the object itself - obj = get(h, 'Children'); - else % R2014b and newer - obj = h; - end - faceColor = get(obj, 'FaceColor'); - if ~isNone(faceColor) - [m2t, xFaceColor] = getColor(m2t, h, faceColor, 'patch'); - drawOptions = opts_add(drawOptions, 'fill', xFaceColor); - end -end -% ============================================================================== -function [m2t, str] = drawStemSeries(m2t, h) - [m2t, str] = drawStemOrStairSeries_(m2t, h, 'ycomb'); -end -function [m2t, str] = drawStairSeries(m2t, h) - [m2t, str] = drawStemOrStairSeries_(m2t, h, 'const plot'); -end -function [m2t, str] = drawStemOrStairSeries_(m2t, h, plotType) - str = ''; - - lineStyle = get(h, 'LineStyle'); - lineWidth = get(h, 'LineWidth'); - marker = get(h, 'Marker'); - - if ((isNone(lineStyle) || lineWidth==0) && isNone(marker)) - return % nothing to plot! - end - - %% deal with draw options - color = get(h, 'Color'); - [m2t, plotColor] = getColor(m2t, h, color, 'patch'); - - lineOptions = getLineOptions(m2t, lineStyle, lineWidth); - [m2t, markerOptions] = getMarkerOptions(m2t, h); - - drawOptions = [plotType, ... - sprintf('color=%s', plotColor),... - lineOptions, ... - markerOptions]; - - %% insert draw options - drawOpts = join(m2t, drawOptions, ','); - - %% plot the thing - xData = get(h, 'XData'); - yData = get(h, 'YData'); - [m2t, table] = makeTable(m2t, '', xData, '', yData); - - str = sprintf('%s\\addplot[%s] plot table[row sep=crcr] {%s};\n', ... - str, drawOpts, table); -end -% ============================================================================== -function [m2t, str] = drawAreaSeries(m2t, h) -% Takes care of MATLAB's stem plots. -% -% TODO Get rid of code duplication with 'drawAxes'. - - str = ''; - - if ~isfield(m2t, 'addedAreaOption') || isempty(m2t.addedAreaOption) || ~m2t.addedAreaOption - % Add 'area style' to axes options. - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, 'area style', []); - m2t.axesContainers{end}.options = ... - opts_add(m2t.axesContainers{end}.options, 'stack plots', 'y'); - m2t.addedAreaOption = true; - end - - % Handle draw options. - % define edge color - drawOptions = {}; - edgeColor = get(h, 'EdgeColor'); - [m2t, xEdgeColor] = getColor(m2t, h, edgeColor, 'patch'); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % define face color; - if ~isempty(get(h,'Children')) - % quite oddly, before MATLAB R2014b this value is stored in a child - % patch and not in the object itself - obj = get(h, 'Children'); - else % R2014b and newer - obj = h; - end - faceColor = get(obj, 'FaceColor'); - [m2t, xFaceColor] = getColor(m2t, h, faceColor, 'patch'); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % gather the draw options - lineStyle = get(h, 'LineStyle'); - drawOptions{end+1} = sprintf('fill=%s', xFaceColor); - if isNone(lineStyle) - drawOptions{end+1} = 'draw=none'; - else - drawOptions{end+1} = sprintf('draw=%s', xEdgeColor); - end - drawOpts = join(m2t, drawOptions, ','); - - % plot the thing - xData = get(h, 'XData'); - yData = get(h, 'YData'); - [m2t, table] = makeTable(m2t, '', xData, '', yData); - str = sprintf('%s\\addplot[%s] plot table[row sep=crcr]{%s}\n\\closedcycle;\n',... - str, drawOpts, table); -end -% ============================================================================== -function [m2t, str] = drawQuiverGroup(m2t, h) -% Takes care of MATLAB's quiver plots. - - % used for arrow styles, in case there are more than one quiver fields - m2t.quiverId = m2t.quiverId + 1; - - str = ''; - - [x,y,z,u,v,w,is3D] = getAndRescaleQuivers(h); - - % prepare output - if is3D - name = 'addplot3'; - format = [m2t.ff,',',m2t.ff,',',m2t.ff]; - m2t.currentAxesContain3dData = true; - else % 2D plotting - name = 'addplot'; - format = [m2t.ff,',',m2t.ff]; - end - - data = NaN(6,numel(x)); - data(1,:) = x; - data(2,:) = y; - data(3,:) = z; - data(4,:) = x + u; - data(5,:) = y + v; - data(6,:) = z + w; - - if ~is3D - data([3 6],:) = []; % remove Z-direction - end - - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % gather the arrow options - showArrowHead = get(h, 'ShowArrowHead'); - lineStyle = get(h, 'LineStyle'); - lineWidth = get(h, 'LineWidth'); - - if (isNone(lineStyle) || lineWidth==0) && ~showArrowHead - return - end - - arrowOpts = cell(0); - if showArrowHead - arrowOpts = [arrowOpts, '->']; - else - arrowOpts = [arrowOpts, '-']; - end - - color = get(h, 'Color'); - [m2t, arrowcolor] = getColor(m2t, h, color, 'patch'); - arrowOpts = [arrowOpts, ... - sprintf('color=%s', arrowcolor), ... % color - getLineOptions(m2t, lineStyle, lineWidth), ... % line options - ]; - - % define arrow style - arrowOptions = join(m2t, arrowOpts, ','); - - % Append the arrow style to the TikZ options themselves. - % TODO: Look into replacing this by something more 'local', - % (see \pgfplotset{}). - m2t.content.options = opts_add(m2t.content.options,... - sprintf('arrow%d/.style', m2t.quiverId), ... - ['{', arrowOptions, '}']); - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % return the vector field code - str = [str, ... - sprintf(['\\',name,' [arrow',num2str(m2t.quiverId), '] ', ... - 'coordinates{(',format,') (',format,')};\n'],... - data)]; - %FIXME: external -end -% ============================================================================== -function [x,y,z,u,v,w,is3D] = getAndRescaleQuivers(h) -% get and rescale the arrows from a quivergroup object - x = get(h, 'XData'); - y = get(h, 'YData'); - z = getOrDefault(h, 'ZData', []); - - u = get(h, 'UData'); - v = get(h, 'VData'); - w = getOrDefault(h, 'WData', []); - - if isempty(z) - z = 0; - w = 0; - is3D = false; - else - is3D = true; - end - - % MATLAB uses a scaling algorithm to determine the size of the arrows. - % Before R2014b, the processed coordinates were available. This is no longer - % the case, so we have to re-implement it. In MATLAB it is implemented in - % the |quiver3| (and |quiver|) function. - if any(size(x)==1) - nX = sqrt(numel(x)); nY = nX; - else - [nY, nX] = size(x); - end - range = @(xyzData)(max(xyzData(:)) - min(xyzData(:))); - euclid = @(x,y,z)(sqrt(x.^2 + y.^2 + z.^2)); - dx = range(x)/nX; - dy = range(y)/nY; - dz = range(z)/max(nX,nY); - dd = euclid(dx, dy, dz); - if dd > 0 - vectorLength = euclid(u/dd,v/dd,w/dd); - maxLength = max(vectorLength(:)); - else - maxLength = 1; - end - if getOrDefault(h, 'AutoScale', true) - scaleFactor = getOrDefault(h,'AutoScaleFactor', 0.9) / maxLength; - else - scaleFactor = 1; - end - x = x(:).'; u = u(:).'*scaleFactor; - y = y(:).'; v = v(:).'*scaleFactor; - z = z(:).'; w = w(:).'*scaleFactor; -end -% ============================================================================== -function [m2t, str] = drawErrorBars(m2t, h) -% Takes care of MATLAB's error bar plots. - if isa(h,'matlab.graphics.chart.primitive.ErrorBar') % MATLAB R2014b+ - hData = h; - upDev = get(h, 'UData'); - loDev = get(h, 'LData'); - - yDeviations = [upDev(:), loDev(:)]; - - else % Legacy Handling (Octave and MATLAB R2014a and older): - % 'errorseries' plots have two line-plot children, one of which contains - % the information about the center points; 'XData' and 'YData' components - % are both of length n. - % The other contains the information about the deviations (errors), more - % more precisely: the lines to be drawn. Those are - % ___ - % | - % | - % X <-- (x0,y0) - % | - % _|_ - % - % X: x0, x0, x0-eps, x0+eps, x0-eps, x0+eps; - % Y: y0-dev, y0+dev, y0-dev, y0-dev, y0+dev, y0+dev. - % - % Hence, 'XData' and 'YData' are of length 6*n and contain redundant info. - % Some versions of MATLAB(R) insert more columns with NaNs (to be able to - % pass the entire X, Y arrays into plot()) such that the data is laid out as - % - % X: x0, x0, NaN, x0-eps, x0+eps, NaN, x0-eps, x0+eps; - % Y: y0-dev, y0+dev, NaN, y0-dev, y0-dev, NaN, y0+dev, y0+dev, - % - % or with another columns of NaNs added at the end. - c = get(h, 'Children'); - - % Find out which contains the data and which the deviations. - %TODO: this can be simplified using sort - n1 = length(get(c(1),'XData')); - n2 = length(get(c(2),'XData')); - if n2 == 6*n1 - % 1 contains centerpoint info - dataIdx = 1; - errorIdx = 2; - numDevData = 6; - elseif n1 == 6*n2 - % 2 contains centerpoint info - dataIdx = 2; - errorIdx = 1; - numDevData = 6; - elseif n2 == 9*n1-1 || n2 == 9*n1 - % 1 contains centerpoint info - dataIdx = 1; - errorIdx = 2; - numDevData = 9; - elseif n1 == 9*n2-1 || n1 == 9*n2 - % 2 contains centerpoint info - dataIdx = 2; - errorIdx = 1; - numDevData = 9; - else - error('drawErrorBars:errorMatch', ... - 'Sizes of and error data not matching (6*%d ~= %d and 6*%d ~= %d, 9*%d-1 ~= %d, 9*%d-1 ~= %d).', ... - n1, n2, n2, n1, n1, n2, n2, n1); - end - hData = c(dataIdx); - hError = c(errorIdx); - - % prepare error array (that is, gather the y-deviations) - yValues = get(hData , 'YData'); - yErrors = get(hError, 'YData'); - - n = length(yValues); - - yDeviations = zeros(n, 2); - - %TODO: this can be vectorized - for k = 1:n - % upper deviation - kk = numDevData*(k-1) + 1; - upDev = abs(yValues(k) - yErrors(kk)); - - % lower deviation - kk = numDevData*(k-1) + 2; - loDev = abs(yValues(k) - yErrors(kk)); - - yDeviations(k,:) = [upDev loDev]; - end - end - % Now run drawLine() with deviation information. - [m2t, str] = drawLine(m2t, hData, yDeviations); -end -% ============================================================================== -function [m2t, str] = drawEllipse(m2t, handle) -% Takes care of MATLAB's ellipse annotations. -% - -% c = get(h, 'Children'); - - p = get(handle,'position'); - radius = p([3 4]) / 2; - center = p([1 2]) + radius; - - str = ''; - - lineStyle = get(handle, 'LineStyle'); - lineWidth = get(handle, 'LineWidth'); - - color = get(handle, 'Color'); - [m2t, xcolor] = getColor(m2t, handle, color, 'patch'); - lineOptions = getLineOptions(m2t, lineStyle, lineWidth); - - filling = get(handle, 'FaceColor'); - - %% Has a filling? - if isNone(filling) - drawOptions = [{sprintf('%s', xcolor)}, ... % color - lineOptions]; - drawCommand = '\draw'; - else - [m2t, xcolorF] = getColor(m2t, handle, filling, 'patch'); - drawOptions = [{sprintf('draw=%s,fill=%s', xcolor,xcolorF)}, ... % color - lineOptions]; - drawCommand = '\filldraw'; - end - - opt = join(m2t, drawOptions, ','); - - str = sprintf('%s [%s] (axis cs:%g,%g) ellipse [x radius=%g, y radius=%g];\n', ... - drawCommand, opt, center, radius); -end -% ============================================================================== -function [m2t, str] = drawTextarrow(m2t, handle) -% Takes care of MATLAB's textarrow annotations. - - % handleAllChildren to draw the arrow - [m2t, str] = handleAllChildren(m2t, handle); - - % handleAllChildren ignores the text, unless hidden strings are shown - if ~m2t.cmdOpts.Results.showHiddenStrings - child = findobj(handle, 'type', 'text'); - [m2t, str{end+1}] = drawText(m2t, child); - end -end -% ============================================================================== -function out = linearFunction(X, Y) -% Return the linear function that goes through (X[1], Y[1]), (X[2], Y[2]). - out = @(x) (Y(2,:)*(x-X(1)) + Y(1,:)*(X(2)-x)) / (X(2)-X(1)); -end -% ============================================================================== -function matlabColormap = pgfplots2matlabColormap(points, rgb, numColors) -% Translates a Pgfplots colormap to a MATLAB color map. - matlabColormap = zeros(numColors, 3); - % Point indices between which to interpolate. - I = [1, 2]; - f = linearFunction(points(I), rgb(I,:)); - for k = 1:numColors - x = (k-1)/(numColors-1) * points(end); - if x > points(I(2)) - I = I + 1; - f = linearFunction(points(I), rgb(I,:)); - end - matlabColormap(k,:) = f(x); - end -end -% ============================================================================== -function pgfplotsColormap = matlab2pgfplotsColormap(m2t, matlabColormap) -% Translates a MATLAB color map into a Pgfplots colormap. - -% First check if we could use a default Pgfplots color map. -% Unfortunately, MATLAB and Pgfplots color maps will never exactly coincide -% except to the most simple cases such as blackwhite. This is because of a -% slight incompatibility of Pgfplots and MATLAB colormaps: -% In MATLAB, indexing goes from 1 through 64, whereas in Pgfplots you can -% specify any range, the default ones having something like -% (0: red, 1: yellow, 2: blue). -% To specify this exact color map in MATLAB, one would have to put 'red' at -% 1, blue at 64, and yellow in the middle of the two, 32.5 that is. -% Not really sure how MATLAB rounds here: 32, 33? Anyways, it will be -% slightly off and hence not match the Pgfplots color map. -% As a workaround, build the MATLAB-formatted colormaps of Pgfplots default -% color maps, and check if matlabColormap is close to it. If yes, take it. - -% For now, comment out the color maps which haven't landed yet in Pgfplots. - pgfmaps = { %struct('name', 'colormap/autumn', ... - % 'points', [0,1], ... - % 'values', [[1,0,0];[1,1,0]]), ... - %struct('name', 'colormap/bled', ... - % 'points', 0:6, ... - % 'values', [[0,0,0];[43,43,0];[0,85,0];[0,128,128];[0,0,170];[213,0,213];[255,0,0]]/255), ... - %struct('name', 'colormap/bright', ... - % 'points', 0:7, ... - % 'values', [[0,0,0];[78,3,100];[2,74,255];[255,21,181];[255,113,26];[147,213,114];[230,255,0];[255,255,255]]/255), ... - %struct('name', 'colormap/bone', ... - % 'points', [0,3,6,8], ... - % 'values', [[0,0,0];[84,84,116];[167,199,199];[255,255,255]]/255), ... - %struct('name', 'colormap/cold', ... - % 'points', 0:3, ... - % 'values', [[0,0,0];[0,0,1];[0,1,1];[1,1,1]]), ... - %struct('name', 'colormap/copper', ... - % 'points', [0,4,5], ... - % 'values', [[0,0,0];[255,159,101];[255,199,127]]/255), ... - %struct('name', 'colormap/copper2', ... - % 'points', 0:4, ... - % 'values', [[0,0,0];[68,62,63];[170,112,95];[207,194,138];[255,255,255]]/255), ... - %struct('name', 'colormap/hsv', ... - % 'points', 0:6, ... - % 'values', [[1,0,0];[1,1,0];[0,1,0];[0,1,1];[0,0,1];[1,0,1];[1,0,0]]), ... - struct('name', 'colormap/hot', ... - 'points', 0:3, ... - 'values', [[0,0,1];[1,1,0];[1,0.5,0];[1,0,0]]), ... % TODO check this - struct('name', 'colormap/hot2', ... - 'points', [0,3,6,8], ... - 'values', [[0,0,0];[1,0,0];[1,1,0];[1,1,1]]), ... - struct('name', 'colormap/jet', ... - 'points', [0,1,3,5,7,8], ... - 'values', [[0,0,128];[0,0,255];[0,255,255];[255,255,0];[255,0,0];[128,0,0]]/255), ... - struct('name', 'colormap/blackwhite', ... - 'points', [0,1], ... - 'values', [[0,0,0];[1,1,1]]), ... - struct('name', 'colormap/bluered', ... - 'points', 0:5, ... - 'values', [[0,0,180];[0,255,255];[100,255,0];[255,255,0];[255,0,0];[128,0,0]]/255), ... - struct('name', 'colormap/cool', ... - 'points', [0,1,2], ... - 'values', [[255,255,255];[0,128,255];[255,0,255]]/255), ... - struct('name', 'colormap/greenyellow', ... - 'points', [0,1], ... - 'values', [[0,128,0];[255,255,0]]/255), ... - struct('name', 'colormap/redyellow', ... - 'points', [0,1], ... - 'values', [[255,0,0];[255,255,0]]/255), ... - struct('name', 'colormap/violet', ... - 'points', [0,1,2], ... - 'values', [[25,25,122];[255,255,255];[238,140,238]]/255) ... - }; - - % The tolerance is a subjective matter of course. - % Some figures: - % * The norm-distance between MATLAB's gray and bone is 6.8e-2. - % * The norm-distance between MATLAB's jet and Pgfplots's jet is 2.8e-2. - % * The norm-distance between MATLAB's hot and Pgfplots's hot2 is 2.1e-2. - tol = 5.0e-2; - - for map = pgfmaps - numColors = size(matlabColormap, 1); - mmap = pgfplots2matlabColormap(map{1}.points, map{1}.values, numColors); - alpha = norm(matlabColormap - mmap) / sqrt(numColors); - if alpha < tol - userInfo(m2t, 'Found %s to be a pretty good match for your color map (||diff||=%g).', ... - map{1}.name, alpha); - pgfplotsColormap = map{1}.name; - return - end - end - - % Build a custom color map. - % Loop over the data, stop at each spot where the linear - % interpolation is interrupted, and set a color mark there. - m = size(matlabColormap, 1); - steps = [1, 2]; - % A colormap with a single color is valid in MATLAB but an error in - % pgfplots. Repeating the color produces the desired effect in this - % case. - if m==1 - colors=[matlabColormap(1,:);matlabColormap(1,:)]; - else - colors = [matlabColormap(1,:); matlabColormap(2,:)]; - f = linearFunction(steps, colors); - k = 3; - while k <= m - if norm(matlabColormap(k,:) - f(k)) > 1.0e-10 - % Add the previous step to the color list - steps(end) = k-1; - colors(end,:) = matlabColormap(k-1,:); - steps = [steps, k]; - colors = [colors; matlabColormap(k,:)]; - f = linearFunction(steps(end-1:end), colors(end-1:end,:)); - end - k = k+1; - end - steps(end) = m; - colors(end,:) = matlabColormap(m,:); - end - - % Get it in Pgfplots-readable form. - unit = 'pt'; - colSpecs = {}; - for k = 1:length(steps) - x = steps(k)-1; - sprintf('rgb(%d%s)=(%g, %g, %g)', x, unit, colors(k)); - colSpecs{k} = sprintf('rgb(%d%s)=(%g,%g,%g)', x, unit, colors(k,:)); - end - pgfplotsColormap = sprintf('colormap={mymap}{[1%s] %s}', unit, join(m2t, colSpecs, '; ')); -end -% ============================================================================== -function fontStyle = getFontStyle(m2t, handle) - fontStyle = ''; - if strcmpi(get(handle, 'FontWeight'),'Bold') - fontStyle = sprintf('%s\\bfseries',fontStyle); - end - if strcmpi(get(handle, 'FontAngle'), 'Italic') - fontStyle = sprintf('%s\\itshape',fontStyle); - end - if m2t.cmdOpts.Results.strictFontSize - fontSize = get(handle,'FontSize'); - fontUnits = matlab2texUnits(get(handle,'FontUnits'), 'pt'); - fontStyle = sprintf('\\fontsize{%d%s}{1em}%s\\selectfont',fontSize,fontUnits,fontStyle); - else - % don't try to be smart and "translate" MATLAB font sizes to proper LaTeX - % ones: it cannot be done. LaTeX uses semantic sizes (e.g. \small) - % whose actual dimensions depend on the document style, context, ... - end - - if ~isempty(fontStyle) - fontStyle = opts_add(opts_new, 'font', fontStyle); - else - fontStyle = opts_new(); - end -end -% ============================================================================== -function axisOptions = getColorbarOptions(m2t, handle) - - % begin collecting axes options - axisOptions = opts_new(); - cbarOptions = {}; - cbarStyleOptions = opts_new(); - - % set position, ticks etc. of the colorbar - loc = get(handle, 'Location'); - - switch lower(loc) % case insensitive (MATLAB: CamelCase, Octave: lower case) - case 'north' - cbarOptions{end+1} = 'horizontal'; - cbarStyleOptions = opts_add(cbarStyleOptions, 'at',... - '{(0.5,0.97)}'); - cbarStyleOptions = opts_add(cbarStyleOptions, 'anchor',... - 'north'); - cbarStyleOptions = opts_add(cbarStyleOptions,... - 'xticklabel pos', 'lower'); - cbarStyleOptions = opts_add(cbarStyleOptions, 'width',... - '0.97*\pgfkeysvalueof{/pgfplots/parent axis width}'); - case 'south' - cbarOptions{end+1} = 'horizontal'; - cbarStyleOptions = opts_add(cbarStyleOptions, 'at',... - '{(0.5,0.03)}'); - cbarStyleOptions = opts_add(cbarStyleOptions, 'anchor', ... - 'south'); - cbarStyleOptions = opts_add(cbarStyleOptions, ... - 'xticklabel pos','upper'); - cbarStyleOptions = opts_add(cbarStyleOptions, 'width',... - '0.97*\pgfkeysvalueof{/pgfplots/parent axis width}'); - case 'east' - cbarOptions{end+1} = 'right'; - cbarStyleOptions = opts_add(cbarStyleOptions, 'at',... - '{(0.97,0.5)}'); - cbarStyleOptions = opts_add(cbarStyleOptions, 'anchor', ... - 'east'); - cbarStyleOptions = opts_add(cbarStyleOptions, ... - 'xticklabel pos','left'); - cbarStyleOptions = opts_add(cbarStyleOptions, 'width',... - '0.97*\pgfkeysvalueof{/pgfplots/parent axis width}'); - case 'west' - cbarOptions{end+1} = 'left'; - cbarStyleOptions = opts_add(cbarStyleOptions, 'at',... - '{(0.03,0.5)}'); - cbarStyleOptions = opts_add(cbarStyleOptions, 'anchor',... - 'west'); - cbarStyleOptions = opts_add(cbarStyleOptions,... - 'xticklabel pos', 'right'); - cbarStyleOptions = opts_add(cbarStyleOptions, 'width',... - '0.97*\pgfkeysvalueof{/pgfplots/parent axis width}'); - case 'eastoutside' - %cbarOptions{end+1} = 'right'; - case 'westoutside' - cbarOptions{end+1} = 'left'; - case 'northoutside' - % TODO move to top - cbarOptions{end+1} = 'horizontal'; - cbarStyleOptions = opts_add(cbarStyleOptions, 'at',... - '{(0.5,1.03)}'); - cbarStyleOptions = opts_add(cbarStyleOptions, 'anchor',... - 'south'); - cbarStyleOptions = opts_add(cbarStyleOptions,... - 'xticklabel pos', 'upper'); - case 'southoutside' - - cbarOptions{end+1} = 'horizontal'; - otherwise - error('matlab2tikz:getColorOptions:unknownLocation',... - 'getColorbarOptions: Unknown ''Location'' %s.', loc) - end - - % axis label and direction - if isHG2(m2t) - % VERSION: Starting from R2014b there is only one field `label`. - % The colorbar's position determines, if it should be a x- or y-label. - - % label - % TODO: Move redundant interpreter and multiline code to a separate - % function. It is duplicated below in 'title' and in functions - % 'getAxisOptions' and 'drawTitleOfAxes'. - labelString = get(get(handle, 'Label'), 'String'); - if ~isempty(labelString) % add only, if not empty - labelInterpreter = get(get(handle, 'Label'), 'Interpreter'); - labelString = prettyPrint(m2t, labelString, labelInterpreter); - if length(labelString) > 1 % multiline - cbarStyleOptions = opts_add(cbarStyleOptions, 'label style', ... - '{align=center}'); - end - labelString = join(m2t, labelString, '\\[1ex]'); - - if ~isempty(cbarOptions) && strcmpi(cbarOptions{1}, 'horizontal') - labelOption = 'xlabel'; - else - labelOption = 'ylabel'; - end - - cbarStyleOptions = opts_add(cbarStyleOptions, labelOption, ... - sprintf('{%s}', labelString)); - end - - % direction - dirString = get(handle, 'Direction'); - if ~strcmpi(dirString, 'normal') % only if not 'normal' - if ~isempty(cbarOptions) && strcmpi(cbarOptions{1}, 'horizontal') - dirOption = 'x dir'; - else - dirOption = 'y dir'; - end - cbarStyleOptions = opts_add(cbarStyleOptions, dirOption, dirString); - end - - % TODO HG2: colorbar ticks and colorbar tick labels - - else - % VERSION: Up to MATLAB R2014a and OCTAVE - [m2t, xo] = getAxisOptions(m2t, handle, 'x'); - [m2t, yo] = getAxisOptions(m2t, handle, 'y'); - xyo = opts_merge(xo, yo); - xyo = opts_remove(xyo, 'xmin','xmax','xtick','ymin','ymax','ytick'); - - cbarStyleOptions = opts_merge(cbarStyleOptions, xyo); - end - - % title - title = get(get(handle, 'Title'), 'String'); - if ~isempty(title) - titleInterpreter = get(get(handle, 'Title'), 'Interpreter'); - title = prettyPrint(m2t, title, titleInterpreter); - if length(title) > 1 % multiline - cbarStyleOptions = opts_add(cbarStyleOptions, 'title style', ... - '{align=center}'); - end - title = join(m2t, title, '\\[1ex]'); - cbarStyleOptions = opts_add(cbarStyleOptions, 'title', ... - sprintf('{%s}', title)); - end - - if m2t.cmdOpts.Results.strict - % Sampled colors. - numColors = size(m2t.currentHandles.colormap, 1); - cbarOptions{end+1} = 'sampled'; - cbarStyleOptions = opts_add(cbarStyleOptions, 'samples', ... - sprintf('%d', numColors+1)); - - end - - % Merge them together in axisOptions. - if isempty(cbarOptions) - axisOptions = opts_add(axisOptions, 'colorbar', []); - else - if length(cbarOptions) > 1 - userWarning(m2t, ... - 'Pgfplots cannot deal with more than one colorbar option yet.'); - end - axisOptions = opts_add(axisOptions, ['colorbar ', cbarOptions{1}]); - end - - if ~isempty(cbarStyleOptions) - axisOptions = opts_add(axisOptions, ... - 'colorbar style', ... - ['{' opts_print(m2t, cbarStyleOptions, ',') '}']); - end - - % Append upper and lower limit of the colorbar. - % TODO Use caxis not only for color bars. - clim = caxis(get(handle, 'axes')); - axisOptions = opts_add(axisOptions, 'point meta min', sprintf(m2t.ff, clim(1))); - axisOptions = opts_add(axisOptions, 'point meta max', sprintf(m2t.ff, clim(2))); - - % do _not_ handle colorbar's children -end -% ============================================================================== -function [m2t, xcolor] = getColor(m2t, handle, color, mode) -% Handles MATLAB colors and makes them available to TikZ. -% This includes translation of the color value as well as explicit -% definition of the color if it is not available in TikZ by default. -% -% The variable 'mode' essentially determines what format 'color' can -% have. Possible values are (as strings) 'patch' and 'image'. - -% check if the color is straight given in rgb -% -- notice that we need the extra NaN test with respect to the QUIRK -% below - if isreal(color) && numel(color)==3 && ~any(isnan(color)) - % everything alright: rgb color here - [m2t, xcolor] = rgb2colorliteral(m2t, color); - else - switch lower(mode) - case 'patch' - [m2t, xcolor] = patchcolor2xcolor(m2t, color, handle); - case 'image' - [m2t, colorindex] = cdata2colorindex(m2t, color, handle); - m = size(colorindex, 1); - n = size(colorindex, 2); - xcolor = cell(m, n); - for i = 1:m - for j = 1:n - [m2t, xc] = rgb2colorliteral(m2t, m2t.currentHandles.colormap(colorindex(i,j), :)); - xcolor{i, j} = xc; - end - end - otherwise - error(['matlab2tikz:getColor', ... - 'Argument ''mode'' has illegal value ''%s''.'], ... - mode); - end - end -end -% ============================================================================== -function [m2t, xcolor] = patchcolor2xcolor(m2t, color, patchhandle) -% Transforms a color of the edge or the face of a patch to an xcolor literal. - if ~ischar(color) && ~isnumeric(color) - error('patchcolor2xcolor:illegalInput', ... - 'Input argument ''color'' not a string or numeric.'); - end - if isnumeric(color) - [m2t, xcolor] = rgb2colorliteral(m2t, color); - else - switch color - case 'flat' - cdata = getCDataWithFallbacks(patchhandle); - - col1 = cdata(1,1); - if all(isnan(cdata) | abs(cdata-col1)<1.0e-10) - [m2t, colorindex] = cdata2colorindex(m2t, col1, patchhandle); - [m2t, xcolor] = rgb2colorliteral(m2t, m2t.currentHandles.colormap(colorindex, :)); - else - % Don't return anything meaningful and count on the caller - % to make something of it. - xcolor = []; - end - - case 'auto' - color = get(patchhandle, 'Color'); - [m2t, xcolor] = rgb2colorliteral(m2t, color); - - case 'none' - error('matlab2tikz:anycolor2rgb:ColorModelNoneNotAllowed',... - ['Color model ''none'' not allowed here. ',... - 'Make sure this case gets intercepted before.']); - - otherwise - error('matlab2tikz:anycolor2rgb:UnknownColorModel',... - 'Don''t know how to handle the color model ''%s''.',color); - end - end -end -% ============================================================================== -function cdata = getCDataWithFallbacks(patchhandle) -% Looks for CData at different places - cdata = getOrDefault(patchhandle, 'CData', []); - - if isempty(cdata) || ~isnumeric(cdata) - child = get(patchhandle, 'Children'); - cdata = get(child, 'CData'); - end - if isempty(cdata) || ~isnumeric(cdata) - % R2014b+: CData is implicit by the ordering of the siblings - siblings = get(get(patchhandle, 'Parent'), 'Children'); - cdata = find(siblings(end:-1:1)==patchhandle); - end -end -% ============================================================================== -function [m2t, colorindex] = cdata2colorindex(m2t, cdata, imagehandle) -% Transforms a color in CData format to an index in the color map. -% Only does something if CDataMapping is 'scaled', really. - - if ~isnumeric(cdata) && ~islogical(cdata) - error('matlab2tikz:cdata2colorindex:unknownCDataType',... - 'Don''t know how to handle CData ''%s''.',cdata); - end - - axeshandle = m2t.currentHandles.gca; - - % ----------------------------------------------------------------------- - % For the following, see, for example, the MATLAB help page for 'image', - % section 'Image CDataMapping'. - switch get(imagehandle, 'CDataMapping') - case 'scaled' - % need to scale within clim - % see MATLAB's manual page for caxis for details - clim = get(axeshandle, 'clim'); - m = size(m2t.currentHandles.colormap, 1); - colorindex = zeros(size(cdata)); - idx1 = cdata <= clim(1); - idx2 = cdata >= clim(2); - idx3 = ~idx1 & ~idx2; - colorindex(idx1) = 1; - colorindex(idx2) = m; - colorindex(idx3) = fix((cdata(idx3)-clim(1)) / (clim(2)-clim(1)) *m) ... - + 1; - case 'direct' - % direct index - colorindex = cdata; - - otherwise - error('matlab2tikz:anycolor2rgb:unknownCDataMapping',... - 'Unknown CDataMapping ''%s''.',cdatamapping); - end -end -% ============================================================================== -function [m2t, key, lOpts] = getLegendOpts(m2t, handle) -% Need to check that there's nothing inside visible before we -% abandon this legend -- an invisible property of the parent just -% means the legend has no box. - children = get(handle, 'Children'); - if ~isVisible(handle) && ~any(isVisible(children)) - return - end - - lStyle = opts_new(); - - lStyle = legendPosition(m2t, handle, lStyle); - lStyle = legendOrientation(m2t, handle, lStyle); - lStyle = legendEntryAlignment(m2t, handle, lStyle); - - % If the plot has 'legend boxoff', we have the 'not visible' - % property, so turn off line and background fill. - if (~isVisible(handle)) - lStyle = opts_add(lStyle, 'fill', 'none'); - lStyle = opts_add(lStyle, 'draw', 'none'); - else - % handle colors - [edgeColor, isDfltEdge] = getAndCheckDefault('Legend', handle, ... - 'EdgeColor', [1 1 1]); - if isNone(edgeColor) - lStyle = opts_add(lStyle, 'draw', 'none'); - - elseif ~isDfltEdge - [m2t, col] = getColor(m2t, handle, edgeColor, 'patch'); - lStyle = opts_add(lStyle, 'draw', col); - end - - [fillColor, isDfltFill] = getAndCheckDefault('Legend', handle, ... - 'Color', [1 1 1]); - if isNone(fillColor) - lStyle = opts_add(lStyle, 'fill', 'none'); - - elseif ~isDfltFill - [m2t, col] = getColor(m2t, handle, fillColor, 'patch'); - lStyle = opts_add(lStyle, 'fill', col); - end - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - key = 'legend style'; - lOpts = opts_print(m2t, lStyle, ','); -end -% ============================================================================== -function [lStyle] = legendOrientation(m2t, handle, lStyle) -% handle legend orientation - ori = get(handle, 'Orientation'); - switch lower(ori) - case 'horizontal' - numLegendEntries = sprintf('%d',length(get(handle, 'String'))); - lStyle = opts_add(lStyle, 'legend columns', numLegendEntries); - - case 'vertical' - % Use default. - otherwise - userWarning(m2t, [' Unknown legend orientation ''',ori,'''' ... - '. Choosing default (vertical).']); - end -end -% ============================================================================== -function [lStyle] = legendPosition(m2t, handle, lStyle) -% handle legend location -% #COMPLEX: just a big switch-case - loc = get(handle, 'Location'); - dist = 0.03; % distance to to axes in normalized coordinates - % MATLAB(R)'s keywords are camel cased (e.g., 'NorthOutside'), in Octave - % small cased ('northoutside'). Hence, use lower() for uniformity. - switch lower(loc) - case 'northeast' - return % don't do anything in this (default) case - case 'northwest' - position = [dist, 1-dist]; - anchor = 'north west'; - case 'southwest' - position = [dist, dist]; - anchor = 'south west'; - case 'southeast' - position = [1-dist, dist]; - anchor = 'south east'; - case 'north' - position = [0.5, 1-dist]; - anchor = 'north'; - case 'east' - position = [1-dist, 0.5]; - anchor = 'east'; - case 'south' - position = [0.5, dist]; - anchor = 'south'; - case 'west' - position = [dist, 0.5]; - anchor = 'west'; - case 'northoutside' - position = [0.5, 1+dist]; - anchor = 'south'; - case 'southoutside' - position = [0.5, -dist]; - anchor = 'north'; - case 'eastoutside' - position = [1+dist, 0.5]; - anchor = 'west'; - case 'westoutside' - position = [-dist, 0.5]; - anchor = 'east'; - case 'northeastoutside' - position = [1+dist, 1]; - anchor = 'north west'; - case 'northwestoutside' - position = [-dist, 1]; - anchor = 'north east'; - case 'southeastoutside' - position = [1+dist, 0]; - anchor = 'south west'; - case 'southwestoutside' - position = [-dist, 0]; - anchor = 'south east'; - case 'none' - legendPos = get(handle, 'Position'); - unit = get(handle, 'Units'); - if isequal(unit, 'normalized') - position = legendPos(1:2); - else - % Calculate where the legend is located w.r.t. the axes. - axesPos = get(m2t.currentHandles.gca, 'Position'); - axesUnit = get(m2t.currentHandles.gca, 'Units'); - % Convert to legend unit - axesPos = convertUnits(axesPos, axesUnit, unit); - % By default, the axes position is given w.r.t. to the figure, - % and so is the legend. - position = (legendPos(1:2)-axesPos(1:2)) ./ axesPos(3:4); - end - anchor = 'south west'; - case {'best','bestoutside'} - % TODO: Implement these. - % The position could be determined by means of 'Position' and/or - % 'OuterPosition' of the legend handle; in fact, this could be made - % a general principle for all legend placements. - userWarning(m2t, [sprintf(' Option ''%s'' not yet implemented.',loc), ... - ' Choosing default.']); - return % use defaults - - otherwise - userWarning(m2t, [' Unknown legend location ''',loc,'''' ... - '. Choosing default.']); - return % use defaults - end - - % set legend position - %TODO: shouldn't this include units? - lStyle = opts_add(lStyle, 'at', sprintf('{(%s,%s)}', ... - formatDim(position(1)), formatDim(position(2)))); - lStyle = opts_add(lStyle, 'anchor', anchor); - -end -% ============================================================================== -function [lStyle] = legendEntryAlignment(m2t, handle, lStyle) -% determines the text and picture alignment inside a legend - textalign = ''; - pictalign = ''; - switch m2t.env - case 'Octave' - % Octave allows to change the alignment of legend text and - % pictograms using legend('left') and legend('right') - textpos = get(handle, 'textposition'); - switch lower(textpos) - case 'left' - % pictogram right of flush right text - textalign = 'left'; - pictalign = 'right'; - case 'right' - % pictogram left of flush left text (default) - textalign = 'right'; - pictalign = 'left'; - otherwise - userWarning(m2t, ... - ['Unknown legend text position ''',... - textpos, '''. Choosing default.']); - end - case 'MATLAB' - % does not specify text/pictogram alignment in legends - otherwise - errorUnknownEnvironment(); - end - - % set alignment of legend text and pictograms, if available - if ~isempty(textalign) && ~isempty(pictalign) - lStyle = opts_add(lStyle, 'legend cell align', textalign); - lStyle = opts_add(lStyle, 'align', textalign); - lStyle = opts_add(lStyle, 'legend plot pos', pictalign); - else - % Make sure the entries are flush left (default MATLAB behavior). - % This is also import for multiline legend entries: Without alignment - % specification, the TeX document won't compile. - % 'legend plot pos' is not set explicitly, since 'left' is default. - lStyle = opts_add(lStyle, 'legend cell align', 'left'); - lStyle = opts_add(lStyle, 'align', 'left'); - end -end -% ============================================================================== -function [pgfTicks, pgfTickLabels, hasMinorTicks, tickDirection] = getAxisTicks(m2t, handle, axis) -% Return axis tick marks Pgfplots style. Nice: Tick lengths and such -% details are taken care of by Pgfplots. - if ~strcmpi(axis,'x') && ~strcmpi(axis,'y') && ~strcmpi(axis,'z') - error('matlab2tikz:illegalAxisSpecifier',... - 'Illegal axis specifier ''%s''.', axis); - end - - keywordTickMode = [upper(axis), 'TickMode']; - tickMode = get(handle, keywordTickMode); - keywordTick = [upper(axis), 'Tick']; - ticks = get(handle, keywordTick); - if isempty(ticks) - % If no ticks are present, we need to enforce this in any case. - pgfTicks = '\empty'; - else - if strcmp(tickMode, 'auto') && ~m2t.cmdOpts.Results.strict - % If the ticks are set automatically, and strict conversion is - % not required, then let Pgfplots take care of the ticks. - % In most cases, this looks a lot better anyway. - pgfTicks = []; - else % strcmp(tickMode,'manual') || m2t.cmdOpts.Results.strict - pgfTicks = join(m2t, cellstr(num2str(ticks(:))), ', '); - end - end - - keywordTickLabelMode = [upper(axis), 'TickLabelMode']; - tickLabelMode = get(handle, keywordTickLabelMode); - keywordTickLabel = [upper(axis), 'TickLabel']; - tickLabels = cellstr(get(handle, keywordTickLabel)); - if strcmp(tickLabelMode, 'auto') && ~m2t.cmdOpts.Results.strict - pgfTickLabels = []; - else % strcmp(tickLabelMode,'manual') || m2t.cmdOpts.Results.strict - keywordScale = [upper(axis), 'Scale']; - isAxisLog = strcmp(getOrDefault(handle,keywordScale, 'lin'), 'log'); - [pgfTicks, pgfTickLabels] = ... - matlabTicks2pgfplotsTicks(m2t, ticks, tickLabels, isAxisLog, tickLabelMode); - end - - keywordMinorTick = [upper(axis), 'MinorTick']; - hasMinorTicks = strcmp(getOrDefault(handle, keywordMinorTick, 'off'), 'on'); - tickDirection = getOrDefault(handle, 'TickDir', 'in'); -end -% ============================================================================== -function [pTicks, pTickLabels] = ... - matlabTicks2pgfplotsTicks(m2t, ticks, tickLabels, isLogAxis, tickLabelMode) -% Converts MATLAB style ticks and tick labels to pgfplots style (if needed) - if isempty(ticks) - pTicks = '\empty'; - pTickLabels = []; - return - end - - % set ticks + labels - pTicks = join(m2t, num2cell(ticks), ','); - - % if there's no specific labels, return empty - if isempty(tickLabels) || (length(tickLabels)==1 && isempty(tickLabels{1})) - pTickLabels = '\empty'; - return - end - - % sometimes tickLabels are cells, sometimes plain arrays - % -- unify this to cells - if ischar(tickLabels) - tickLabels = strtrim(mat2cell(tickLabels, ... - ones(size(tickLabels,1), 1), ... - size(tickLabels, 2) ... - ) ... - ); - end - - % What MATLAB does when there the number of ticks and tick labels do not - % coincide is somewhat unclear. To fix bug - % https://github.com/matlab2tikz/matlab2tikz/issues/161, - % cut off the first entries in `ticks`. - m = length(ticks); - n = length(tickLabels); - if n < m - ticks = ticks(m-n+1:end); - end - - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % Check if tickLabels are really necessary (and not already covered by - % the tick values themselves). - plotLabelsNecessary = false; - - k = find(ticks ~= 0.0, 1); % get an index with non-zero tick value - if isLogAxis || isempty(k) % only a 0-tick - scalingFactor = 1; - else - % When plotting axis, MATLAB might scale the axes by a factor of ten, - % say 10^n, and plot a 'x 10^k' next to the respective axis. This is - % common practice when the tick marks are really large or small - % numbers. - % Unfortunately, MATLAB doesn't contain the information about the - % scaling anywhere in the plot, and at the same time the {x,y}TickLabels - % are given as t*10^k, thus no longer corresponding to the actual - % value t. - % Try to find the scaling factor here. This is then used to check - % whether or not explicit {x,y}TickLabels are really necessary. - s = str2double(tickLabels{k}); - scalingFactor = ticks(k)/s; - % check if the factor is indeed a power of 10 - S = log10(scalingFactor); - if abs(round(S)-S) > m2t.tol - scalingFactor = 1.0; - end - end - - for k = 1:min(length(ticks),length(tickLabels)) - % Don't use str2num here as then, literal strings as 'pi' get - % legally transformed into 3.14... and the need for an explicit - % label will not be recognized. str2double returns a NaN for 'pi'. - if isLogAxis - s = 10^(str2double(tickLabels{k})); - else - s = str2double(tickLabels{k}); - end - if isnan(s) || abs(ticks(k)-s*scalingFactor) > m2t.tol - plotLabelsNecessary = true; - break; - end - end - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if plotLabelsNecessary - % if the axis is logscaled, MATLAB does not store the labels, - % but the exponents to 10 - if isLogAxis - for k = 1:length(tickLabels) - if isnumeric(tickLabels{k}) - str = num2str(tickLabels{k}); - else - str = tickLabels{k}; - end - if strcmpi(tickLabelMode,'auto') - tickLabels{k} = sprintf('$10^{%s}$', str); - end - end - end - tickLabels = cellfun(@(l)(sprintf('{%s}',l)), tickLabels, ... - 'UniformOutput', false); - pTickLabels = join(m2t, tickLabels, ','); - else - pTickLabels = []; - end -end -% ============================================================================== -function tikzLineStyle = translateLineStyle(matlabLineStyle) - if(~ischar(matlabLineStyle)) - error('matlab2tikz:translateLineStyle:NotAString',... - 'Variable matlabLineStyle is not a string.'); - end - - switch (matlabLineStyle) - case 'none' - tikzLineStyle = ''; - case '-' - tikzLineStyle = 'solid'; - case '--' - tikzLineStyle = 'dashed'; - case ':' - tikzLineStyle = 'dotted'; - case '-.' - tikzLineStyle = 'dash pattern=on 1pt off 3pt on 3pt off 3pt'; - otherwise - error('matlab2tikz:translateLineStyle:UnknownLineStyle',... - 'Unknown matlabLineStyle ''%s''.', matlabLineStyle); - end -end -% ============================================================================== -function [m2t, table] = makeTable(m2t, varargin) -% [m2t,table] = makeTable(m2t, 'name1', data1, 'name2', data2, ...) -% [m2t,table] = makeTable(m2t, {'name1','name2',...}, {data1, data2, ...}) -% [m2t,table] = makeTable(m2t, {'name1','name2',...}, [data1(:), data2(:), ...]) -% -% When all the names are empty, no header is printed - [variables, data] = parseInputsForTable_(varargin{:}); - - COLSEP = sprintf('\t'); - if m2t.cmdOpts.Results.externalData - ROWSEP = sprintf('\n'); - else - ROWSEP = sprintf('\\\\\n'); - end - - nColumns = numel(data); - nRows = cellfun(@numel, data); - if ~all(nRows==nRows(1)) - warning('matlab2tikz:makeTableDifferentNumberOfRows',... - 'Different data lengths [%s]. Only including the first %d ones.',... - num2str(nRows), min(nRows)); - end - nRows = min(nRows); - - FORMAT = repmat({m2t.ff}, 1, nColumns); - FORMAT(cellfun(@isCellOrChar, data)) = {'%s'}; - FORMAT = join(m2t, FORMAT, COLSEP); - if all(cellfun(@isempty, variables)) - header = {}; - else - header = {join(m2t, variables, COLSEP)}; - end - - table = cell(nRows,1); - for iRow = 1:nRows - thisData = cellfun(@(x)(x(iRow)), data, 'UniformOutput', false); - for jCol = 1:nColumns - if iscell(thisData{jCol}) %TODO: probably this can be done more clearly - thisData{jCol} = thisData{jCol}{1}; - end - end - table{iRow} = sprintf(FORMAT, thisData{:}); - end - table = lower(table); % convert NaN and Inf to lower case for TikZ - table = [join(m2t, [header;table], ROWSEP) ROWSEP]; - - if m2t.cmdOpts.Results.externalData - % output data to external file - m2t.dataFileNo = m2t.dataFileNo + 1; - [filename, latexFilename] = externalFilename(m2t, m2t.dataFileNo, '.tsv'); - - % write the data table to an external file - fid = fileOpenForWrite(m2t, filename); - fprintf(fid, '%s', table); - fclose(fid); - - % put the filename in the TikZ output - table = latexFilename; - else - % output data with "%newline" prepended for formatting consistency - % do NOT prepend another newline in the output: LaTeX will crash. - table = sprintf('%%\n%s', table); - end -end -% ============================================================================== -function [variables, data] = parseInputsForTable_(varargin) -% parse input arguments for |makeTable| - if numel(varargin) == 2 % cell syntax - variables = varargin{1}; - data = varargin{2}; - if ischar(variables) - % one variable, one data vector -> (cell, cell) - variables = {variables}; - data = {data}; - elseif iscellstr(variables) && ~iscell(data) - % multiple variables, one data matrix -> (cell, cell) by column - data = num2cell(data, 1); - end - else % key-value syntax - variables = varargin(1:2:end-1); - data = varargin(2:2:end); - end -end -% ============================================================================== -function [path, texpath] = externalFilename(m2t, counter, extension) -% generates a file name for an external data file and its relative TeX path - - [dummy, name] = fileparts(m2t.tikzFileName); %#ok - baseFilename = [name '-' num2str(counter) extension]; - path = fullfile(m2t.dataPath, baseFilename); - texpath = TeXpath(fullfile(m2t.relativeDataPath, baseFilename)); -end -% ============================================================================== -function [names,definitions] = dealColorDefinitions(mergedColorDefs) - if isempty(mergedColorDefs) - mergedColorDefs = {}; - end - [names,definitions] = cellfun(@(x)(deal(x{:})), mergedColorDefs, ... - 'UniformOutput', false); -end -% ============================================================================== -function [m2t, colorLiteral] = rgb2colorliteral(m2t, rgb) -% Translates an rgb value to an xcolor literal -% -% Possible outputs: -% - xcolor literal color, e.g. 'blue' -% - mixture of 2 previously defined colors, e.g. 'red!70!green' -% - a newly defined color, e.g. 'mycolor10' - -% Take a look at xcolor.sty for the color definitions. -% In xcolor.sty some colors are defined in CMYK space and approximated -% crudely for RGB color space. So it is better to redefine those colors -% instead of using xcolor's: -% 'cyan' , 'magenta', 'yellow', 'olive' -% [0,1,1], [1,0,1] , [1,1,0] , [0.5,0.5,0] - - xcolColorNames = {'white', 'black', 'red', 'green', 'blue', ... - 'brown', 'lime', 'orange', 'pink', ... - 'purple', 'teal', 'violet', ... - 'darkgray', 'gray', 'lightgray'}; - xcolColorSpecs = {[1,1,1], [0,0,0], [1,0,0], [0,1,0], [0,0,1], ... - [0.75,0.5,0.25], [0.75,1,0], [1,0.5,0], [1,0.75,0.75], ... - [0.75,0,0.25], [0,0.5,0.5], [0.5,0,0.5], ... - [0.25,0.25,0.25], [0.5,0.5,0.5], [0.75,0.75,0.75]}; - - colorNames = [xcolColorNames, m2t.extraRgbColorNames]; - colorSpecs = [xcolColorSpecs, m2t.extraRgbColorSpecs]; - - %% check if rgb is a predefined color - for kColor = 1:length(colorSpecs) - Ck = colorSpecs{kColor}(:); - if max(abs(Ck - rgb(:))) < m2t.colorPrecision - colorLiteral = colorNames{kColor}; - return % exact color was predefined - end - end - - %% check if the color is a linear combination of two already defined colors - for iColor = 1:length(colorSpecs) - for jColor = iColor+1:length(colorSpecs) - Ci = colorSpecs{iColor}(:); - Cj = colorSpecs{jColor}(:); - - % solve color mixing equation `Ck = p * Ci + (1-p) * Cj` for p - p = (Ci-Cj) \ (rgb(:)-Cj); - p = round(100*p)/100; % round to a percentage - Ck = p * Ci + (1-p)*Cj; % approximated mixed color - - if p <= 1 && p >= 0 && max(abs(Ck(:) - rgb(:))) < m2t.colorPrecision - colorLiteral = sprintf('%s!%d!%s', colorNames{iColor}, round(p*100), ... - colorNames{jColor}); - return % linear combination found - end - end - end - - %% Define colors that are not a linear combination of two known colors - colorLiteral = sprintf('mycolor%d', length(m2t.extraRgbColorNames)+1); - m2t.extraRgbColorNames{end+1} = colorLiteral; - m2t.extraRgbColorSpecs{end+1} = rgb; -end -% ============================================================================== -function newstr = join(m2t, cellstr, delimiter) -% This function joins a cell of strings to a single string (with a -% given delimiter in between two strings, if desired). -% -% Example of usage: -% join(m2t, cellstr, ',') - if isempty(cellstr) - newstr = ''; - return - end - - % convert all values to strings first - nElem = numel(cellstr); - for k = 1:nElem - if isnumeric(cellstr{k}) - cellstr{k} = sprintf(m2t.ff, cellstr{k}); - elseif iscell(cellstr{k}) - cellstr{k} = join(m2t, cellstr{k}, delimiter); - % this will fail for heavily nested cells - elseif ~ischar(cellstr{k}) - error('matlab2tikz:join:NotCellstrOrNumeric',... - 'Expected cellstr or numeric.'); - end - end - - % inspired by strjoin of recent versions of MATLAB - newstr = cell(2,nElem); - newstr(1,:) = reshape(cellstr, 1, nElem); - newstr(2,1:nElem-1) = {delimiter}; % put delimiters in-between the elements - newstr = [newstr{:}]; -end -% ============================================================================== -function [width, height, unit] = getNaturalFigureDimension(m2t) - % Returns the size of figure (in inch) - % To stay compatible with getNaturalAxesDimensions, the unit 'in' is - % also returned. - - % Get current figure size - figuresize = get(m2t.currentHandles.gcf, 'Position'); - figuresize = figuresize([3 4]); - figureunit = get(m2t.currentHandles.gcf, 'Units'); - - % Convert Figure Size - unit = 'in'; - figuresize = convertUnits(figuresize, figureunit, unit); - - % Split size into width and height - width = figuresize(1); - height = figuresize(2); - -end -% ============================================================================== -function dimension = getFigureDimensions(m2t, widthString, heightString) -% Returns the physical dimension of the figure. - - [width, height, unit] = getNaturalFigureDimension(m2t); - - % get the natural width-height ration of the plot - axesWidthHeightRatio = width / height; - % check matlab2tikz arguments - if ~isempty(widthString) - width = extractValueUnit(widthString); - end - if ~isempty(heightString) - height = extractValueUnit(heightString); - end - - % prepare the output - if ~isempty(widthString) && ~isempty(heightString) - dimension.x.unit = width.unit; - dimension.x.value = width.value; - dimension.y.unit = height.unit; - dimension.y.value = height.value; - elseif ~isempty(widthString) - dimension.x.unit = width.unit; - dimension.x.value = width.value; - dimension.y.unit = width.unit; - dimension.y.value = width.value / axesWidthHeightRatio; - elseif ~isempty(heightString) - dimension.y.unit = height.unit; - dimension.y.value = height.value; - dimension.x.unit = height.unit; - dimension.x.value = height.value * axesWidthHeightRatio; - else % neither width nor height given - dimension.x.unit = unit; - dimension.x.value = width; - dimension.y.unit = unit; - dimension.y.value = height; - end -end -% ============================================================================== -function position = getAxesPosition(m2t, handle, widthString, heightString, axesBoundingBox) -% Returns the physical position of the axes. This includes - in difference -% to the Dimension - also an offset to shift the axes inside the figure -% An optional bounding box can be used to omit empty borders. - - % Deal with optional parameter - if nargin < 4 - axesBoundingBox = [0 0 1 1]; - end - - % First get the whole figures size - figDim = getFigureDimensions(m2t, widthString, heightString); - - % Get the relative position of the axis - relPos = getRelativeAxesPosition(m2t, handle, axesBoundingBox); - - position.x.value = relPos(1) * figDim.x.value; - position.x.unit = figDim.x.unit; - position.y.value = relPos(2) * figDim.y.value; - position.y.unit = figDim.y.unit; - position.w.value = relPos(3) * figDim.x.value; - position.w.unit = figDim.x.unit; - position.h.value = relPos(4) * figDim.y.value; - position.h.unit = figDim.y.unit; -end -% ============================================================================== -function [position] = getRelativeAxesPosition(m2t, axesHandles, axesBoundingBox) -% Returns the relative position of axes within the figure. -% Position is an (n,4) matrix with [minX, minY, width, height] for each -% handle. All these values are relative to the figure size, which means -% that [0, 0, 1, 1] covers the whole figure. -% It is possible to add a second parameter with the relative coordinates of -% a bounding box around all axes of the figure (see getRelevantAxes()). In -% this case, relative positions are rescaled so that the bounding box is -% [0, 0, 1, 1] - - % Get Figure Dimension - [figWidth, figHeight, figUnits] = getNaturalFigureDimension(m2t); - - % Initialize position - position = zeros(numel(axesHandles), 4); - % Iterate over all handles - for i = 1:numel(axesHandles) - axesHandle = axesHandles(i); - axesPos = get(axesHandle, 'Position'); - axesUnits = get(axesHandle, 'Units'); - if isequal(lower(axesUnits), 'normalized') - % Position is already relative - position(i,:) = axesPos; - else - % Convert figure size into axes units - figureSize = convertUnits([figWidth, figHeight], figUnits, axesUnits); - % Figure size into axes units to get the relative size - position(i,:) = axesPos ./ [figureSize, figureSize]; - - end - - % Change size if DataAspectRatioMode is manual - if isequal(lower(get(axesHandle,'DataAspectRatioMode')),'manual') - % get limits - xLim = get(axesHandle, 'XLim'); - yLim = get(axesHandle, 'YLim'); - % Get Aspect Ratio between width and height - aspectRatio = get(axesHandle,'DataAspectRatio'); - % And Adjust it to the figure dimensions - aspectRatio = aspectRatio(1) * figWidth * (yLim(2) - yLim(1)) ... - / (aspectRatio(2) * figHeight * (xLim(2)-xLim(1))); - % Recompute height - newHeight = position(i,3) * aspectRatio; - % shrink width if newHeight is too large - if newHeight > position(i,4) - % Recompute width - newWidth = position(i,4) / aspectRatio; - % Center Axis - offset = (position(i,3) - newWidth) / 2; - position(i,1) = position(i,1) + offset; - % Store new width - position(i,3) = newWidth; - else - % Center Axis - offset = (position(i,4) - newHeight) / 2; - position(i,2) = position(i,2) + offset; - % Store new height - position(i,4) = newHeight; - end - end - end - - %% Rescale if axesBoundingBox is given - if exist('axesBoundingBox','var') - % shift position so that [0, 0] is the lower left corner of the - % bounding box - position(:,1) = position(:,1) - axesBoundingBox(1); - position(:,2) = position(:,2) - axesBoundingBox(2); - % Recale - position(:,[1 3]) = position(:,[1 3]) / max(axesBoundingBox([3 4])); - position(:,[2 4]) = position(:,[2 4]) / max(axesBoundingBox([3 4])); - end -end -% ============================================================================== -function texUnits = matlab2texUnits(matlabUnits, fallbackValue) - switch matlabUnits - case 'pixels' - texUnits = 'px'; % only in pdfTex/LuaTeX - case 'centimeters' - texUnits = 'cm'; - case 'characters' - texUnits = 'em'; - case 'points' - texUnits = 'pt'; - case 'inches' - texUnits = 'in'; - otherwise - texUnits = fallbackValue; - end -end -% ============================================================================== -function dstValue = convertUnits(srcValue, srcUnit, dstUnit) -% Converts values between different units. -% srcValue stores a length (or vector of lengths) in srcUnit. -% The resulting dstValue is the converted length into dstUnit. -% -% Currently supported units are: in, cm, px, pt - - % Use tex units, if possible (to make things simple) - srcUnit = matlab2texUnits(lower(srcUnit),lower(srcUnit)); - dstUnit = matlab2texUnits(lower(dstUnit),lower(dstUnit)); - - if isequal(srcUnit, dstUnit) - dstValue = srcValue; - return % conversion to the same unit => factor = 1 - end - - units = {srcUnit, dstUnit}; - factor = ones(1,2); - for ii = 1:numel(factor) % Same code for srcUnit and dstUnit - % Use inches as intermediate unit - % Compute the factor to convert an inch into another unit - switch units{ii} - case 'cm' - factor(ii) = 2.54; - case 'px' - factor(ii) = get(0, 'ScreenPixelsPerInch'); - case 'in' - factor(ii) = 1; - case 'pt' - factor(ii) = 72; - otherwise - warning('MATLAB2TIKZ:UnknownPhysicalUnit',... - 'Can not convert unit ''%s''. Using conversion factor 1.', units{ii}); - end - end - - dstValue = srcValue * factor(2) / factor(1); -end -% ============================================================================== -function out = extractValueUnit(str) -% Decompose m2t.cmdOpts.Results.width into value and unit. - - % Regular expression to match '4.12cm', '\figurewidth', ... - fp_regex = '[-+]?\d*\.?\d*(?:e[-+]?\d+)?'; - pattern = strcat('(', fp_regex, ')?', '(\\?[a-z]+)'); - - [dummy,dummy,dummy,dummy,t,dummy] = regexp(str, pattern, 'match'); %#ok - - if length(t)~=1 - error('getAxesDimensions:illegalLength', ... - 'The width string ''%s'' could not be decomposed into value-unit pair.', str); - end - - if length(t{1}) == 1 - out.value = 1.0; % such as in '1.0\figurewidth' - out.unit = strtrim(t{1}{1}); - elseif length(t{1}) == 2 && isempty(t{1}{1}) - % MATLAB(R) does this: - % length(t{1})==2 always, but the first field may be empty. - out.value = 1.0; - out.unit = strtrim(t{1}{2}); - elseif length(t{1}) == 2 - out.value = str2double(t{1}{1}); - out.unit = strtrim(t{1}{2}); - else - error('getAxesDimensions:illegalLength', ... - 'The width string ''%s'' could not be decomposed into value-unit pair.', str); - end -end -% ============================================================================== -function str = escapeCharacters(str) -% Replaces "%" and "\" with respectively "%%" and "\\" - str = strrep(str, '%' , '%%'); - str = strrep(str, '\' , '\\'); -end -% ============================================================================== -function bool = isNone(value) -% Checks whether a value is 'none' - bool = strcmpi(value, 'none'); -end -% ============================================================================== -function val = getOrDefault(handle, key, default) -% gets the value or returns the default value if no such property exists - if all(isprop(handle, key)) - val = get(handle, key); - else - val = default; - end -end -% ============================================================================== -function val = getFactoryOrDefault(type, key, fallback) -% get factory default value for a certain type of HG object -% this CANNOT be done using |getOrDefault| as |isprop| doesn't work for -% factory/default settings. Hence, we use a more expensive try-catch instead. - try - groot = 0; - val = get(groot, ['Factory' type key]); - catch - val = fallback; - end -end -% ============================================================================== -function [val, isDefault] = getAndCheckDefault(type, handle, key, default) -% gets the value from a handle of certain type and check the default values - default = getFactoryOrDefault(type, key, default); - val = getOrDefault(handle, key, default); - isDefault = isequal(val, default); -end -% ============================================================================== -function [m2t, opts] = addIfNotDefault(m2t, type, handle, key, default, pgfKey, opts) -% sets an option in the options array named `pgfKey` if the MATLAB option is -% not a default value - [value, isDefault] = getAndCheckDefault(type, handle, key, default); - if ~isDefault || m2t.cmdOpts.Results.strict - opts = opts_add(opts, pgfKey, value); - end -end -% ============================================================================== -function out = isVisible(handles) -% Determines whether an object is actually visible or not. - out = strcmp(get(handles,'Visible'), 'on'); - % There's another handle property, 'HandleVisibility', which may or may not - % determine the visibility of the object. Empirically, it seems to be 'off' - % whenever we're dealing with an object that's not user-created, such as - % automatic axis ticks, baselines in bar plots, axis lines for polar plots - % and so forth. For now, don't check 'HandleVisibility'. -end -% ============================================================================== -function [relevantAxesHandles, axesBoundingBox] = getRelevantAxes(m2t, axesHandles) -% Returns relevant axes. These are defines as visible axes that are no -% colorbars. In addition, a bounding box around all relevant Axes is -% computed. This can be used to avoid undesired borders. -% This function is the remaining code of alignSubPlots() in the alternative -% positioning system. - relevantAxesHandles = []; - for axesHandle = axesHandles(:)' - % Only handle visible non-colorbar handles. - if axisIsVisible(axesHandle) && ~strcmp(get(axesHandle,'Tag'), 'Colorbar') - relevantAxesHandles(end+1) = axesHandle; - end - end - - % Compute the bounding box if width or height of the figure are set by - % parameter - if ~isempty(m2t.cmdOpts.Results.width) || ~isempty(m2t.cmdOpts.Results.height) - % TODO: check if relevant Axes or all Axes are better. - axesBoundingBox = getRelativeAxesPosition(m2t, relevantAxesHandles); - % Compute second corner from width and height for each axes - axesBoundingBox(:,[3 4]) = axesBoundingBox(:,[1 2]) + axesBoundingBox(:,[3 4]); - % Combine axes corners to get the bounding box - axesBoundingBox = [min(axesBoundingBox(:,[1 2]),[],1), max(axesBoundingBox(:,[3 4]), [], 1)]; - % Compute width and height of the bounding box - axesBoundingBox(:,[3 4]) = axesBoundingBox(:,[3 4]) - axesBoundingBox(:,[1 2]); - else - % Otherwise take the whole figure as bounding box => lengths are - % not changed in tikz - axesBoundingBox = [0, 0, 1, 1]; - end -end -% ============================================================================== -function userInfo(m2t, message, varargin) -% Display usage information. - if m2t.cmdOpts.Results.showInfo - mess = sprintf(message, varargin{:}); - - mess = strrep(mess, sprintf('\n'), sprintf('\n *** ')); - fprintf(' *** %s\n', mess); - end -end -% ============================================================================== -function userWarning(m2t, message, varargin) -% Drop-in replacement for warning(). - if m2t.cmdOpts.Results.showWarnings - warning('matlab2tikz:userWarning', message, varargin{:}); - end -end -% ============================================================================== -function warnAboutParameter(m2t, parameter, isActive, message) -% warn the user about the use of a dangerous parameter - line = ['\n' repmat('=',1,80) '\n']; - if isActive(m2t.cmdOpts.Results.(parameter)) - userWarning(m2t, [line, 'You are using the "%s" parameter.\n', ... - message line], parameter); - end -end -% ============================================================================== -function parent = addChildren(parent, children) - if isempty(children) - return; - elseif iscell(children) - for k = 1:length(children) - parent = addChildren(parent, children{k}); - end - else - if isempty(parent.children) - parent.children = {children}; - else - parent.children = {parent.children{:} children}; - end - end -end -% ============================================================================== -function printAll(m2t, env, fid) - if isfield(env, 'colors') && ~isempty(env.colors) - fprintf(fid, '%s', env.colors); - end - - if isempty(env.options) - fprintf(fid, '\\begin{%s}\n', env.name); - else - fprintf(fid, '\\begin{%s}[%%\n%s\n]\n', env.name, ... - opts_print(m2t, env.options, sprintf(',\n'))); - end - - for item = env.content - fprintf(fid, '%s', char(item)); - end - - for k = 1:length(env.children) - if ischar(env.children{k}) - fprintf(fid, escapeCharacters(env.children{k})); - else - fprintf(fid, '\n'); - printAll(m2t, env.children{k}, fid); - end - end - - % End the tikzpicture environment with an empty comment and no newline - % so no additional space is generated after the tikzpicture in TeX. - if strcmp(env.name, 'tikzpicture') - fprintf(fid, '\\end{%s}%%', env.name); - else - fprintf(fid, '\\end{%s}\n', env.name); - end -end -% ============================================================================== -function c = prettyPrint(m2t, strings, interpreter) -% Some resources on how MATLAB handles rich (TeX) markup: -% http://www.mathworks.com/help/techdoc/ref/text_props.html#String -% http://www.mathworks.com/help/techdoc/creating_plots/f0-4741.html#f0-28104 -% http://www.mathworks.com/help/techdoc/ref/text_props.html#Interpreter -% http://www.mathworks.com/help/techdoc/ref/text.html#f68-481120 - - strings = cellstrOneLinePerCell(strings); - - % Now loop over the strings and return them pretty-printed in c. - c = {}; - for k = 1:length(strings) - % linear indexing for independence of cell array dimensions - s = strings{k}; - - % If the user set the matlab2tikz parameter 'parseStrings' to false, no - % parsing of strings takes place, thus making the user 100% responsible. - if ~m2t.cmdOpts.Results.parseStrings - c = strings; - return - end - - % Make sure we have a valid interpreter set up - if ~any(strcmpi(interpreter, {'latex', 'tex', 'none'})) - userWarning(m2t, 'Don''t know interpreter ''%s''. Default handling.', interpreter); - interpreter = 'tex'; - end - - % The interpreter property of the text element defines how the string - % is parsed - switch lower(interpreter) - case 'latex' % Basic subset of the LaTeX markup language - - % Replace $$...$$ with $...$ but otherwise leave untouched - string = regexprep(s, '^\$\$(.*)\$\$$', '$$1$'); - - case 'tex' % Subset of plain TeX markup language - - % Deal with UTF8 characters. - string = s; - - % degree symbol following "^" or "_" needs to be escaped - string = regexprep(string, '([\^\_])°', '$1{{}^\\circ}'); - string = strrep(string, '°', '^\circ'); - string = strrep(string, '∞', '\infty'); - - % Parse string piece-wise in a separate function. - string = parseTexString(m2t, string); - - case 'none' % Literal characters - % Make special characters TeX compatible - - string = strrep(s, '\', '\textbackslash{}'); - % Note: '{' and '}' can't be converted to '\{' and '\}', - % respectively, via strrep(...) as this would lead to - % backslashes converted to '\textbackslash\{\}' because - % the backslash was converted to '\textbackslash{}' in - % the previous step. Using regular expressions with - % negative look-behind makes sure any braces in 'string' - % were not introduced by escaped backslashes. - % Also keep in mind that escaping braces before backslashes - % would not remedy the issue -- in that case 'string' would - % contain backslashes introduced by brace escaping that are - % not supposed to be printable characters. - repl = switchMatOct(m2t, '\\{', '\{'); - string = regexprep(string, '(?<!\\textbackslash){', repl); - repl = switchMatOct(m2t, '\\}', '\}'); - string = regexprep(string, '(?<!\\textbackslash{)}', repl); - string = strrep(string, '$', '\$'); - string = strrep(string, '%', '\%'); - string = strrep(string, '_', '\_'); - string = strrep(string, '^', '\textasciicircum{}'); - string = strrep(string, '#', '\#'); - string = strrep(string, '&', '\&'); - string = strrep(string, '~', '\textasciitilde{}'); % or '\~{}' - % Clean up: remove superfluous '{}' if it's followed by a backslash - string = strrep(string, '{}\', '\'); - % Clean up: remove superfluous '{}' at the end of 'string' - string = regexprep(string, '\{\}$', ''); - - % Make sure to return a string and not a cellstr. - if iscellstr(string) - string = string{1}; - end - otherwise - error('matlab2tikz:prettyPrint', 'Unknown interpreter'); - end - c{end+1} = string; - end -end -% ============================================================================== -function strings = cellstrOneLinePerCell(strings) -% convert to cellstr that contains only one-line strings - if ischar(strings) - strings = cellstr(strings); - elseif iscellstr(strings) - cs = {}; - for s = strings - tmp = cellstr(s); - cs = {cs{:}, tmp{:}}; - end - strings = cs; - else - error('matlab2tikz:cellstrOneLinePerCell', ... - 'Data type not understood.'); - end -end -% ============================================================================== -function parsed = parseTexString(m2t, string) - if iscellstr(string) - % Convert cell string to regular string, otherwise MATLAB complains - string = string{:}; - end - - % Get the position of all braces - bracesPos = regexp(string, '\{|\}'); - - % Exclude braces that are part of any of these MATLAB-supported TeX commands: - % \color{...} \color[...]{...} \fontname{...} \fontsize{...} - [sCmd, eCmd] = regexp(string, '\\(color(\[[^\]]*\])?|fontname|fontsize)\{[^}]*\}'); - for i = 1:length(sCmd) - bracesPos(bracesPos >= sCmd(i) & bracesPos <= eCmd(i)) = []; - end - - % Exclude braces that are preceded by an odd number of backslashes which - % means the brace is escaped and thus to be printed, not a grouping brace - expr = '(?<!\\)(\\\\)*\\(\{|\})'; - escaped = regexp(string, expr, 'end'); - % It's necessary to go over 'string' with the same RegEx again to catch - % overlapping matches, e.g. string == '\{\}'. In such a case the simple - % regexp(...) above only finds the first brace. What we have to do is look - % only at the part of 'string' that starts with the first brace but doesn't - % encompass its escaping backslash. Iterating over all previously found - % matches makes sure all overlapping matches are found, too. That way even - % cases like string == '\{\} \{\}' are handled correctly. - % The call to unique(...) is not necessary to get the behavior described, but - % by removing duplicates in 'escaped' it's cleaner than without. - for i = escaped - escaped = unique([escaped, regexp(string(i:end), expr, 'end') + i-1]); - end - % Now do the actual removal of escaped braces - for i = 1:length(escaped) - bracesPos(bracesPos == escaped(i)) = []; - end - - parsed = ''; - % Have a virtual brace one character left of where the actual string - % begins (remember, MATLAB strings start counting at 1, not 0). This is - % to make sure substrings left of the first brace get parsed, too. - prevBracePos = 0; - % Iterate over all the brace positions in order to split up 'string' - % at those positions and then parse the substrings. A virtual brace is - % added right of where the actual string ends to make sure substrings - % right of the right-most brace get parsed as well. - for currBracePos = [bracesPos, length(string)+1] - if (prevBracePos + 1) < currBracePos - % Parse the substring between (but not including) prevBracePos - % and currBracePos, i.e. between the previous brace and the - % current one (but only if there actually is a non-empty - % substring). Then append it to the output string. - substring = string(prevBracePos+1 : currBracePos-1); - parsed = [parsed, parseTexSubstring(m2t, substring)]; - end - if currBracePos <= length(string) - % Append the brace itself to the output string, but only if the - % current brace position is within the limits of the string, i.e. - % don't append anything for the last, virtual brace that is only - % there to enable parsing of substrings beyond the right-most - % actual brace. - brace = string(currBracePos); - parsed = [parsed, brace]; - end - % The current brace position will be next iteration's previous one - prevBracePos = currBracePos; - end - - % Enclose everything in $...$ to use math mode - parsed = ['$' parsed '$']; - % ...except when everything is text - parsed = regexprep(parsed, '^\$\\text\{([^}]*)\}\$$', '$1'); - % start-> $ \text {(non-}) } $<-end - % ...or when the parsed string is empty - parsed = regexprep(parsed, '^\$\$$', ''); -end -% ============================================================================== -function string = parseTexSubstring(m2t, string) - origstr = string; % keep this for warning messages - - % Font families (italic, bold, etc.) get a trailing '{}' because they may be - % followed by a letter which would produce an error in (La)TeX. - for i = {'it', 'bf', 'rm', 'sl'} - string = strrep(string, ['\' i{:}], ['\' i{:} '{}']); - end - - % The same holds true for special characters like \alpha - % The list of MATLAB-supported TeX characters was taken from - % http://www.mathworks.com/help/techdoc/ref/text_props.html#String - named = {'alpha', 'angle', 'ast', 'beta', 'gamma', 'delta', ... - 'epsilon', 'zeta', 'eta', 'theta', 'vartheta', 'iota', ... - 'kappa', 'lambda', 'mu', 'nu', 'xi', 'pi', 'rho', ... - 'sigma', 'varsigma', 'tau', 'equiv', 'Im', 'otimes', ... - 'cap', 'int', 'rfloor', 'lfloor', 'perp', 'wedge', ... - 'rceil', 'vee', 'langle', 'upsilon', 'phi', 'chi', ... - 'psi', 'omega', 'Gamma', 'Delta', 'Theta', 'Lambda', ... - 'Xi', 'Pi', 'Sigma', 'Upsilon', 'Phi', 'Psi', 'Omega', ... - 'forall', 'exists', 'ni', 'cong', 'approx', 'Re', ... - 'oplus', 'cup', 'subseteq', 'lceil', 'cdot', 'neg', ... - 'times', 'surd', 'varpi', 'rangle', 'sim', 'leq', ... - 'infty', 'clubsuit', 'diamondsuit', 'heartsuit', ... - 'spadesuit', 'leftrightarrow', 'leftarrow', ... - 'Leftarrow', 'uparrow', 'rightarrow', 'Rightarrow', ... - 'downarrow', 'circ', 'pm', 'geq', 'propto', 'partial', ... - 'bullet', 'div', 'neq', 'aleph', 'wp', 'oslash', ... - 'supseteq', 'nabla', 'ldots', 'prime', '0', 'mid', ... - 'copyright' }; - for i = named - string = strrep(string, ['\' i{:}], ['\' i{:} '{}']); - % FIXME: Only append '{}' if there's an odd number of backslashes - % in front of the items from 'named'. If it's an even - % number instead, that means there's an escaped (printable) - % backslash and some text like "alpha" after that. - end - % Some special characters' names are subsets of others, e.g. '\o' is - % a subset of '\omega'. This would produce undesired double-escapes. - % For example if '\o' was converted to '\o{}' after '\omega' has been - % converted to '\omega{}' this would result in '\o{}mega{}' instead of - % '\omega{}'. Had '\o' been converted to '\o{}' _before_ '\omega' is - % converted then the result would be '\o{}mega' and thus also wrong. - % To circumvent the problem all those special character names that are - % subsets of others are now converted using a regular expression that - % uses negative lookahead. The special handling of the backslash is - % required for MATLAB/Octave compatibility. - string = regexprep(string, '(\\)o(?!mega|times|plus|slash)', '$1o{}'); - string = regexprep(string, '(\\)in(?!t|fty)', '$1in{}'); - string = regexprep(string, '(\\)subset(?!eq)', '$1subset{}'); - string = regexprep(string, '(\\)supset(?!eq)', '$1supset{}'); - - % Convert '\0{}' (TeX text mode) to '\emptyset{}' (TeX math mode) - string = strrep(string, '\0{}', '\emptyset{}'); - - % Add skip to \fontsize - % This is required for a successful LaTeX run on the output as in contrast - % to MATLAB/Octave it requires the skip parameter (even if it's zero) - string = regexprep(string, '(\\fontsize\{[^}]*\})', '$1{0}'); - - % Put '\o{}' inside \text{...} as it is a text mode symbol that does not - % exist in math mode (and LaTeX gives a warning if you use it in math mode) - string = strrep(string, '\o{}', '\text{\o{}}'); - - % Put everything that isn't a TeX command inside \text{...} - expr = '(\\[a-zA-Z]+(\[[^\]]*\])?(\{[^}]*\}){1,2})'; - % |( \cmd )( [...]? )( {...}{1,2} )| - % ( subset $1 ) - repl = '}$1\\text{'; - string = regexprep(string, expr, repl); - % ...\alpha{}... -> ...}\alpha{}\text{... - string = ['\text{' string '}']; - % ...}\alpha{}\text{... -> \text{...}\alpha{}\text{...} - - % '_' has to be in math mode so long as it's not escaped as '\_' in which - % case it remains as-is. Extra care has to be taken to make sure any - % backslashes in front of the underscore are not themselves escaped and - % thus printable backslashes. This is the case if there's an even number - % of backslashes in a row. - repl = '$1}_\\text{'; - string = regexprep(string, '(?<!\\)((\\\\)*)_', repl); - - % '^' has to be in math mode so long as it's not escaped as '\^' in which - % case it is expressed as '\textasciicircum{}' for compatibility with - % regular TeX. Same thing here regarding even/odd number of backslashes - % as in the case of underscores above. - repl = '$1\\textasciicircum{}'; - string = regexprep(string, '(?<!\\)((\\\\)*)\\\^', repl); - repl = '$1}^\\text{'; - string = regexprep(string, '(?<!\\)((\\\\)*)\^', repl); - - % '<' and '>' has to be either in math mode or needs to be typeset as - % '\textless' and '\textgreater' in textmode - % This is handled better, if 'parseStringsAsMath' is activated - if m2t.cmdOpts.Results.parseStringsAsMath == 0 - string = regexprep(string, '<', '\\textless'); - string = regexprep(string, '>', '\\textgreater'); - end - - % Move font styles like \bf into the \text{} command. - expr = '(\\bf|\\it|\\rm|\\fontname)({\w*})+(\\text{)'; - while regexp(string, expr) - string = regexprep(string, expr, '$3$1$2'); - end - - % Replace Fontnames - [~, ~, ~, ~, fonts, ~, subStrings] = regexp(string, '\\fontname{(\w*)}'); - fonts = fonts2tex(fonts); - subStrings = [subStrings; fonts, {''}]; - string = cell2mat(subStrings(:)'); - - % Merge adjacent \text fields: - string = mergeAdjacentTexCmds(string, '\text'); - - % '\\' has to be escaped to '\textbackslash{}' - % This cannot be done with strrep(...) as it would replace e.g. 4 backslashes - % with three times the replacement string because it finds overlapping matches - % (see http://www.mathworks.de/help/techdoc/ref/strrep.html) - % Note: Octave's backslash handling is broken. Even though its output does - % not resemble MATLAB's, the same m2t code is used for either software. That - % way MATLAB-compatible code produces the same matlab2tikz output no matter - % which software it's executed in. So long as this MATLAB incompatibility - % remains in Octave you're probably better off not using backslashes in TeX - % text anyway. - string = regexprep(string, '(\\)\\', '$1textbackslash{}'); - - % '_', '^', '{', and '}' are already escaped properly, even in MATLAB's TeX - % dialect (and if they're not, that's intentional) - - % Escape "$", "%", and "#" to make them compatible to true TeX while in - % MATLAB/Octave they are not escaped - string = strrep(string, '$', '\$'); - string = strrep(string, '%', '\%'); - string = strrep(string, '#', '\#'); - - % Escape "§" as "\S" since it can give UTF-8 problems otherwise. - % The TeX string 'a_§' in particular lead to problems in Octave 3.6.0. - % m2t transcoded that string into '$\text{a}_\text{*}\text{#}$' with - % * = 0xC2 and # = 0xA7 which corresponds with the two-byte UTF-8 - % encoding. Even though this looks like an Octave bug that shows - % during the '..._\text{abc}' to '..._\text{a}\text{bc}' conversion, - % it's best to include the workaround here. - string = strrep(string, '§', '\S{}'); - - % Escape plain "&" in MATLAB and replace it and the following character with - % a space in Octave unless the "&" is already escaped - switch m2t.env - case 'MATLAB' - string = strrep(string, '&', '\&'); - case 'Octave' - % Ampersands should already be escaped in Octave. - % Octave (tested with 3.6.0) handles un-escaped ampersands a little - % funny in that it removes the following character, if there is one: - % 'abc&def' -> 'abc ef' - % 'abc&\deltaef' -> 'abc ef' - % 'abc&$ef' -> 'abc ef' - % 'abcdef&' -> 'abcdef' - % Don't remove closing brace after '&' as this would result in - % unbalanced braces - string = regexprep(string, '(?<!\\)&(?!})', ' '); - string = regexprep(string, '(?<!\\)&}', '}'); - if regexp(string, '(?<!\\)&\\') - % If there's a backslash after the ampersand, that means not only - % the backslash should be removed but the whole escape sequence, - % e.g. '\delta' or '\$'. Actually the '\delta' case is the - % trickier one since by now 'string' would have been turned from - % 'abc&\deltaef' into '\text{abc&}\delta{}\text{ef}', i.e. after - % the ampersand first comes a closing brace and then '\delta'; - % the latter as well as the ampersand itself should be removed - % while the brace must remain in place to avoid unbalanced braces. - userWarning(m2t, ... - ['TeX string ''%s'' contains a special character ' ... - 'after an un-escaped ''&''. The output generated ' ... - 'by matlab2tikz will not precisely match that ' ... - 'which you see in Octave itself in that the ' ... - 'special character and the preceding ''&'' is ' ... - 'not replaced with a space.'], origstr) - end - otherwise - errorUnknownEnvironment(); - end - - % Escape plain "~" in MATLAB and replace escaped "\~" in Octave with a proper - % escape sequence. An un-escaped "~" produces weird output in Octave, thus - % give a warning in that case - switch m2t.env - case 'MATLAB' - string = strrep(string, '~', '\textasciitilde{}'); % or '\~{}' - case 'Octave' - string = strrep(string, '\~', '\textasciitilde{}'); % ditto - if regexp(string, '(?<!\\)~') - userWarning(m2t, ... - ['TeX string ''%s'' contains un-escaped ''~''. ' ... - 'For proper display in Octave you probably ' ... - 'want to escape it even though that''s ' ... - 'incompatible with MATLAB. ' ... - 'In the matlab2tikz output it will have its ' ... - 'usual TeX function as a non-breaking space.'], ... - origstr) - end - otherwise - errorUnknownEnvironment(); - end - - % Convert '..._\text{abc}' and '...^\text{abc}' to '..._\text{a}\text{bc}' - % and '...^\text{a}\text{bc}', respectively. - % Things get a little more complicated if instead of 'a' it's e.g. '$'. The - % latter has been converted to '\$' by now and simply extracting the first - % character from '\text{\$bc}' would result in '\text{$}\text{$bc}' which - % is syntactically wrong. Instead the whole command '\$' has to be moved in - % front of the \text{...} block, e.g. '..._\text{\$bc}' -> '..._\$\text{bc}'. - % Note that the problem does not occur for the majority of special characters - % like '\alpha' because they use math mode and therefore are never inside a - % \text{...} block to begin with. This means that the number of special - % characters affected by this issue is actually quite small: - % $ # % & _ { } \o § ~ \ ^ - expr = ['(_|\^)(\\text)\{([^}\\]|\\\$|\\#|\\%|\\&|\\_|\\\{|\\\}|', ... - ... % (_/^)(\text) {(non-}\| \$ | \#| \%| \&| \_| \{ | \} | - ... % ($1)( $2 ) ( $3 -> - '\\o\{\}|\\S\{\}|\\textasciitilde\{\}|\\textbackslash\{\}|', ... - ... % \o{} | \S{} | \textasciitilde{} | \textbackslash{} | - ... % <- $3 -> - '\\textasciicircum\{\})']; - % \textasciicircum{} ) - % <- $3 ) - string = regexprep(string, expr, '$1$2{$3}$2{'); - - % Some further processing makes the output behave more like TeX math mode, - % but only if the matlab2tikz parameter parseStringsAsMath=true. - if m2t.cmdOpts.Results.parseStringsAsMath - - % Some characters should be in math mode: =-+/,.()<>0-9 - expr = '(\\text)\{([^}=\-+/,.()<>0-9]*)([=\-+/,.()<>0-9]+)([^}]*)\}'; - % \text {(any non-"x"/'}'char)( any "x" char )(non-}) } - % ( $1 ) ( $2 )( $3 )( $4) - while regexp(string, expr) - % Iterating is necessary to catch all occurrences. See above. - string = regexprep(string, expr, '$1{$2}$3$1{$4}'); - end - - % \text{ } should be a math-mode space - string = regexprep(string, '\\text\{(\s+)}', '$1'); - - % '<<' probably means 'much smaller than', i.e. '\ll' - repl = switchMatOct(m2t, '$1\\ll{}$2', '$1\ll{}$2'); - string = regexprep(string, '([^<])<<([^<])', repl); - - % '>>' probably means 'much greater than', i.e. '\gg' - repl = switchMatOct(m2t, '$1\\gg{}$2', '$1\gg{}$2'); - string = regexprep(string, '([^>])>>([^>])', repl); - - % Single letters are most likely variables and thus should be in math mode - string = regexprep(string, '\\text\{([a-zA-Z])\}', '$1'); - - end % parseStringsAsMath - - % Clean up: remove empty \text{} - string = strrep(string, '\text{}', ''); - % \text{}\alpha{}\text{...} -> \alpha{}\text{...} - - % Clean up: convert '{}\' to '\' unless it's prefixed by a backslash which - % means the opening brace is escaped and thus a printable character instead - % of a grouping brace. - string = regexprep(string, '(?<!\\)\{\}(\\)', '$1'); - % \alpha{}\text{...} -> \alpha\text{...} - - % Clean up: convert '{}}' to '}' unless it's prefixed by a backslash - string = regexprep(string, '(?<!\\)\{\}\}', '}'); - - % Clean up: remove '{}' at the end of 'string' unless it's prefixed by a - % backslash - string = regexprep(string, '(?<!\\)\{\}$', ''); -end -% ============================================================================== -function tex = fonts2tex(fonts) -% Returns a tex command for each fontname in the cell array fonts. - if ~iscell(fonts) - error('matlab2tikz:fonts2tex', ... - 'Expecting a cell array as input.'); - end - tex = cell(size(fonts)); - - for ii = 1:numel(fonts) - font = fonts{ii}{1}; - - % List of known fonts. - switch lower(font) - case 'courier' - tex{ii} = '\ttfamily{}'; - case 'times' - tex{ii} = '\rmfamily{}'; - case {'arial', 'helvetica'} - tex{ii} = '\sffamily{}'; - otherwise - warning('matlab2tikz:fonts2tex', ... - 'Unknown font ''%s''. Using tex default font.',font); - % Unknown font -> Switch to standard font. - tex{ii} = '\rm{}'; - end - end -end -% ============================================================================== -function string = mergeAdjacentTexCmds(string, cmd) -% Merges adjacent tex commands like \text into one command - % If necessary, add a backslash - if cmd(1) ~= '\' - cmd = ['\' cmd]; - end - % Link each bracket to the corresponding bracket - link = zeros(size(string)); - pos = [regexp([' ' string], '([^\\]{)'), ... - regexp([' ' string], '([^\\]})')]; - pos = sort(pos); - ii = 1; - while ii <= numel(pos) - if string(pos(ii)) == '}' - link(pos(ii-1)) = pos(ii); - link(pos(ii)) = pos(ii - 1); - pos([ii-1, ii]) = []; - ii = ii - 1; - else - ii = ii + 1; - end - end - % Find dispensable commands - pos = regexp(string, ['}\' cmd '{']); - delete = zeros(0,1); - len = numel(cmd); - for p = pos - l = link(p); - if l > len && isequal(string(l-len:l-1), cmd) - delete(end+1,1) = p; - end - end - % 3. Remove these commands (starting from the back - delete = repmat(delete, 1, len+2) + repmat(0:len+1,numel(delete), 1); - string(delete(:)) = []; -end -function dims = pos2dims(pos) -% Position quadruplet [left, bottom, width, height] to dimension structure - dims = struct('left' , pos(1), 'bottom', pos(2)); - if numel(pos) == 4 - dims.width = pos(3); - dims.height = pos(4); - dims.right = dims.left + dims.width; - dims.top = dims.bottom + dims.height; - end -end -% OPTION ARRAYS ================================================================ -function opts = opts_new() -% create a new options array - opts = cell(0,2); -end -function opts = opts_add(opts, key, value) -% add a key-value pair to an options array (with duplication check) - if ~exist('value','var') - value = []; - end - value = char(value); - - % Check if the key already exists. - if opts_has(opts, key) - oldValue = opts_get(opts, key); - if isequal(value, oldValue) - return; % no action needed: value already present - else - error('matlab2tikz:opts_add', ... - ['Trying to add (%s, %s) to options, but it already ' ... - 'contains the conflicting key-value pair (%s, %s).'], ... - key, value, key, oldValue); - end - end - opts = opts_append(opts, key, value); -end -function bool = opts_has(opts, key) -% returns true if the options array contains the key - bool = ~isempty(opts) && ismember(key, opts(:,1)); -end -function value = opts_get(opts, key) -% returns the value(s) stored for a key in an options array - idx = find(ismember(opts(:,1), key)); - switch numel(idx) - case 1 - value = opts{idx,2}; % just the value - otherwise - value = opts(idx,2); % as cell array - end -end -function opts = opts_append(opts, key, value) -% append a key-value pair to an options array (duplicate keys allowed) - if ~exist('value','var') || isempty(value) - value = []; - end - if ~(opts_has(opts, key) && isequal(opts_get(opts, key), value)) - opts = cat(1, opts, {key, value}); - end -end -function opts = opts_append_userdefined(opts, userDefined) -% appends user-defined options to an options array -% the sserDefined options can come either as a single string or a cellstr that -% is already TikZ-formatted. The internal 2D cell format is NOT supported. - if ~isempty(userDefined) - if ischar(userDefined) - userDefined = {userDefined}; - end - for k = 1:length(userDefined) - opts = opts_append(opts, userDefined{k}); - end - end -end -function opts = opts_remove(opts, varargin) -% remove some key-value pairs from an options array - keysToDelete = varargin; - idxToDelete = ismember(opts(:,1), keysToDelete); - opts(idxToDelete, :) = []; -end -function opts = opts_merge(opts, varargin) -% merge multiple options arrays - for jArg = 1:numel(varargin) - opts2 = varargin{jArg}; - for k = 1:size(opts2, 1) - opts = opts_append(opts, opts2{k,1}, opts2{k,2}); - end - end -end -function str = opts_print(m2t, opts, sep) -% pretty print an options array - nOpts = size(opts,1); - c = cell(nOpts,1); - for k = 1:nOpts - if isempty(opts{k,2}) - c{k} = sprintf('%s', opts{k,1}); - else - c{k} = sprintf('%s=%s', opts{k,1}, opts{k,2}); - end - end - str = join(m2t, c, sep); -end -% DEPRECATED OPTION ARRAYS ===================================================== -% TODO: Remove deprecated functions for next release -function opts = addToOptions(opts, key, value) -% Adds a key-value pair to a structure and does some sanity-checking. - warning('m2t:Deprecated','Use "opts_add" instead!'); - if ~exist('value','var') || isempty(value) - value = []; - end - opts = opts_add(opts, key, value); -end -function opts = merge(opts, varargin) -% Merges multiple option lists - warning('m2t:Deprecated','Use "opts_merge" instead!'); - opts = opts_merge(opts, varargin{:}); -end -function str = prettyprintOpts(m2t, opts, sep) - warning('m2t:Deprecated','Use "opts_print" instead!'); - str = opts_print(m2t, opts, sep); -end -% ============================================================================== -function [env,versionString] = getEnvironment() -% Checks if we are in MATLAB or Octave. - alternatives = {'MATLAB','Octave'}; - for iCase = 1:numel(alternatives) - env = alternatives{iCase}; - vData = ver(env); - if ~isempty(vData) - versionString = vData.Version; - return; % found the right environment - end - end - % otherwise: - env = ''; - versionString = ''; -end -% ============================================================================== -function isHG2 = isHG2(m2t) -% Checks if graphics system is HG2 (true) or HG1 (false). -% HG1 : MATLAB up to R2014a and currently all OCTAVE versions -% HG2 : MATLAB starting from R2014b (version 8.4) - isHG2 = false; - if strcmpi(m2t.env,'MATLAB') && ... - ~isVersionBelow(m2t.env, m2t.envVersion, [8,4]) - isHG2 = true; - end -end -% ============================================================================== -function isBelow = isVersionBelow(env, versionA, versionB) -% Checks if versionA is smaller than versionB - vA = versionArray(env, versionA); - vB = versionArray(env, versionB); - n = min(length(vA), length(vB)); - deltaAB = vA(1:n) - vB(1:n); - difference = find(deltaAB, 1, 'first'); - if isempty(difference) - isBelow = false; % equal versions - else - isBelow = (deltaAB(difference) < 0); - end -end -% ============================================================================== -function str = formatDim(value, unit) -% format the value for use as a TeX dimension - if ~exist('unit','var') || isempty(unit) - unit = ''; - end - tolerance = 1e-7; - value = round(value/tolerance)*tolerance; - if value == 1 && ~isempty(unit) && unit(1) == '\' - str = unit; % just use the unit - else - str = sprintf('%.6f', value); - str = regexprep(str, '(\d*\.\d*?)0+$', '$1'); % remove trailing zeros - str = regexprep(str, '\.$', ''); % remove trailing period - str = [str unit]; - end -end -% ============================================================================== -function arr = versionArray(env, str) -% Converts a version string to an array. - if ischar(str) - % Translate version string from '2.62.8.1' to [2; 62; 8; 1]. - switch env - case 'MATLAB' - split = regexp(str, '\.', 'split'); % compatibility MATLAB < R2013a - case 'Octave' - split = strsplit(str, '.'); - otherwise - errorUnknownEnvironment(); - end - arr = str2num(char(split)); %#ok - else - arr = str; - end - arr = arr(:)'; -end -% ============================================================================== -function [retval] = switchMatOct(m2t, matlabValue, octaveValue) -% Returns a different value for MATLAB and Octave - switch m2t.env - case 'MATLAB' - retval = matlabValue; - case 'Octave' - retval = octaveValue; - otherwise - errorUnknownEnvironment(); - end -end -% ============================================================================== -function checkDeprecatedEnvironment(m2t, minimalVersions) - if isfield(minimalVersions, m2t.env) - minVersion = minimalVersions.(m2t.env); - envWithVersion = sprintf('%s %s', m2t.env, minVersion.name); - - if isVersionBelow(m2t.env, m2t.envVersion, minVersion.num) - ID = 'matlab2tikz:deprecatedEnvironment'; - - warningMessage = ['\n', repmat('=',1,80), '\n\n', ... - ' matlab2tikz is tested and developed on %s and newer.\n', ... - ' This script may still be able to handle your plots, but if you\n', ... - ' hit a bug, please consider upgrading your environment first.\n', ... - ' Type "warning off %s" to suppress this warning.\n', ... - '\n', repmat('=',1,80), ]; - warning(ID, warningMessage, envWithVersion, ID); - - end - else - errorUnknownEnvironment(); - end -end -% ============================================================================== -function errorUnknownEnvironment() - error('matlab2tikz:unknownEnvironment',... - 'Unknown environment. Need MATLAB(R) or Octave.') -end -% ============================================================================== -function m2t = needsPgfplotsVersion(m2t, minVersion) - if isVersionBelow(m2t, m2t.pgfplotsVersion, minVersion) - m2t.pgfplotsVersion = minVersion; - end -end -% ============================================================================== -function str = formatPgfplotsVersion(m2t, version) - version = versionArray(m2t, version); - if all(isfinite(version)) - str = sprintf('%d.',version); - str = str(1:end-1); % remove the last period - else - str = 'newest'; - end -end -% ============================================================================== -function [formatted,treeish] = VersionControlIdentifier() -% This function gives the (git) commit ID of matlab2tikz -% -% This assumes the standard directory structure as used by Nico's master branch: -% SOMEPATH/src/matlab2tikz.m with a .git directory in SOMEPATH. -% -% The HEAD of that repository is determined from file system information only -% by following dynamic references (e.g. ref:refs/heds/master) in branch files -% until an absolute commit hash (e.g. 1a3c9d1...) is found. -% NOTE: Packed branch references are NOT supported by this approach - MAXITER = 10; % stop following dynamic references after a while - formatted = ''; - REFPREFIX = 'ref:'; - isReference = @(treeish)(any(strfind(treeish, REFPREFIX))); - treeish = [REFPREFIX 'HEAD']; - try - % get the matlab2tikz directory - m2tDir = fileparts(mfilename('fullpath')); - gitDir = fullfile(m2tDir,'..','.git'); - - nIter = 1; - while isReference(treeish) - refName = treeish(numel(REFPREFIX)+1:end); - branchFile = fullfile(gitDir, refName); - - if exist(branchFile, 'file') && nIter < MAXITER - fid = fopen(branchFile,'r'); - treeish = fscanf(fid,'%s'); - fclose(fid); - nIter = nIter + 1; - else % no branch file or iteration limit reached - treeish = ''; - return; - end - end - catch %#ok - treeish = ''; - end - if ~isempty(treeish) - formatted = sprintf('(commit %s)',treeish); - end -end -% ============================================================================== diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/myfile b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/myfile deleted file mode 100644 index 43166ea1..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/myfile +++ /dev/null @@ -1,43 +0,0 @@ -% This file was created by matlab2tikz. -% Minimal pgfplots version: 1.3 -% -%The latest updates can be retrieved from -% http://www.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz -%where you can also make suggestions and rate matlab2tikz. -% -\begin{tikzpicture} - -\begin{axis}[% -width=5.25in, -height=2.586207in, -at={(0.991379in,0.603448in)}, -scale only axis, -separate axis lines, -every outer x axis line/.append style={black}, -every x tick label/.append style={font=\color{black}}, -xmin=0, -xmax=120, -xlabel={$\fontsize{18}{0}\text{Prétension [kN]}$}, -xmajorgrids, -every outer y axis line/.append style={black}, -every y tick label/.append style={font=\color{black}}, -ymin=0, -ymax=1500, -ylabel={$\fontsize{18}{0}\text{Surface de contacte [mm}^\text{2}\text{]}$}, -ymajorgrids -] -\addplot [color=blue,solid,line width=2.0pt,mark=asterisk,mark options={solid},forget plot] - table[row sep=crcr]{% -10 41.465236444\\ -14 887.294699403\\ -18 1185.146646\\ -22 1185.146646\\ -26 1185.146646\\ -30 1185.146646\\ -50 1185.146646\\ -70 1185.146646\\ -90 1185.146646\\ -110 1185.146646\\ -}; -\end{axis} -\end{tikzpicture}% \ No newline at end of file diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/private/m2tUpdater.m b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/private/m2tUpdater.m deleted file mode 100644 index ea7adcdc..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/private/m2tUpdater.m +++ /dev/null @@ -1,142 +0,0 @@ -function updater(name, fileExchangeUrl, version, verbose, env) -%UPDATER Auto-update matlab2tikz. -% Only for internal usage. - -% Copyright (c) 2012--2014, Nico Schlömer <nico.schloemer@gmail.com> -% All rights reserved. -% -% Redistribution and use in source and binary forms, with or without -% modification, are permitted provided that the following conditions are -% met: -% -% * Redistributions of source code must retain the above copyright -% notice, this list of conditions and the following disclaimer. -% * Redistributions in binary form must reproduce the above copyright -% notice, this list of conditions and the following disclaimer in -% the documentation and/or other materials provided with the distribution -% -% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -% POSSIBILITY OF SUCH DAMAGE. -% ========================================================================= - try - html = urlread([fileExchangeUrl, '/all_files']); - catch %#ok - % Couldn't load the URL -- never mind. - html = ''; - end - % Search for a string "/version-1.6.3" in the HTML. This assumes - % that the package author has added a file by that name to - % to package. This is a rather dirty hack around FileExchange's - % lack of native versioning information. - mostRecentVersion = regexp(html, '/version-(\d+\.\d+\.\d+)', 'tokens'); - if ~isempty(mostRecentVersion) - if isVersionBelow(env, version, mostRecentVersion{1}{1}) - userInfo(verbose, '**********************************************\n'); - userInfo(verbose, 'New version available! (%s)\n', mostRecentVersion{1}{1}); - userInfo(verbose, '**********************************************\n'); - - reply = input([' *** Would you like ', name, ' to self-upgrade? y/n [n]:'],'s'); - if strcmp(reply, 'y') - % Download the files and unzip its contents into the folder - % above the folder that contains the current script. - % This assumes that the file structure is something like - % - % src/matlab2tikz.m - % src/[...] - % AUTHORS - % ChangeLog - % [...] - % - % on the hard drive and the zip file. In particular, this assumes - % that the folder on the hard drive is writable by the user - % and that matlab2tikz.m is not symlinked from some other place. - pathstr = fileparts(mfilename('fullpath')); - targetPath = [pathstr, filesep, '..', filesep]; - userInfo(verbose, ['Downloading and unzipping to ', targetPath, '...']); - upgradeSuccess = false; - try - unzippedFiles = unzip([fileExchangeUrl, '?download=true'], targetPath); - upgradeSuccess = true; %~isempty(unzippedFiles); - userInfo(verbose, 'done.'); - catch - userInfo(verbose, 'FAILED.'); - end - if upgradeSuccess - % TODO explicitly delete all of the old content - % Delete old version number file. - versionFile = [pathstr, filesep, 'version-', version]; - if exist(versionFile, 'file') == 2 - delete(versionFile); - end - % TODO anything better than error()? - error('Upgrade successful. Please re-execute.'); - else - error('Upgrade failed.'); - end - end - userInfo(verbose, ''); - end - end -end -% ========================================================================= -function isBelow = isVersionBelow(env, versionA, versionB) - % Checks if version string or vector versionA is smaller than - % version string or vector versionB. - - vA = versionArray(env, versionA); - vB = versionArray(env, versionB); - - isBelow = false; - for i = 1:min(length(vA), length(vB)) - if vA(i) > vB(i) - isBelow = false; - break; - elseif vA(i) < vB(i) - isBelow = true; - break - end - end - -end -% ========================================================================= -function arr = versionArray(env, str) - % Converts a version string to an array, e.g., - % '2.62.8.1' to [2, 62, 8, 1]. - - if ischar(str) - if strcmpi(env, 'MATLAB') - split = regexp(str, '\.', 'split'); - elseif strcmpi(env, 'Octave') - split = strsplit(str, '.'); - end - arr = str2num(char(split)); %#ok - else - arr = str; - end - -end -% ========================================================================= -function userInfo(verbose, message, varargin) - % Display usage information. - - if ~verbose - return - end - - mess = sprintf(message, varargin{:}); - - % Replace '\n' by '\n *** ' and print. - mess = strrep( mess, sprintf('\n'), sprintf('\n *** ') ); - fprintf( ' *** %s\n', mess ); - -end -% ========================================================================= diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/test.text b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/test.text deleted file mode 100644 index 69bc0dcf..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/src/test.text +++ /dev/null @@ -1,322 +0,0 @@ -% This file was created by matlab2tikz. -% Minimal pgfplots version: 1.3 -% -%The latest updates can be retrieved from -% http://www.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz -%where you can also make suggestions and rate matlab2tikz. -% -\begin{tikzpicture} - -\begin{axis}[% -width=9.6875in, -height=3.34375in, -at={(1.625in,0.510417in)}, -scale only axis, -separate axis lines, -every outer x axis line/.append style={black}, -every x tick label/.append style={font=\color{black}}, -xmin=1, -xmax=10, -xlabel={$n_{std}$}, -xmajorgrids, -every outer y axis line/.append style={black}, -every y tick label/.append style={font=\color{black}}, -ymode=log, -ymin=100000, -ymax=1e+15, -yminorticks=true, -ylabel={condition number}, -ymajorgrids, -yminorgrids, -legend style={legend cell align=left,align=left,draw=black} -] -\addplot [color=blue,solid,line width=2.0pt] - table[row sep=crcr]{% -1 215657237.21042\\ -1.04522613 136820225.413517\\ -1.09045226 89608942.44\\ -1.13567839 60417150.9517798\\ -1.18090452 41831190.7629315\\ -1.22613065 29675776.706432\\ -1.27135678 21527373.5999616\\ -1.31658291 15939625.8614052\\ -1.36180905 12026890.1355725\\ -1.40703518 9233775.48088384\\ -1.45226131 7204182.27073421\\ -1.49748744 5705025.83181377\\ -1.54271357 4580776.43354252\\ -1.5879397 3725776.0785063\\ -1.63316583 3067036.45370892\\ -1.67839196 2553345.35426966\\ -1.72361809 2148243.42393524\\ -1.76884422 1825419.54430157\\ -1.81407035 1565644.080049\\ -1.85929648 1354695.28727389\\ -1.90452261 1181937.9131113\\ -1.94974874 1039335.55560049\\ -1.99497487 920756.316696951\\ -2.04020101 821478.398098347\\ -2.08542714 737834.662831489\\ -2.13065327 666954.225424749\\ -2.1758794 606572.911837312\\ -2.22110553 554893.041524291\\ -2.26633166 510479.001106209\\ -2.31155779 472179.23166594\\ -2.35678392 439068.236918351\\ -2.40201005 410404.872449736\\ -2.44723618 385606.329107303\\ -2.49246231 364244.522273867\\ -2.53768844 346098.071307408\\ -2.58291457 331439.715080992\\ -2.6281407 323070.674066522\\ -2.67336683 342018.259472786\\ -2.71859296 404629.185545462\\ -2.7638191 490126.661984278\\ -2.80904523 596166.073119711\\ -2.85427136 725661.314455159\\ -2.89949749 882971.221820954\\ -2.94472362 1073523.04104558\\ -2.98994975 1303861.38755625\\ -3.03517588 1581802.72481281\\ -3.08040201 1916643.18533517\\ -3.12562814 2319409.96384725\\ -3.17085427 2803158.06652063\\ -3.2160804 3383316.09890573\\ -3.26130653 4078088.51824717\\ -3.30653266 4908921.33545744\\ -3.35175879 5901040.91592187\\ -3.39698492 7084075.27483846\\ -3.44221106 8492770.41457107\\ -3.48743719 10167813.939853\\ -3.53266332 12156781.5683035\\ -3.57788945 14515221.8082826\\ -3.62311558 17307898.9755472\\ -3.66834171 20610214.052099\\ -3.71356784 24509827.2407036\\ -3.75879397 29108508.1556598\\ -3.8040201 34524242.7528462\\ -3.84924623 40893629.2122888\\ -3.89447236 48374599.2188472\\ -3.93969849 57149503.4606085\\ -3.98492462 67428607.2710279\\ -4.03015075 79454046.263808\\ -4.07537688 93504292.4951583\\ -4.12060302 109899199.394868\\ -4.16582915 129005681.433262\\ -4.21105528 151244114.639717\\ -4.25628141 177095528.706355\\ -4.30150754 207109697.02042\\ -4.34673367 241914183.663127\\ -4.3919598 282224524.052152\\ -4.43718593 328855574.775\\ -4.48241206 382734264.974901\\ -4.52763819 444913758.875845\\ -4.57286432 516589353.420124\\ -4.61809045 599116112.491952\\ -4.66331658 694028575.782968\\ -4.70854271 803062641.821928\\ -4.75376884 928179891.848816\\ -4.79899497 1071594634.99544\\ -4.84422111 1235803870.6776\\ -4.88944724 1423620520.509\\ -4.93467337 1638210187.87137\\ -4.9798995 1883131892.00857\\ -5.02512563 2162383057.1469\\ -5.07035176 2480449143.7932\\ -5.11557789 2842358530.11134\\ -5.16080402 3253742909.86987\\ -5.20603015 3720903913.42031\\ -5.25125628 4250886324.98886\\ -5.29648241 4851558755.61754\\ -5.34170854 5531702163.04615\\ -5.38693467 6301107163.49668\\ -5.4321608 7170680688.06443\\ -5.47738693 8152563062.37041\\ -5.52261307 9260256184.30458\\ -5.5678392 10508763860.3566\\ -5.61306533 11914745257.4492\\ -5.65829146 13496682903.8006\\ -5.70351759 15275066506.6756\\ -5.74874372 17272591869.1043\\ -5.79396985 19514380668.2299\\ -5.83919598 22028218261.798\\ -5.88442211 24844812785.3959\\ -5.92964824 27998077620.2401\\ -5.97487437 31525439606.0782\\ -6.0201005 35468172326.9619\\ -6.06532663 39871760149.2145\\ -6.11055276 44786292718.9093\\ -6.15577889 50266892837.4064\\ -6.20100503 56374181609.2205\\ -6.24623116 63174782057.1755\\ -6.29145729 70741865465.9649\\ -6.33668342 79155740523.69\\ -6.38190955 88504495353.6966\\ -6.42713568 98884689720.5283\\ -6.47236181 110402100245.653\\ -6.51758794 123172532736.627\\ -6.56281407 137322691872.685\\ -6.6080402 152991125424.64\\ -6.65326633 170329241170.995\\ -6.69849246 189502401912.638\\ -6.74371859 210691108219.242\\ -6.78894472 234092270123.166\\ -6.83417085 259920577253.124\\ -6.87939698 288409974555.423\\ -6.92462312 319815247850.498\\ -6.96984925 354413729710.578\\ -7.01507538 392507129197.163\\ -7.06030151 434423501985.988\\ -7.10552764 480519366253.382\\ -7.15075377 531181966841.959\\ -7.1959799 586831706221.842\\ -7.24120603 647924757226.93\\ -7.28643216 714955854364.587\\ -7.33165829 788461293848.765\\ -7.37688442 869022130770.009\\ -7.42211055 957267616672.292\\ -7.46733668 1053878876991.16\\ -7.51256281 1159592828040.97\\ -7.55778894 1275206352975.12\\ -7.60301508 1401580875580.12\\ -7.64824121 1539647052872.52\\ -7.69346734 1690409888850.37\\ -7.73869347 1854954327003.73\\ -7.7839196 2034450930427.24\\ -7.82914573 2230162170442.56\\ -7.87437186 2443449020877.6\\ -7.91959799 2675778040473.91\\ -7.96482412 2928728919473.7\\ -8.01005025 3204002481542.02\\ -8.05527638 3503429120415.6\\ -8.10050251 3828978067099.6\\ -8.14572864 4182766836195.08\\ -8.19095477 4567071646954.06\\ -8.2361809 4984338352691.71\\ -8.28140704 5437193957739.14\\ -8.32663317 5928458925046.44\\ -8.3718593 6461160390776.81\\ -8.41708543 7038546107707.71\\ -8.46231156 7664098911238.81\\ -8.50753769 8341552808902.62\\ -8.55276382 9074909106182.64\\ -8.59798995 9868454526284.93\\ -8.64321608 10726779534067.6\\ -8.68844221 11654798216265\\ -8.73366834 12657769212309.8\\ -8.77889447 13741318162726.6\\ -8.8241206 14911460665449.6\\ -8.86934673 16174627900245.6\\ -8.91457286 17537692291687.8\\ -8.95979899 19007995815445\\ -9.00502513 20593379106651.1\\ -9.05025126 22302213001529.2\\ -9.09547739 24143431056171.9\\ -9.14070352 26126564528964.6\\ -9.18592965 28261779255201.2\\ -9.23115578 30559914044206.9\\ -9.27638191 33032522158326.2\\ -9.32160804 35691914339897.3\\ -9.36683417 38551204026095.3\\ -9.4120603 41624356372873.2\\ -9.45728643 44926238364588.5\\ -9.50251256 48472672472399.1\\ -9.54773869 52280493366340.5\\ -9.59296482 56367607259008.2\\ -9.63819095 60753054065642.7\\ -9.68341709 65457074706447.7\\ -9.72864322 70501179167793.9\\ -9.77386935 75908220995300.4\\ -9.81909548 81702473021700.5\\ -9.86432161 87909710160957.6\\ -9.90954774 94557293096419.3\\ -9.95477387 101674259806590\\ -10 109291416242262\\ -}; -\addlegendentry{$Z^{\mathrm{T}}WZ$}; - -\addplot [color=black,solid,line width=2.0pt] - table[row sep=crcr]{% -1 560454412409859\\ -1.18367347 42498932093520.3\\ -1.36734694 5123890528457.51\\ -1.55102041 898105464233.222\\ -1.73469388 211017639202.433\\ -1.91836735 62169676611.3565\\ -2.10204082 21907648647.9303\\ -2.28571429 8926402639.07259\\ -2.46938776 4099829681.95167\\ -2.65306122 2080990765.85216\\ -2.83673469 1149170154.28539\\ -3.02040816 681802436.93214\\ -3.20408163 430217654.276045\\ -3.3877551 286338901.782842\\ -3.57142857 199653116.003929\\ -3.75510204 145016493.147664\\ -3.93877551 109206268.302508\\ -4.12244898 84925264.6026608\\ -4.30612245 67971453.1086336\\ -4.48979592 55832260.7758454\\ -4.67346939 46954284.3116833\\ -4.85714286 40348335.8101153\\ -5.04081633 35368028.5023324\\ -5.2244898 31581611.3051586\\ -5.40816327 28695666.7537723\\ -5.59183673 26508608.7673693\\ -5.7755102 24881882.2485996\\ -5.95918367 23722098.5228357\\ -6.14285714 22970352.5858438\\ -6.32653061 22596848.7230199\\ -6.51020408 22600475.7811779\\ -6.69387755 23014954.4581165\\ -6.87755102 23927246.9235142\\ -7.06122449 25524016.4254314\\ -7.24489796 28202140.1298424\\ -7.42857143 32758502.5023493\\ -7.6122449 40383651.4423756\\ -7.79591837 52193820.5722562\\ -7.97959184 69216418.0492402\\ -8.16326531 92847067.5423836\\ -8.34693878 125078476.218031\\ -8.53061224 168621384.493642\\ -8.71428571 227064562.415315\\ -8.89795918 305097706.446344\\ -9.08163265 408802687.901804\\ -9.26530612 546022951.373956\\ -9.44897959 726825866.229147\\ -9.63265306 964077206.835893\\ -9.81632653 1274151329.46174\\ -10 1677805397.01432\\ -}; -\addlegendentry{$Z^{\mathrm{T}}Z$}; - -\addplot [color=blue,dashed,line width=2.0pt,forget plot] - table[row sep=crcr]{% -1 323070.674066522\\ -10 323070.674066522\\ -}; -\addplot [color=black,dashed,line width=2.0pt,forget plot] - table[row sep=crcr]{% -1 22596848.7230199\\ -10 22596848.7230199\\ -}; -\addplot [color=blue,dashed,line width=2.0pt,forget plot] - table[row sep=crcr]{% -2.6281407 100000\\ -2.6281407 1e+16\\ -}; -\addplot [color=black,dashed,line width=2.0pt,forget plot] - table[row sep=crcr]{% -6.32653061 100000\\ -6.32653061 1e+16\\ -}; -\addplot [color=black,only marks,mark=*,mark options={solid,fill=green},forget plot] - table[row sep=crcr]{% -2.6281407 323070.674066522\\ -}; -\addplot [color=black,only marks,mark=*,mark options={solid,fill=red},forget plot] - table[row sep=crcr]{% -6.32653061 22596848.7230199\\ -}; -\end{axis} -\end{tikzpicture}% \ No newline at end of file diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/ACID.m b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/ACID.m deleted file mode 100644 index cf35d471..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/ACID.m +++ /dev/null @@ -1,2378 +0,0 @@ -% ========================================================================= -% *** FUNCTION ACID -% *** -% *** MATLAB2TikZ ACID test functions -% *** -% ========================================================================= -% *** -% *** Copyright (c) 2008--2014, Nico Schlömer <nico.schloemer@gmail.com> -% *** All rights reserved. -% *** -% *** Redistribution and use in source and binary forms, with or without -% *** modification, are permitted provided that the following conditions are -% *** met: -% *** -% *** * Redistributions of source code must retain the above copyright -% *** notice, this list of conditions and the following disclaimer. -% *** * Redistributions in binary form must reproduce the above copyright -% *** notice, this list of conditions and the following disclaimer in -% *** the documentation and/or other materials provided with the distribution -% *** -% *** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -% *** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -% *** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -% *** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -% *** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -% *** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -% *** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -% *** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -% *** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -% *** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -% *** POSSIBILITY OF SUCH DAMAGE. -% *** -% ========================================================================= -function [status] = ACID(k) - - % assign the functions to test - testfunction_handles = { ... - @multiline_labels , ... - @plain_cos , ... - @sine_with_markers , ... - @markerSizes , ... - @markerSizes2 , ... - @sine_with_annotation, ... - @linesWithOutliers , ... - @peaks_contour , ... - @contourPenny , ... - @peaks_contourf , ... - @many_random_points , ... - @double_colorbar , ... - @randomWithLines , ... - @double_axes , ... - @double_axes2 , ... - @logplot , ... - @colorbarLogplot , ... - @legendplot , ... - @legendplotBoxoff , ... - @moreLegends , ... - @zoom , ... - @quiveroverlap , ... - @quiverplot , ... - @quiver3plot , ... - @logicalImage , ... - @imagescplot , ... - @imagescplot2 , ... - @stairsplot , ... - @polarplot , ... - @roseplot , ... - @compassplot , ... - @stemplot , ... - @stemplot2 , ... - @bars , ... - @xAxisReversed , ... - @errorBars , ... - @errorBars2 , ... - @subplot2x2b , ... - @manualAlignment , ... - @subplotCustom , ... - @legendsubplots , ... - @bodeplots , ... - @rlocusPlot , ... - @mandrillImage , ... - @besselImage , ... - @clownImage , ... - @zplanePlot1 , ... - @zplanePlot2 , ... - @freqResponsePlot , ... - @axesLocation , ... - @axesColors , ... - @multipleAxes , ... - @scatterPlotRandom , ... - @scatterPlot , ... - @scatter3Plot , ... - @spherePlot , ... - @surfPlot , ... - @surfPlot2 , ... - @superkohle , ... - @meshPlot , ... - @ylabels , ... - @spectro , ... % takes pretty long to LuaLaTeX-compile - @mixedBarLine , ... - @decayingharmonic , ... - @texcolor , ... - @textext , ... - @texrandom , ... - @latexmath1 , ... - @latexmath2 , ... - @parameterCurve3d , ... - @parameterSurf , ... - @fill3plot , ... - @rectanglePlot , ... - @herrorbarPlot , ... - @hist3d , ... - @myBoxplot , ... - @areaPlot , ... - @customLegend , ... - @pixelLegend , ... - @croppedImage , ... - @pColorPlot , ... - @hgTransformPlot , ... - @scatterPlotMarkers , ... - @multiplePatches , ... - @logbaseline , ... - @alphaImage , ... - @annotation1 , ... - @annotation2 , ... - @annotation3 , ... - @annotationText , ... - @annotationTextUnits , ... - @imageOrientation_PNG, ... - @imageOrientation_inline, ... - @texInterpreter , ... - @stackedBarsWithOther, ... - @colorbarLabelTitle - }; - - - numFunctions = length( testfunction_handles ); - - if (k<=0) - status = testfunction_handles; - return; % This is used for querying numFunctions. - - elseif (k<=numFunctions) - status = testfunction_handles{k}(); - status.function = func2str(testfunction_handles{k}); - - else - error('testfunctions:outOfBounds', ... - 'Out of bounds (number of testfunctions=%d)', numFunctions); - end - -end -% ========================================================================= -function [stat] = multiline_labels() - stat.description = 'Test multiline labels and plot some points.'; - stat.md5 = '2f08dbb3f961daa409c91ce0f5be65e4'; - - m = [0 1 1.5 1 -1]; - plot(m,'*-'); hold on; - plot(m(end:-1:1)-0.5,'x--'); - - title({'multline','title'}); - legend({sprintf('multi-line legends\ndo work 2^2=4'), ... - sprintf('second\nplot')}); - xlabel(sprintf('one\ntwo\nthree')); - ylabel({'one','° ∞', 'three'}); - - set(gca,'YTick', []); - set(gca,'XTickLabel',{}); -end -% ========================================================================= -function [stat] = plain_cos() - stat.description = 'Plain cosine function with minimumPointsDistance of $0.5$.'; - stat.extraCleanfigureOptions = {'minimumPointsDistance', 0.5}; - stat.md5 = '888ccfb8de61fe94ef1a4b21b515bbb2'; - - fplot( @cos, [0,2*pi] ); - - % add some minor ticks - set(gca, 'XMinorTick', 'on'); - set(gca, 'YTick', []); - - % Adjust the aspect ratio when in MATLAB(R) or Octave >= 3.4. - env = getEnvironment(); - if strcmpi(env,'Octave') && isVersionBelow(env, 3,4) - % Octave < 3.4 doesn't have daspect unfortunately. - else - daspect([ 1 2 1 ]) - end -end -% ========================================================================= -function [stat] = sine_with_markers () - % Standard example plot from MATLAB's help pages. - stat.description = [ 'Twisted plot of the sine function. ' ,... - 'Pay particular attention to how markers and Infs/NaNs are treated.' ]; - stat.md5 = '96317b8317f3eddee9ca01ca338f6c73'; - - x = -pi:pi/10:pi; - y = tan(sin(x)) - sin(tan(x)); - y(3) = NaN; - y(7) = Inf; - y(11) = -Inf; - plot(x,y,'--o', 'Color', [0.6,0.2,0.0], ... - 'LineWidth', 1*360/127,... - 'MarkerEdgeColor','k',... - 'MarkerFaceColor',[0.3,0.1,0.0],... - 'MarkerSize', 5*360/127 ); - - set( gca, 'Color', [0.9 0.9 1], ... - 'XTickLabel', [], ... - 'YTickLabel', [] ... - ); - - set(gca,'XTick',[0]); - set(gca,'XTickLabel',{'null'}); -end -% ========================================================================= -function [stat] = markerSizes() - stat.description = 'Marker sizes.'; - stat.md5 = '466116e445acacf20b4d712600a43a63'; - - hold on; - - h = fill([1 1 2 2],[1 2 2 1],'r'); - set(h,'LineWidth',10); - - plot([0],[0],'go','Markersize',14,'LineWidth',10) - plot([0],[0],'bo','Markersize',14,'LineWidth',1) -end -% ========================================================================= -function [stat] = markerSizes2() - stat.description = 'Line plot with with different marker sizes.'; - stat.md5 = '0392b76c0de39655f33710fbd6bd5ac8'; - - hold on; - grid on; - - n = 1:10; - d = 10; - s = round(linspace(6,25,10)); - e = d * ones(size(n)); - style = {'bx','rd','go','c.','m+','y*','bs','mv','k^','r<','g>','cp','bh'}; - nStyles = numel(style); - - for ii = 1:nStyles - for jj = 1:10 - plot(n(jj), ii * e(jj),style{ii},'MarkerSize',s(jj)); - end - end - xlim([min(n)-1 max(n)+1]); - ylim([0 d*(nStyles+1)]); - set(gca,'XTick',n,'XTickLabel',s,'XTickLabelMode','manual'); -end -% ========================================================================= -function [stat] = sine_with_annotation () - stat.description = [ 'Plot of the sine function. ',... - 'Pay particular attention to how titles and annotations are treated.' ]; - stat.md5 = 'a59a2a2295b5db533cc733feceda974b'; - - x = -pi:.1:pi; - y = sin(x); - h = plot(x,y); - set(gca,'XTick',-pi:pi/2:pi); - - set(gca,'XTickLabel',{'-pi','-pi/2','0','pi/2','pi'}); - - xlabel('-\pi \leq \Theta \leq \pi'); - ylabel('sin(\Theta)'); - title({'Plot of sin(\Theta)','subtitle','and here''s one really long subtitle' }); - text(-pi/4,sin(-pi/4),'\leftarrow sin(-\pi\div4)',... - 'HorizontalAlignment','left'); - - % Doesn't work in Octave - %set(findobj(gca,'Type','line','Color',[0 0 1]),... - % 'Color','red',... - % 'LineWidth',10); - -end -% ========================================================================= -function [stat] = linesWithOutliers() - stat.description = 'Lines with outliers.'; - stat.md5 = 'ea2084452c49d1a6e0379739371b2e0a'; - - far = 200; - x = [ -far, -1, -1, -far, -10, -0.5, 0.5, 10, far, 1, 1, far, 10, 0.5, -0.5, -10, -far ]; - y = [ -10, -0.5, 0.5, 10, far, 1, 1, far, 10, 0.5, -0.5, -10, -far, -1, -1, -far, -0.5 ]; - plot( x, y,'o-'); - axis( [-2,2,-2,2] ); -end -% ========================================================================= -function [stat] = peaks_contour() - stat.description = 'Test contour plots.'; - stat.md5 = 'fd564136304fa8e0dac8365abee077b5'; - - [C, h] = contour(peaks(20),10); - clabel(C, h); - - % remove y-ticks - set(gca,'YTickLabel',[]); - set(gca,'YTick',[]); - - colormap winter; - -end -% ========================================================================= -function [stat] = contourPenny() - stat.description = 'Contour plot of a US\$ Penny.'; - stat.md5 = '2bcbbf33b2b4a3de6fe3c282acdbf6ae'; - stat.issues = [49 404]; - - if ~exist('penny.mat','file') - fprintf( 'penny data set not found. Skipping.\n\n' ); - stat.skip = true; - return; - end - - load penny; - contour(flipud(P)); - axis square; - -end -% ========================================================================= -function [stat] = peaks_contourf () - stat.description = 'Test the contourfill plots.'; - stat.md5 = '515a8b6209314b8a6ef0051b49b69508'; - - contourf(peaks(20), 10); - colorbar(); - legend('my legend'); -% colorbar('NorthOutside'); -% colorbar('SouthOutside'); -% colorbar('WestOutside'); - -% colormap([0:0.1:1; 1:-0.1:0; 0:0.1:1]') - colormap hsv; - -end -% ========================================================================= -function [stat] = double_colorbar() - stat.description = 'Double colorbar.'; - stat.md5 = ''; - - vspace = linspace(-40,40,20); - speed_map = magic(20).'; - Q1_map = magic(20); - - subplot(1, 2, 1); - contour(vspace(9:17),vspace(9:17),speed_map(9:17,9:17),20) - colorbar - axis tight - axis square - xlabel('$v_{2d}$') - ylabel('$v_{2q}$') - - subplot(1, 2, 2) - contour(vspace(9:17),vspace(9:17),Q1_map(9:17,9:17),20) - colorbar - axis tight - axis square - xlabel('$v_{2d}$') - ylabel('$v_{2q}$') -end -% ========================================================================= -function [stat] = randomWithLines() - stat.description = 'Lissajous points with lines.'; - stat.md5 = '9ddd96d692c4262ec581bbddea5dc5c0'; - - beta = 42.42; - t = 1:150; - X = [sin(t); cos(beta * t)].'; - - %X = randn(150,2); - X(:,1) = (X(:,1) * 90) + 75; - plot(X(:,1),X(:,2),'o'); - hold on; - M(1)=min(X(:,1)); - M(2)=max(X(:,1)); - mn = mean(X(:,2)); - s = std(X(:,2)); - plot(M,[mean(X(:,2)) mean(X(:,2))],'k-'); - plot(M,mn + 1*[s s],'--'); - plot(M,mn - 2*[s s],'--'); - axis('tight'); -end -% ========================================================================= -function [stat] = many_random_points () - stat.description = 'Test the performance when drawing many points.'; - stat.md5 = '759011e36b98a371a628a67cc29ca81d'; - - n = 1e3; - alpha = 1024; - beta = 1; - gamma = 5.47; - - x = cos( (1:n) * alpha ); - y = sin( (1:n) * beta + gamma); - - plot ( x, y, '.r' ); - axis([ 0, 1, 0, 1 ]) -end -% ========================================================================= -function [stat] = double_axes() - stat.description = 'Double axes'; - stat.md5 = ''; - - dyb = 0.1; % normalized units, bottom offset - dyt = 0.1; % separation between subsequent axes bottoms - - x = [0; 24; 48; 72; 96;]; - y = [7.653 7.473 7.637 7.652 7.651]; - - grid on - h1 = plot(x,y,'Color','k'); - - % following code is taken from `floatAxisX.m' - - % get position of axes - allAxes = findobj(gcf,'type','axes'); - naxes = length(allAxes); - ax1Pos = get(allAxes(naxes),'position'); - - % rescale and reposition all axes to handle additional axes - for an=1:naxes-1 - if isequal(rem(an,2),0) - % even ones in array of axes handles represent axes on which lines are plotted - set(allAxes(an),'Position',[ax1Pos(1,1) ax1Pos(1,2)+dyb ax1Pos(1,3) ax1Pos(1,4)-dyt]) - else - % odd ones in array of axes handles represent axes on which floating x-axss exist - axPos = get(allAxes(an),'Position'); - set(allAxes(an),'Position',[axPos(1,1) axPos(1,2)+dyb axPos(1,3) axPos(1,4)]) - end - end - % first axis a special case (doesn't fall into even/odd scenario of figure children) - set(allAxes(naxes),'Position',[ax1Pos(1,1) ax1Pos(1,2)+dyb ax1Pos(1,3) ax1Pos(1,4)-dyt]) - ylimit1 = get(allAxes(naxes),'Ylim'); - - % get new position for plotting area of figure - ax1Pos = get(allAxes(naxes),'position'); - - % axis to which the floating axes will be referenced - ref_axis = allAxes(1); - refPosition = get(ref_axis,'position'); - - % overlay new axes on the existing one - ax2 = axes('Position',ax1Pos); - % plot data and return handle for the line - hl1 = plot(x,y,'k'); - % make the new axes invisible, leaving only the line visible - set(ax2,'visible','off','ylim',ylimit1) - - % set the axis limit mode so that it does not change if the - % user resizes the figure window - set(ax2,'xLimMode','manual') - - % set up another set of axes to act as floater - ax3 = axes('Position',[refPosition(1) refPosition(2)-dyb refPosition(3) 0.01]); - - set(ax3,'box','off','ycolor','w','yticklabel',[],'ytick',[]) - set(ax3,'XMinorTick','on','color','none','xcolor',get(hl1,'color')) - - xlabel('secondary axis') -end -% ========================================================================= -function [stat] = double_axes2() - stat.description = 'Double overlayed axes with a flip.' ; - stat.md5 = '245182a1593794038e5a601a5b7f6a42'; - - ah1=axes; - ph=plot([0 1],[0 1]); - - title('Title') - ylabel('y') - xlabel('x') - - % add a new set of axes - % to make a gray grid - ah2=axes; - % make the background transparent - set(ah1,'color','none') - % move these axes to the back - set(gcf,'Child',flipud(get(gcf,'Children'))) -end -% ========================================================================= -function [stat] = logplot() - stat.description = 'Test logscaled axes.'; - stat.md5 = '25d66c6fdd92aeb32ddaff72d310e6f5'; - - x = logspace(-1,2); - loglog(x,exp(x),'-s') - grid on; -end -% ========================================================================= -function [stat] = colorbarLogplot() - stat.description = 'Logscaled colorbar.'; - stat.md5 = '8c99ef632b10a219daa1f09083d18bf5'; - - imagesc([1 10 100]); - try - set(colorbar(), 'YScale', 'log'); - catch - warning('M2TAcid:LogColorBar',... - 'Logarithmic Colorbars are not documented in MATLAB R2014b and Octave'); - stat.skip = true; - end -end -% ========================================================================= -function [stat] = legendplot() - stat.description = 'Test inserting of legends.'; - stat.md5 = 'a9e097172b3d79183b8ecbebeb4d8bed'; - -% x = -pi:pi/20:pi; -% plot(x,cos(x),'-ro',x,sin(x),'-.b'); -% h = legend('one pretty long legend cos_x','sin_x',2); -% set(h,'Interpreter','none'); - - x = 0:0.01:2*pi; - plot( x, sin(x), 'b', ... - x, cos(x), 'r' ); - xlim( [0 2*pi] ) - ylim( [-0.9 0.9] ) - title( '{tikz test}' ) - xlabel( '{x-Values}' ) - ylabel( '{y-Values}' ) - legend( 'sin(x)', 'cos(x)', 'Location','NorthOutside', ... - 'Orientation', 'Horizontal' ); - grid on; -end -% ========================================================================= -function [stat] = legendplotBoxoff () - stat.description = 'Test inserting of legends.'; - stat.md5 = '7b378300e46c789401e388cf7501ccd8'; - - x = -pi:pi/20:pi; - plot( x, cos(x),'-ro',... - x, sin(x),'-.b' ... - ); - h = legend( 'cos_x', 'one pretty long legend sin_x', 2 ); - set( h, 'Interpreter', 'none' ); - legend boxoff; -end -% ========================================================================= -function [stat] = moreLegends() - stat.description = 'More legends.'; - - x = 0:.1:7; - y1 = sin(x); - y2 = cos(x); - [ax,h1,h2] = plotyy(x,y1,x,y2); - legend([h1;h2],'Sine','Cosine'); -end -% ========================================================================= -function [stat] = zoom() - stat.description = 'Plain cosine function, zoomed in.'; - - fplot( @sin, [0,2*pi], '-*' ); - hold on; - delta = pi/10; - - plot( [pi/2, pi/2], [1-2*delta, 1+2*delta], 'r' ); % vertical line - plot( [pi/2-2*delta, pi/2+2*delta], [1, 1], 'g' ); % horizontal line - - % diamond - plot( [ pi/2-delta, pi/2 , pi/2+delta, pi/2 , pi/2-delta ], ... - [ 1 , 1-delta, 1, 1+delta, 1 ], 'y' ); - - % boundary lines with markers - plot([ pi/2-delta, pi/2 , pi/2+delta, pi/2+delta pi/2+delta, pi/2, pi/2-delta, pi/2-delta ], ... - [ 1-delta, 1-delta, 1-delta, 1, 1+delta, 1+delta, 1+delta, 1 ], ... - 'ok', ... - 'MarkerSize', 20, ... - 'MarkerFaceColor', 'g' ... - ); - - hold off; - - axis([pi/2-delta, pi/2+delta, 1-delta, 1+delta] ); -end -% ========================================================================= -function [stat] = bars() - stat.description = '2x2 Subplot with different bars'; - - % dataset grouped - bins = 10 * (-0.5:0.1:0.5); - numEntries = length(bins); - - alpha = [13 11 7]; - numBars = numel(alpha); - plotData = zeros(numEntries, numBars); - for iBar = 1:numBars - plotData(:,iBar) = abs(round(100*sin(alpha(iBar)*(1:numEntries)))); - end - - % dataset stacked - [data,dummy,dummy] = svd(magic(7)); %#ok - Y = round(abs(data(2:6,2:4))*10); - - subplot(2,2,1); - b1 = bar(bins,plotData,'grouped','BarWidth',1.5); - set(gca,'XLim',[1.25*min(bins) 1.25*max(bins)]); - - subplot(2,2,2); - barh(bins, plotData, 'grouped', 'BarWidth', 1.3); - - subplot(2,2,3); - bar(Y, 'stacked'); - - subplot(2,2,4); - b2= barh(Y,'stacked','BarWidth', 0.75); - - set(b1(1),'FaceColor','m','EdgeColor','none') - set(b2(1),'FaceColor','c','EdgeColor','none') - -end -% ========================================================================= -function [stat] = stemplot() - stat.description = 'A simple stem plot.' ; - - x = 0:25; - y = [exp(-.07*x).*cos(x); - exp(.05*x).*cos(x)]'; - h = stem(x, y); - legend( 'exp(-.07x)*cos(x)', 'exp(.05*x)*cos(x)', 'Location', 'NorthWest'); - set(h(1),'MarkerFaceColor','blue') - set(h(2),'MarkerFaceColor','red','Marker','square') -end -% ========================================================================= -function [stat] = stemplot2() - stat.description = 'Another simple stem plot.'; - - x = 0:25; - y = [exp(-.07*x).*cos(x); - exp(.05*x).*cos(x)]'; - h = stem(x, y, 'filled'); - legend( 'exp(-.07x)*cos(x)', 'exp(.05*x)*cos(x)', 'Location', 'NorthWest'); -end -% ========================================================================= -function [stat] = stairsplot() - stat.description = 'A simple stairs plot.' ; - - x = linspace(-2*pi,2*pi,40); - stairs(x,sin(x)) -end -% ========================================================================= -function [stat] = quiverplot() - stat.description = 'A combined quiver/contour plot of $x\exp(-x^2-y^2)$.' ; - - [X,Y] = meshgrid(-2:.2:2); - Z = X.*exp(-X.^2 - Y.^2); - [DX,DY] = gradient(Z,.2,.2); - contour(X,Y,Z); - hold on - quiver(X,Y,DX,DY); - colormap hsv; - hold off -end -% ========================================================================= -function [stat] = quiver3plot() - stat.description = 'Three-dimensional quiver plot.' ; - - vz = 10; % Velocity - a = -32; % Acceleration - - t = 0:.1:1; - z = vz*t + 1/2*a*t.^2; - - vx = 2; - x = vx*t; - vy = 3; - y = vy*t; - - u = gradient(x); - v = gradient(y); - w = gradient(z); - scale = 0; - quiver3(x,y,z,u,v,w,scale) - view([70 18]) -end -% ========================================================================= -function [stat] = quiveroverlap () - stat.description = 'Quiver plot with avoided overlap.'; - - x = [0 1]; - y = [0 0]; - u = [1 -1]; - v = [1 1]; - - quiver(x,y,u,v); -end -% ========================================================================= -function [stat] = polarplot () - stat.description = 'A simple polar plot.' ; - stat.extraOptions = {'showHiddenStrings',true}; - - t = 0:.01:2*pi; - polar(t,sin(2*t).*cos(2*t),'--r') -end -% ========================================================================= -function [stat] = roseplot () - stat.description = 'A simple rose plot.' ; - stat.extraOptions = {'showHiddenStrings',true}; - - theta = 2*pi*sin(linspace(0,8,100)); - rose(theta); -end -% ========================================================================= -function [stat] = compassplot () - stat.description = 'A simple compass plot.' ; - stat.extraOptions = {'showHiddenStrings',true}; - - Z = (1:20).*exp(1i*2*pi*cos(1:20)); - compass(Z); -end -% ========================================================================= -function [stat] = logicalImage() - stat.description = 'An image plot of logical matrix values.' ; - - [plotData,dummy,dummy] = svd(magic(10)); %#ok - imagesc(plotData > mean(plotData(:))); -end -% ========================================================================= -function [stat] = imagescplot() - stat.description = 'An imagesc plot of $\sin(x)\cos(y)$.'; - - pointsX = 10; - pointsY = 20; - x = 0:1/pointsX:1; - y = 0:1/pointsY:1; - z = sin(x)'*cos(y); - imagesc(x,y,z); -end -% ========================================================================= -function [stat] = imagescplot2() - stat.description = 'A trimmed imagesc plot.'; - - a=magic(10); - x=-5:1:4; - y=10:19; - imagesc(x,y,a) - - xlim([-3,2]) - ylim([12,15]) - - grid on; -end -% ========================================================================= -function [stat] = xAxisReversed () - stat.description = 'Reversed axes with legend.' ; - - n = 100; - x = (0:1/n:1); - y = exp(x); - plot(x,y); - set(gca,'XDir','reverse'); - set(gca,'YDir','reverse'); - legend( 'Location', 'SouthWest' ); -end -% ========================================================================= -function [stat] = subplot2x2b () - stat.description = 'Three aligned subplots on a $2\times 2$ subplot grid.' ; - - x = (1:5); - - subplot(2,2,1); - y = sin(x.^3); - plot(x,y); - - subplot(2,2,2); - y = cos(x.^3); - plot(x,y); - - subplot(2,2,3:4); - y = tan(x); - plot(x,y); -end -% ========================================================================= -function [stat] = manualAlignment() - stat.description = 'Manually aligned figures.'; - - xrange = linspace(-3,4,2*1024); - - axes('Position', [0.1 0.1 0.85 0.15]); - plot(xrange); - ylabel('$n$'); - xlabel('$x$'); - - axes('Position', [0.1 0.25 0.85 0.6]); - plot(xrange); - set(gca,'XTick',[]); -end -% ========================================================================= -function [stat] = subplotCustom () - stat.description = 'Three customized aligned subplots.' ; - - x = (1:5); - - y = cos(sqrt(x)); - subplot( 'Position', [0.05 0.1 0.3 0.3] ) - plot(x,y); - - y = sin(sqrt(x)); - subplot( 'Position', [0.35 0.5 0.3 0.3] ) - plot(x,y); - - y = tan(sqrt(x)); - subplot( 'Position', [0.65 0.1 0.3 0.3] ) - plot(x,y); -end -% ========================================================================= -function [stat] = errorBars () - stat.description = 'Generic error bar plot.'; - - plotData = 1:10; - [u,s,v] = svd(magic(11)); - - eH = abs(u(1:10,5)); - eL = abs(v(1:10,9)); - - errorbar(1:10, plotData, eL, eH, '.') -end -% ========================================================================= -function [stat] = errorBars2 () - stat.description = 'Another error bar example.'; - - data = load( 'myCount.dat' ); - y = mean( data, 2 ); - e = std( data, 1, 2 ); - errorbar( y, e, 'xr' ); -end -% ========================================================================= -function [stat] = legendsubplots() - stat.description = [ 'Subplots with legends. ' , ... - 'Increase value of "length" in the code to stress-test your TeX installation.' ]; - - % size of upper subplot - rows = 4; - % number of points. A large number here (eg 1000) will stress-test - % matlab2tikz and your TeX installation. Be prepared for it to run out of - % memory - length = 100; - - % generate some spurious data - t = 0:(4*pi)/length:4*pi; - x = t; - a = t; - y = sin(t) + 0.1*sin(134*t.^2); - b = sin(t) + 0.1*cos(134*t.^2) + 0.05*cos(2*t); - - % plot the top figure - subplot(rows+2,1,1:rows); - - % first line - sigma1 = std(y); - tracey = mean(y,1); - plot123 = plot(x,tracey,'b-'); - - hold on - - % second line - sigma2 = std(b); - traceb = mean(b,1); - plot456 = plot(a,traceb,'r-'); - - spec0 = ['Mean V(t)_A (\sigma \approx ' num2str(sigma1,'%0.4f') ')']; - spec1 = ['Mean V(t)_B (\sigma \approx ' num2str(sigma2,'%0.4f') ')']; - - hold off - %plot123(1:2) - legend([plot123; plot456],spec0,spec1) - legend boxoff - xlabel('Time/s') - ylabel('Voltage/V') - title('Time traces'); - - % now plot a differential trace - subplot(rows+2,1,rows+1:rows+2) - plot7 = plot(a,traceb-tracey,'k'); - - legend(plot7,'\Delta V(t)') - legend boxoff - xlabel('Time/s') - ylabel('\Delta V') - title('Differential time traces'); -end -% ========================================================================= -function [stat] = bodeplots() - stat.description = 'Bode plots with legends.'; - - if isempty(which('tf')) - fprintf( 'function "tf" not found. Skipping.\n\n' ); - stat.skip = true; - return - end - - Rc=1; - C=1.5e-6; %F - - % Set inductors - L1=4e-3; - L2=0.8e-3; - - % Resistances of inductors - R1=4; - R2=2; - - % Transfer functions - % Building transfer functions - s=tf('s'); - Zc=1/(s*C)+Rc; - Z1=s*L1+R1; - Z2=s*L2+R2; - LCLd=(Z2+Zc)/(Z1+Zc); - LCL=(s^2*C*L2+1)/(s^2*C*L1+1); - - t=logspace(3,5,1000); - bode(LCL,t) - hold on - bode(LCLd,t) - title('Voltage transfer function of a LCL filter') - set(findall(gcf,'type','line'),'linewidth',1.5) - grid on - - legend('Perfect LCL',' Real LCL','Location','SW') -end -% ========================================================================= -function [stat] = rlocusPlot() - stat.description = 'rlocus plot.'; - - if isempty(which('tf')) - fprintf( 'function "tf" not found. Skipping.\n\n' ); - stat.skip = true; - return - end - - s=tf('s'); - rlocus(tf([1 1],[4 3 1])) -end -% ========================================================================= -function [stat] = mandrillImage() - stat.description = 'Picture of a mandrill.'; - - if ~exist('mandrill.mat','file') - fprintf( 'mandrill data set not found. Skipping.\n\n' ); - stat.skip = true; - return - end - - data = load( 'mandrill' ); - image( data.X ) % show image - colormap( data.map ) % adapt colormap - axis image % pixels should be square - axis off % disable axis -end -% ========================================================================= -function [stat] = besselImage() - stat.description = 'Bessel function.'; - - nu = -5:0.25:5; - beta = 0:0.05:2.5; - - m = length(beta); - n = length(nu); - trace = zeros(m,n); - for i=1:length(beta); - for j=1:length(nu) - if (floor(nu(j))==nu(j)) - trace(i,j)=abs(besselj(nu(j),beta(i))); - end - end - end - - imagesc(nu,beta,trace); - colorbar() - xlabel('Order') - ylabel('\beta') - set(gca,'YDir','normal') -end -% ========================================================================= -function [stat] = clownImage() - stat.description = 'Picture of a clown.'; - - if ~exist('clown.mat','file') - fprintf( 'clown data set not found. Skipping.\n\n' ); - stat.skip = true; - return - end - - data = load( 'clown' ); - imagesc( data.X ) - colormap( gray ) -end -% ========================================================================= -function [stat] = zplanePlot1() - stat.description = 'Representation of the complex plane with zplane.'; - - % check of the signal processing toolbox is installed - if length(ver('signal')) ~= 1 - fprintf( 'Signal toolbox not found. Skip.\n\n' ); - stat.skip = true; - - return - end - - [z,p] = ellip(4,3,30,200/500); - zplane(z,p); - title('4th-Order Elliptic Lowpass Digital Filter'); -end -% ========================================================================= -function [stat] = zplanePlot2() - stat.description = 'Representation of the complex plane with zplane.'; - stat.closeall = true; - - % check of the signal processing toolbox is installed - if length(ver('signal')) ~= 1 - fprintf( 'Signal toolbox not found. Skip.\n\n' ); - stat.skip = true; - return - end - - [b,a] = ellip(4,3,30,200/500); - Hd = dfilt.df1(b,a); - zplane(Hd) % FIXME: This opens a new figure that doesn't get closed automatically -end -% ========================================================================= -function [stat] = freqResponsePlot() - stat.description = 'Frequency response plot.'; - stat.closeall = true; - stat.issues = [409]; - - % check of the signal processing toolbox is installed - if length(ver('signal')) ~= 1 - fprintf( 'Signal toolbox not found. Skip.\n\n' ); - stat.skip = true; - return - end - - b = fir1(80,0.5,kaiser(81,8)); - hd = dfilt.dffir(b); - freqz(hd); % FIXME: This opens a new figure that doesn't get closed automatically -end -% ========================================================================= -function [stat] = axesLocation() - stat.description = 'Swapped axis locations.'; - - plot(cos(1:10)); - set(gca,'XAxisLocation','top'); - set(gca,'YAxisLocation','right'); -end -% ========================================================================= -function [stat] = axesColors() - stat.description = 'Custom axes colors.'; - - plot(sin(1:15)); - set(gca,'XColor','g','YColor','b'); -% set(gca,'XColor','b','YColor','k'); - box off; -end -% ========================================================================= -function [stat] = multipleAxes() - stat.description = 'Multiple axes.'; - - x1 = 0:.1:40; - y1 = 4.*cos(x1)./(x1+2); - x2 = 1:.2:20; - y2 = x2.^2./x2.^3; - - line(x1,y1,'Color','r'); - ax1 = gca; - set(ax1,'XColor','r','YColor','r') - - ax2 = axes('Position',get(ax1,'Position'),... - 'XAxisLocation','top',... - 'YAxisLocation','right',... - 'Color','none',... - 'XColor','k','YColor','k'); - - line(x2,y2,'Color','k','Parent',ax2); - - xlimits = get(ax1,'XLim'); - ylimits = get(ax1,'YLim'); - xinc = (xlimits(2)-xlimits(1))/5; - yinc = (ylimits(2)-ylimits(1))/5; - - % Now set the tick mark locations. - set(ax1,'XTick',xlimits(1):xinc:xlimits(2) ,... - 'YTick',ylimits(1):yinc:ylimits(2) ) -end -% ========================================================================= -function [stat] = scatterPlotRandom() - stat.description = 'Generic scatter plot.'; - - n = 1:100; - scatter(n, n, 1000*(1+cos(n.^1.5)), n.^8); - colormap autumn; -end -% ========================================================================= -function [stat] = scatterPlot() - stat.description = 'Scatter plot with MATLAB(R) stat.'; - if ~exist('seamount.mat','file') - fprintf( 'seamount data set not found. Skipping.\n\n' ); - stat.skip = true; - return - end - - data = load( 'seamount' ); - scatter( data.x, data.y, 5, data.z, '^' ); -end -% ========================================================================= -function [stat] = scatterPlotMarkers() - stat.description = 'Scatter plot with with different marker sizes and legend.'; - - n = 1:10; - d = 10; - s = d^2 * n; - e = d * ones(size(n)); - grid on; - hold on; - - style = {'bx','rd','go','c.','m+','y*','bs','mv','k^','r<','g>','cp','bh'}; - names = {'bx','rd','go','c.','m plus','y star','bs','mv',... - 'k up triangle','r left triangle','g right triangle','cp','bh'}; - - nStyles = numel(style); - for ii = 1:nStyles - scatter(n, ii * e, s, style{ii}); - end - xlim([min(n)-1 max(n)+1]); - ylim([0 d*(nStyles+1)]); - set(gca,'XTick',n,'XTickLabel',s,'XTickLabelMode','manual'); - -end -% ========================================================================= -function [stat] = scatter3Plot() - stat.description = 'Scatter3 plot with MATLAB(R) stat.'; - - [x,y,z] = sphere(16); - X = [x(:)*.5 x(:)*.75 x(:)]; - Y = [y(:)*.5 y(:)*.75 y(:)]; - Z = [z(:)*.5 z(:)*.75 z(:)]; - S = repmat([1 .75 .5]*10,numel(x),1); - C = repmat([1 2 3],numel(x),1); - scatter3(X(:),Y(:),Z(:),S(:),C(:),'filled'), view(-60,60) - view(40,35) -end -% ========================================================================= -function [stat] = spherePlot() - stat.description = 'Plot a sphere.'; - - sphere(30); - title('a sphere: x^2+y^2+z^2'); - xlabel('x'); - ylabel('y'); - zlabel('z'); - axis equal; -end -% ========================================================================= -function [stat] = surfPlot() - stat.description = 'Surface plot.'; - - [X,Y,Z] = peaks(30); - surf(X,Y,Z) - colormap hsv - axis([-3 3 -3 3 -10 5]) - set(gca,'View',[-37.5,36]); - - hc = colorbar('YTickLabel', ... - {'Freezing','Cold','Cool','Neutral',... - 'Warm','Hot','Burning','Nuclear'}); - set(get(hc,'Xlabel'),'String','Multitude'); - set(get(hc,'Ylabel'),'String','Magnitude'); - set(hc,'YTick',0:0.7:7); - set(hc,'YTickLabel',... - {'-0.8' '-0.6' '-0.4' '-0.2' '0.0' ... - '0.2' '0.4' '0.6' '0.8' '0.10' '0.12'}); - - set(get(hc,'Title'),... - 'String', 'k(u,v)', ... - 'FontSize', 12, ... - 'interpreter', 'tex'); - - xlabel( 'x' ) - ylabel( 'y' ) - zlabel( 'z' ) -end -% ========================================================================= -function [stat] = surfPlot2() - stat.description = 'Another surface plot.'; - - z = [ ones(15, 5) zeros(15,5); - zeros(5, 5) zeros( 5,5)]; - - surf(abs(fftshift(fft2(z))) + 1); - set(gca,'ZScale','log'); - - legend( 'legendary', 'Location', 'NorthEastOutside' ); -end -% ========================================================================= -function [stat] = superkohle() - - if ~exist('initmesh') - fprintf( 'initmesh() not found. Skipping.\n\n' ); - stat.skip = true; - return; - end - - stat.description = 'Superkohle plot.'; - - x1=0; - x2=pi; - y1=0; - y2=pi; - omegashape = [2 2 2 2 % 2 = line segment; 1 = circle segment; 4 = elipse segment - x1 x2 x2 x1 % start point x - x2 x2 x1 x1 % end point x - y1 y1 y2 y2 % start point y - y1 y2 y2 y1 % end point y - 1 1 1 1 - 0 0 0 0]; - [xy,edges,tri] = initmesh(omegashape,'Hgrad',1.05); - mmin = 1; - while size(xy,2) < mmin - [xy,edges,tri] = refinemesh(omegashape,xy,edges,tri); - end - m = size(xy,2); - x = xy(1,:)'; - y = xy(2,:)'; - y0 = cos(x).*cos(y); - - pdesurf(xy,tri,y0(:,1)); - title('y_0'); - xlabel('x1 axis'); - ylabel('x2 axis'); - axis([0 pi 0 pi -1 1]); - grid on; -end -% ========================================================================= -function [stat] = meshPlot() - stat.description = 'Mesh plot.'; - - [X,Y,Z] = peaks(30); - mesh(X,Y,Z) - colormap hsv - axis([-3 3 -3 3 -10 5]) - - xlabel( 'x' ) - ylabel( 'y' ) - zlabel( 'z' ) -end -% ========================================================================= -function [stat] = ylabels() - stat.description = 'Separate y-labels.'; - - x = 0:.01:2*pi; - H = plotyy(x,sin(x),x,3*cos(x)); - - ylabel(H(1),'sin(x)'); - ylabel(H(2),'3cos(x)'); - - xlabel(gca,'time') -end -% ========================================================================= -function [stat] = spectro() - stat.description = 'Spectrogram plot'; - - % In the original test case, this is 0:0.001:2, but that takes forever - % for LaTeX to process. - if isempty(which('chirp')) - fprintf( 'chirp() not found. Skipping.\n\n' ); - stat.description = []; - stat.skip = true; - return - end - - T = 0:0.005:2; - X = chirp(T,100,1,200,'q'); - spectrogram(X,128,120,128,1E3); - title('Quadratic Chirp'); -end -% ========================================================================= -function [stat] = mixedBarLine() - stat.description = 'Mixed bar/line plot.'; - - [x,s,v] = svd(magic(33)); - x = x(end:-1:end-1000); - hist(x,10) - y = ylim; - hold on; - plot([mean(x) mean(x)], y, '-r'); - hold off; -end -% ========================================================================= -function [stat] = decayingharmonic() - stat.description = 'Decaying harmonic oscillation with \TeX{} title.'; - - % Based on an example from - % http://www.mathworks.com/help/techdoc/creating_plots/f0-4741.html#f0-28104 - A = 0.25; - alpha = 0.007; - beta = 0.17; - t = 0:901; - y = A * exp(-alpha*t) .* sin(beta*t); - plot(t, y) - title('{\itAe}^{-\alpha\itt}sin\beta{\itt}, \alpha<<\beta, \beta>>\alpha, \alpha<\beta, \beta>\alpha') - xlabel('Time \musec.') - ylabel('Amplitude') -end -% ========================================================================= -function [stat] = texcolor() - stat.description = 'Multi-colored text using \TeX{} commands.'; - - % Taken from an example at - % http://www.mathworks.com/help/techdoc/creating_plots/f0-4741.html#f0-28104 - text(.1, .5, ['\fontsize{16}black {\color{magenta}magenta '... - '\color[rgb]{0 .5 .5}teal \color{red}red} black again']) -end -% ========================================================================= -function [stat] = textext() - stat.description = 'Formatted text and special characters using \TeX{}.'; - - % Taken from an example at - % http://www.mathworks.com/help/techdoc/creating_plots/f0-4741.html#f0-28303 - txstr(1) = { 'Each cell is a quoted string' }; - txstr(2) = { 'You can specify how the string is aligned' }; - txstr(3) = { 'You can use LaTeX symbols like \pi \chi \Xi' }; - txstr(4) = { '\bfOr use bold \rm\itor italic font\rm' }; - txstr(5) = { '\fontname{courier}Or even change fonts' }; - plot( 0:6, sin(0:6) ) - text( 5.75, sin(2.5), txstr, 'HorizontalAlignment', 'right' ) -end -% ========================================================================= -function [stat] = texrandom() - stat.description = 'Random TeX symbols'; - - try - rng(42); %fix seed - %TODO: fully test tex conversion instead of a random subsample! - catch - warning('testfuncs:texrandom','Cannot fix seed for random generator!'); - end - - num = 20; % number of symbols per line - symbols = {'\it', '\bf', '\rm', '\sl', ... - '\alpha', '\angle', '\ast', '\beta', '\gamma', '\delta', ... - '\epsilon', '\zeta', '\eta', '\theta', '\vartheta', ... - '\iota', '\kappa', '\lambda', '\mu', '\nu', '\xi', '\pi', ... - '\rho', '\sigma', '\varsigma', '\tau', '\equiv', '\Im', ... - '\otimes', '\cap', '{\int}', '\rfloor', '\lfloor', '\perp',... - '\wedge', '\rceil', '\vee', '\langle', '\upsilon', '\phi', ... - '\chi', '\psi', '\omega', '\Gamma', '\Delta', '\Theta', ... - '\Lambda', '\Xi', '\Pi', '\Sigma', '\Upsilon', '\Phi', ... - '\Psi', '\Omega', '\forall', '\exists', '\ni', '{\cong}', ... - '\approx', '\Re', '\oplus', '\cup', '\subseteq', '\lceil', ... - '\cdot', '\neg', '\times', '\surd', '\varpi', '\rangle', ... - '\sim', '\leq', '\infty', '\clubsuit', '\diamondsuit', ... - '\heartsuit', '\spadesuit', '\leftrightarrow', ... - '\leftarrow', '\Leftarrow', '\uparrow', '\rightarrow', ... - '\Rightarrow', '\downarrow', '\circ', '\pm', '\geq', ... - '\propto', '\partial', '\bullet', '\div', '\neq', ... - '\aleph', '\wp', '\oslash', '\supseteq', '\nabla', ... - '{\ldots}', '\prime', '\0', '\mid', '\copyright', ... - '\o', '\in', '\subset', '\supset', ... - '\_', '\^', '\{', '\}', '$', '%', '#', ... - '(', ')', '+', '-', '=', '/', ',', '.', '<', '>', ... - '!', '?', ':', ';', '*', '[', ']', '§', '"', '''', ... - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ... - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', ... - 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', ... - 'w', 'x', 'y', 'z', ... - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', ... - 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', ... - 'W', 'X', 'Y', 'Z' ... - }; - % Note: Instead of '\ldots' the list of symbols contains the entry - % '{\ldots}'. This is because TeX gives an error if it - % encounters the sequence '$a_\ldots$' or '$a^\ldots$'. It - % looks like that is a TeX bug. Nevertheless this sequence - % could appear in the random output, therefore \ldots is - % wrapped in braces since '$a_{\ldots}$' and '$a^{\ldots}$' - % don't crash TeX. - % Same thing with '\cong' and '\int'. - % \color{red} etc. isn't included - % \fontname{Times} etc. isn't included - % \fontsize{12} etc. isn't included - - switch getEnvironment() - case 'MATLAB' - % MATLAB expects tilde and ampersand to be un-escaped and backslashes - % to be escaped - symbols = [ symbols, {'~', '&', '\\'} ]; - case 'Octave' - % Octave expects tilde and ampersand to be escaped for regular - % output. If either are used un-escaped, that creates odd output in - % Octave itself, but since matlab2tikz should be able to handle - % those cases, let's include the un-escaped symbols in the list. - symbols = [ symbols, {'\~', '\&', '~', '&'} ]; - % Octave's backslash handling is weird to say the least. However, - % matlab2tikz treats backslashes the same in Octave as it does in - % MATLAB. Therefore, let's add an escaped backslash to the list - symbols = [ symbols, {'\\'} ]; - otherwise - error( 'Unknown environment. Need MATLAB(R) or Octave.' ) - end - - for ypos = [0.9:-.2:.1] - % Generate `num' random indices to the list of symbols - index = max(ceil(rand(1, num)*length(symbols)), 1); - % Assemble symbols into one cell string array - string = symbols(index); - - % Add random amount of balanced braces in random positions to `string'. - % By potentially generating more than one set of braces randomly, it's - % possible to create more complex patterns of nested braces. Increase - % `braceprob' to get more braces, but don't use values greater than or - % equal 1 which would result in an infinite loop. - braceprob = 0.6; - while rand(1,1) < braceprob - % Generate two random numbers ranging from 1 to n with n = number - % of symbols in `string' - bracepos = max(ceil(rand(1, 2)*length(string)), 1); - % Modify `string' so that an opening brace is inserted before - % min(bracepos) symbols and a closing brace after max(bracepos) - % symbols. That way any number of symbols from one to all in - % `string' are wrapped in braces for min(bracepos) == max(bracepos) - % and min(bracepos) == 1 && max(bracepos) == length(string), - % respectively. - string = [string(1:min(bracepos)-1), {'{'}, ... - string(min(bracepos):max(bracepos)), ... - {'}'}, string(max(bracepos)+1:end) ]; - end - % Clean up: remove '{}', '{{}}', etc. - clean = false; - while clean == false - clean = true; - for i = 1:length(string)-1 - if strcmp( string(i), '{' ) && strcmp( string(i+1), '}' ) - string = [string(1:i-1), string(i+2:end)]; - clean = false; - break - end - end - end - - % Subscripts '_' and superscripts '^' in TeX are tricky in that certain - % combinations are not allowed and there are some subtleties in regard - % to more complicated combinations of sub/superscripts: - % - ^a or _a at the beginning of a TeX math expression is permitted. - % - a^ or a_ at the end of a TeX math expression is not. - % - a__b, a_^b, a^_b, or a^^b is not allowed, as is any number of - % consecutive sub/superscript operators. Actually a^^b does not - % crash TeX, but it produces seemingly random output instead of `b', - % therefore it should be avoided, too. - % - a^b^c or a_b_c is not allowed as it results in a "double subscript/ - % superscript" error. - % - a^b_c or a_b^c, however, does work. - % - a^bc^d or a_bc_d also works. - % - a^b_c^d or a_b^c_d is not allowed and results in a "double - % subscript/superscript" error. - % - a{_}b, a{^}b, {a_}b or {a^}b is not permitted. - % - a{_b} or a{^b} is valid TeX code. - % - {a_b}_c produces the same output as a_{bc}. Likewise for '^'. - % - a_{b_c} results in "a index b sub-index c". Likewise for '^'. - % - a^{b}^c or a_{b}_c is not allowed as it results in a "double - % subscript/superscript" error. - % - % From this we can derive a number of rules: - % 1) The last symbol in a TeX string must not be '^' or '_'. - % 2a) There must be at least one non-brace symbol between any '^' and '_'. - % 2b) There must be at least one non-brace symbol between any '_' and '^'. - % 3a) There must either be at least two non-brace, non-'_' symbols or at - % least one non-brace, non-'_' symbol and one brace (opening or - % closing) between any two '^'. - % 3b) There must either be at least two non-brace, non-'^' symbols or at - % least one brace (opening or closing) between any two '_'. - % 4) '^' or '_' must not appear directly before '}'. - % 5) '^' or '_' must not appear directly after '}'. - % 6) Whenever braces were mentioned, that refers to non-empty braces, - % i.e. '{}' counts as nothing. Printable/escaped braces '\{' and '\}' - % also don't count as braces but as regular symbols. - % 7) '^' or '_' must not appear directly before '\it', '\bf', '\rm', or - % '\sl'. - % 8) '^' or '_' must not appear directly after '\it', '\bf', '\rm', or - % '\sl'. - % - % A few test cases: - % Permitted: ^a... _a... a^b_c a_b^c a^bc^d a_bc_d a{_b} a{^b} - % {a_b}_c a_{bc} {a^b}^c a^{bc} a_{b_c} a^{b^c} - % Forbidden: ...z^ ...z_ a__b a_^b a^_b [a^^b] a^b^c a_b_c - % a^b_c^d a_b^c_d a{_}b a{^}b {a_}b {a^}b - % a^{_b} a_{^b} a^{b}^c a_{b}_c - % - % Now add sub/superscripts according to these rules - subsupprob = 0.1; % Probability for insertion of a sub/superscript - caretdist = Inf; % Distance to the last caret - underscdist = Inf; % Distance to the last underscore - bracedist = Inf; % Distance to the last brace (opening or closing) - pos = 0; - % Making sure the post-update `pos' in the while loop is less than the - % number of symbols in `string' enforces rule 1: The last symbol in - % a TeX string must not be '^' or '_'. - while pos+1 < length(string) - % Move one symbol further - pos = pos + 1; - % Enforce rule 7: No sub/superscript directly before '\it', '\bf', - % '\rm', or '\sl'. - if strcmp( string(pos), '\it' ) || strcmp( string(pos), '\bf' ) ... - || strcmp( string(pos), '\rm' ) || strcmp( string(pos), '\sl' ) - continue - end - % Enforce rule 8: No sub/superscript directly after '\it', '\bf', - % '\rm', or '\sl'. - if (pos > 1) ... - && ( strcmp( string(pos-1), '\it' ) ... - || strcmp( string(pos-1), '\bf' ) ... - || strcmp( string(pos-1), '\rm' ) ... - || strcmp( string(pos-1), '\sl' ) ... - ) - continue - end - bracedist = bracedist + 1; - % Enforce rule 4: No sub/superscript directly before '}' - if strcmp( string(pos), '}' ) - bracedist = 0; % Also update braces distance - continue - end - % Enforce rule 5: No sub/superscript directly after '}' - if (pos > 1) && strcmp( string(pos-1), '}' ) - continue - end - % Update distances for either braces or caret/underscore depending - % on whether the symbol currently under scrutiny is a brace or not. - if strcmp( string(pos), '{' ) - bracedist = 0; - else - caretdist = caretdist + 1; - underscdist = underscdist + 1; - end - % Generate two random numbers, then check if any of them is low - % enough, so that with probability `subsupprob' a sub/superscript - % operator is inserted into `string' at the current position. In - % case both random numbers are below the threshold, whether a - % subscript or superscript operator is to be inserted depends on - % which of the two numbers is smaller. - randomnums = rand(1, 2); - if min(randomnums) < subsupprob - if randomnums(1) < randomnums(2) - % Enforce rule 2b: There must be at least one non-brace - % symbol between previous '_' and to-be-inserted '^'. - if underscdist < 1 - continue - end - % Enforce rule 3a: There must either be at least two - % non-brace, non-'_' symbols or at least one brace (opening - % or closing) between any two '^'. - if ~( ((caretdist >= 2) && (underscdist >= 2)) ... - || ((bracedist < 2) && (caretdist >= 2)) ) - continue - end - % Insert '^' before `pos'th symbol in `string' now that - % we've made sure all rules are honored. - string = [ string(1:pos-1), {'^'}, string(pos:end) ]; - caretdist = 0; - pos = pos + 1; - else - % Enforce rule 2a: There must be at least one non-brace - % symbol between previous '^' and to-be-inserted '_'. - if caretdist < 1 - continue - end - % Enforce rule 3b: There must either be at least two - % non-brace, non-'^' symbols or at least one brace (opening - % or closing) between any two '_'. - if ~( ((caretdist >= 2) && (underscdist >= 2)) ... - || ((bracedist < 2) && (underscdist >= 2)) ) - continue - end - % Insert '_' before `pos'th symbol in `string' now that - % we've made sure all rules are honored. - string = [ string(1:pos-1), {'_'}, string(pos:end) ]; - underscdist = 0; - pos = pos + 1; - end - end - end % while pos+1 < length(string) - - % Now convert the cell string array of symbols into one regular string - string = [string{:}]; - % Print the string in the figure to be converted by matlab2tikz - text( .05, ypos, string, 'interpreter', 'tex' ) - % And print it to the console, too, in order to enable analysis of - % failed tests - fprintf( 'Original string: %s\n', string ) - end - - title('Random TeX symbols \\\{\}\_\^$%#&') -end -% ========================================================================= -function [stat] = latexmath1() - stat.description = 'A formula typeset using the \LaTeX{} interpreter.'; - - % Adapted from an example at - % http://www.mathworks.com/help/techdoc/ref/text_props.html#Interpreter - axes - title( '\omega\subseteq\Omega' ); - text( 0.5, 0.5, '$$\int_0^x\!\int_{\Omega} dF(u,v) d\omega$$', ... - 'Interpreter', 'latex', ... - 'FontSize', 16 ) -end -% ========================================================================= -function [stat] = latexmath2() - stat.description = 'Some nice-looking formulas typeset using the \LaTeX{} interpreter.'; - - % Adapted from an example at - % http://www.mathworks.com/help/techdoc/creating_plots/f0-4741.html#bq558_t - set(gcf, 'color', 'white') - set(gcf, 'units', 'inches') - set(gcf, 'position', [2 2 4 6.5]) - set(gca, 'visible', 'off') - - % Note: Most likely due to a bug in matlab2tikz the pgfplots output will - % appear empty even though the LaTeX strings are contained in the - % output file. This is because the following (or something like it) - % is missing from the axis environment properties: - % xmin=0, xmax=4, ymin=-1, ymax=6 - % Note: The matrices in h(1) and h(2) cannot be compiled inside pgfplots. - % They are therefore disabled. -% h(1) = text( 'units', 'inch', 'position', [.2 5], ... -% 'fontsize', 14, 'interpreter', 'latex', 'string', ... -% [ '$$\hbox {magic(3) is } \left( {\matrix{ 8 & 1 & 6 \cr' ... -% '3 & 5 & 7 \cr 4 & 9 & 2 } } \right)$$' ]); -% h(2) = text( 'units', 'inch', 'position', [.2 4], ... -% 'fontsize', 14, 'interpreter', 'latex', 'string', ... -% [ '$$\left[ {\matrix{\cos(\phi) & -\sin(\phi) \cr' ... -% '\sin(\phi) & \cos(\phi) \cr}} \right]' ... -% '\left[ \matrix{x \cr y} \right]$$' ]); - h(3) = text( 'units', 'inch', 'position', [.2 3], ... - 'fontsize', 14, 'interpreter', 'latex', 'string', ... - [ '$$L\{f(t)\} \equiv F(s) = \int_0^\infty\!\!{e^{-st}' ... - 'f(t)dt}$$' ]); - h(4) = text( 'units', 'inch', 'position', [.2 2], ... - 'fontsize', 14, 'interpreter', 'latex', 'string', ... - '$$e = \sum_{k=0}^\infty {1 \over {k!} } $$' ); - h(5) = text( 'units', 'inch', 'position', [.2 1], ... - 'fontsize', 14, 'interpreter', 'latex', 'string', ... - [ '$$m \ddot y = -m g + C_D \cdot {1 \over 2}' ... - '\rho {\dot y}^2 \cdot A$$' ]); - h(6) = text( 'units', 'inch', 'position', [.2 0], ... - 'fontsize', 14, 'interpreter', 'latex', 'string', ... - '$$\int_{0}^{\infty} x^2 e^{-x^2} dx = \frac{\sqrt{\pi}}{4}$$' ); - - % TODO: On processing the matlab2tikz_acidtest output, LaTeX complains - % about the use of \over: - % Package amsmath Warning: Foreign command \over; - % (amsmath) \frac or \genfrac should be used instead -end -% ========================================================================= -function [stat] = parameterCurve3d() - stat.description = 'Parameter curve in 3D.'; - - ezplot3('sin(t)','cos(t)','t',[0,6*pi]); - text(0.5, 0.5, 10, 'abs'); -end -% ========================================================================= -function [stat] = parameterSurf() - stat.description = 'Parameter and surface plot.'; - - if ~exist('TriScatteredInterp') - fprintf( 'TriScatteredInterp() not found. Skipping.\n\n' ); - stat.skip = true; - return; - end - - t = (1:100).'; - t1 = cos(5.75352*t).^2; - t2 = abs(sin(t)); - - x = t1*4 - 2; - y = t2*4 - 2; - z = x.*exp(-x.^2 - y.^2); - - %TODO: do we really need this TriScatteredInterp? - % It will be removed from MATLAB - - % Construct the interpolant - F = TriScatteredInterp(x,y,z,'linear'); - - % Evaluate the interpolant at the locations (qx, qy), qz - % is the corresponding value at these locations. - ti = -2:.25:2; - [qx,qy] = meshgrid(ti,ti); - qz = F(qx,qy); - - hold on - surf(qx,qy,qz) - plot3(x,y,z,'o') - view(gca,[-69 14]); - hold off -end -% ========================================================================= -function [stat] = fill3plot() - stat.description = 'fill3 plot.'; - - if ~exist('fill3','builtin') - fprintf( 'fill3() not found. Skipping.\n\n' ); - stat.skip = true; - return - end - - x1 = -10:0.1:10; - x2 = -10:0.1:10; - p = sin(x1); - d = zeros(1,numel(p)); - d(2:2:end) = 1; - h = p.*d; - grid on; - fill3(x1,x2,h,'k'); - view(45,22.5); - box on; -end -% ========================================================================= -function [stat] = rectanglePlot() - stat.description = 'Rectangle handle.'; - - rectangle('Position', [0.59,0.35,3.75,1.37],... - 'Curvature', [0.8,0.4],... - 'LineWidth', 2, ... - 'LineStyle', '--' ... - ); - daspect([1,1,1]); -end -% ========================================================================= -function [stat] = herrorbarPlot() - stat.description = 'herrorbar plot.'; - - hold on; - X = 1:10; - Y = 1:10; - err = repmat(0.2, 1, 10); - h1 = errorbar(X, Y, err, 'r'); - h_vec = herrorbar(X, Y, err); - for h=h_vec - set(h, 'color', [1 0 0]); - end - h2 = errorbar(X, Y+1, err, 'g'); - h_vec = herrorbar(X, Y+1, err); - for h=h_vec - set(h, 'color', [0 1 0]); - end - legend([h1 h2], {'test1', 'test2'}) -end -% ========================================================================= -function [stat] = hist3d() - stat.description = '3D histogram plot.'; - - if ~exist('hist3','builtin') && isempty(which('hist3')) - fprintf( 'Statistics toolbox not found. Skipping.\n\n' ); - stat.skip = true; - return - end - -% load carbig -% X = [MPG,Weight]; -% hist3(X,[7 7]); -% xlabel('MPG'); ylabel('Weight'); -% set(get(gca,'child'),'FaceColor','interp','CDataMode','auto'); - - load carbig - X = [MPG,Weight]; - hist3(X,[7 7]); - xlabel('MPG'); ylabel('Weight'); - hist3(X,[7 7],'FaceAlpha',.65); - xlabel('MPG'); ylabel('Weight'); - % Linux crashed with OpenGL. - %%set(gcf,'renderer','opengl'); - -% load seamount -% dat = [-y,x]; % Grid corrected for negative y-values -% n = hist3(dat); % Extract histogram data; -% % default to 10x10 bins -% view([-37.5, 30]); -end -% ========================================================================= -function [stat] = myBoxplot() - stat.description = 'Boxplot.'; - - if ~exist('boxplot','builtin') && isempty(which('boxplot')) - fprintf( 'Statistics toolbox not found. Skipping.\n\n' ); - stat.skip = true; - return - end - - errors =[ - 0.810000 3.200000 0.059500 - 0.762500 -3.200000 0.455500 - 0.762500 4.000000 0.901000 - 0.762500 3.600000 0.406000 - 0.192500 3.600000 0.307000 - 0.810000 -3.600000 0.604000 - 1.000000 -2.400000 0.505000 - 0.430000 -2.400000 0.455500 - 1.000000 3.200000 0.158500 - ]; - - boxplot(errors); -end -% ========================================================================= -function [stat] = areaPlot() - stat.description = 'Area plot.'; - - M = magic(5); - M = M(1:3,2:4); - area(1:3, M); - legend('foo', 'bar', 'foobar'); -end -% ========================================================================= -function [stat] = customLegend() - stat.description = 'Custom legend.'; - - x = -pi:pi/10:pi; - y = tan(sin(x)) - sin(tan(x)); - plot(x,y,'--rs'); - - lh=legend('y',4); - set(lh,'color','g') - set(lh,'edgecolor','r') - set(lh, 'position',[.5 .6 .1 .05]) -end -% ========================================================================= -function [stat] = pixelLegend() - stat.description = 'Legend with pixel position.'; - - x = linspace(0,1); - plot(x, [x;x.^2]); - set(gca, 'units', 'pixels') - lh=legend('1', '2'); - set(lh, 'units','pixels','position', [100 200 65 42]) -end -% ========================================================================= -function [stat] = croppedImage() - stat.description = 'Custom legend.'; - - if ~exist('flujet.mat','file') - fprintf( 'flujet data set not found. Skipping.\n\n' ); - stat.skip = true; - return; - end - - load('flujet','X','map'); - image(X) - colormap(map) - %axis off - axis image - xlim([50 200]) - ylim([50 200]) - % colorbar at top - colorbar('north'); - set(gca,'Units','normalized'); -end -% ========================================================================= -function [stat] = pColorPlot() - stat.description = 'pcolor() plot.'; - - n = 6; - r = (0:n)'/n; - theta = pi*(-n:n)/n; - X = r*cos(theta); - Y = r*sin(theta); - C = r*cos(2*theta); - pcolor(X,Y,C) - axis equal tight -end -% ========================================================================= -function [stat] = multiplePatches() - stat.description = 'Multiple patches.'; - - xdata = [2 2 0 2 5; - 2 8 2 4 5; - 8 8 2 4 8]; - ydata = [4 4 4 2 0; - 8 4 6 2 2; - 4 0 4 0 0]; - cdata = [15 0 4 6 10; - 1 2 5 7 9; - 2 3 0 8 3]; - p = patch(xdata,ydata,cdata,'Marker','o',... - 'MarkerFaceColor','flat',... - 'FaceColor','none'); -end -% ========================================================================= -function [stat] = hgTransformPlot() - stat.description = 'hgtransform() plot.'; - - % Check out - % http://www.mathworks.de/de/help/matlab/ref/hgtransform.html. - - ax = axes('XLim',[-2 1],'YLim',[-2 1],'ZLim',[-1 1]); - view(3); - grid on; - axis equal; - - [x y z] = cylinder([.2 0]); - h(1) = surface(x,y,z,'FaceColor','red'); - h(2) = surface(x,y,-z,'FaceColor','green'); - h(3) = surface(z,x,y,'FaceColor','blue'); - h(4) = surface(-z,x,y,'FaceColor','cyan'); - h(5) = surface(y,z,x,'FaceColor','magenta'); - h(6) = surface(y,-z,x,'FaceColor','yellow'); - - t1 = hgtransform('Parent',ax); - t2 = hgtransform('Parent',ax); - - set(h,'Parent',t1); - h2 = copyobj(h,t2); - - Txy = makehgtform('translate',[-1.5 -1.5 0]); - set(t2,'Matrix',Txy) - drawnow -end -% ========================================================================= -function [stat] = logbaseline() - stat.description = 'Logplot with modified baseline.'; - - bar([0 1 2], [1 1e-2 1e-5],'basevalue', 1e-6); - set(gca,'YScale','log'); -end -% ========================================================================= -function [stat] = alphaImage() - stat.description = 'Image with alpha channel.'; - - N = 20; - h_imsc = imagesc(repmat(1:N, N, 1)); - mask = zeros(N); - mask(N/4:3*N/4, N/4:3*N/4) = 1; - set(h_imsc, 'AlphaData', double(~mask)); - set(h_imsc, 'AlphaDataMapping', 'scaled'); - set(gca, 'ALim', [-1,1]); -end -% ========================================================================= -function [stat] = annotation1() - - stat.description = 'Annotations only'; - - if ~exist('annotation') - fprintf( 'annotation() not found. Skipping.\n\n' ); - stat.skip = true; - return; - end - - annotation(gcf,'arrow',[0.192857142857143 0.55],... - [0.729952380952381 0.433333333333333]); - - annotation(gcf,'ellipse',... - [0.538499999999999 0.240476190476191 0.157928571428572 0.2452380952381]); - - annotation(gcf,'textbox',... - [0.3 0.348251748251748 0.0328486806677437 0.0517482517482517],... - 'String',{'y-x'},... - 'FontSize',16); -end -% ========================================================================= -function [stat] = annotation2() - stat.description = 'Annotations over plot'; - - if ~exist('annotation') - fprintf( 'annotation() not found. Skipping.\n\n' ); - stat.skip = true; - return; - end - - axes1 = axes('Parent',gcf); - hold(axes1,'all'); - - plot(0:pi/20:2*pi,sin(0:pi/20:2*pi)) - - annotation(gcf,'arrow',[0.192857142857143 0.55],... - [0.729952380952381 0.433333333333333]); - - annotation(gcf,'ellipse',... - [0.538499999999999 0.240476190476191 0.157928571428572 0.2452380952381]); - - annotation(gcf,'textbox',... - [0.3 0.348251748251748 0.0328486806677437 0.0517482517482517],... - 'String',{'y-x'},... - 'FontSize',16,... - 'FitBoxToText','off',... - 'LineStyle','none'); -end -% ========================================================================= -function [stat] = annotation3() - stat.description = 'Annotated and unaligned subplots'; - - if ~exist('annotation') - fprintf( 'annotation() not found. Skipping.\n\n' ); - stat.skip = true; - return; - end - - X1 = 0:0.01:1; - Y1 = X1.^2; - Y2 = Y1.^2; - Y3 = X1.^(1/4); - - set(gcf, 'Position', [100 100 1500 600]); - - axes1 = axes('Parent',gcf, 'Position',[0.07 0.4015 0.2488 0.5146]); - box(axes1,'on'); - hold(axes1,'all'); - - title('f(x)=x^2'); - - plot(X1,Y1,'Parent',axes1, 'DisplayName','(0:0.05:1).^2 vs 0:0.05:1'); - - axes2 = axes('Parent',gcf, 'OuterPosition',[0.4062 0 0.2765 0.6314]); - box(axes2,'on'); - hold(axes2,'all'); - - plot(X1,Y2,'Parent',axes2,'DisplayName','(0:0.05:1).^4 vs 0:0.05:1'); - - axes3 = axes('Parent',gcf, 'Position',[0.7421 0.3185 0.21 0.5480]); - box(axes3,'on'); - hold(axes3,'all'); - - plot(X1,Y3,'Parent',axes3,'DisplayName','(0:0.05:1).^(1/4) vs 0:0.05:1'); - - annotation(gcf,'textbox',[0.3667 0.5521 0.0124 0.0393], ... - 'String',{'f^2'}, 'FitBoxToText','off'); - - annotation(gcf,'arrow',[0.3263 0.4281], [0.6606 0.3519]); - - annotation(gcf,'textarrow',[0.6766 0.7229], [0.3108 0.6333],... - 'TextEdgeColor','none', 'HorizontalAlignment','center', ... - 'String',{'invert'}); -end -% ========================================================================= -function [stat] = annotationText() - stat.description = 'Variations of textual annotations'; - - if ~exist('annotation') - fprintf( 'annotation() not found. Skipping.\n\n' ); - stat.skip = true; - return; - end - - X1 = -5:0.1:5; - Y1 = log(X1.^2+1); - - % Resize figure to fit all text inside - set(gcf,'Position', [100 100 1000 700]); - - % Otherwise the axes is plotted wrongly - drawnow(); - - % Create axes - axes1 = axes('Parent',gcf); - hold(axes1,'all'); - - % Create plot - plot(X1,Y1); - - % Create text - text('Parent',axes1,'String',' \leftarrow some point on the curve',... - 'Position',[-2.01811125485123 1.5988219895288 7.105427357601e-15]); - - % Create text - text('Parent',axes1,'String','another point \rightarrow',... - 'Position',[1 0.693147180559945 0],... - 'HorizontalAlignment','right'); - - % Create textbox - annotation(gcf,'textbox',... - [0.305611222444885 0.292803442287824 0.122244488977956 0.0942562592047128],... - 'String',{'This boxes size','should adjust to','the text size'}); - - % Create textbox - annotation(gcf,'textbox',... - [0.71643086172344 0.195876288659794 0.10020240480962 0.209240982129118],... - 'String',{'Multiple Lines due to fixed width'},... - 'FitBoxToText','off'); - - % Create textbox - annotation(gcf,'textbox',... - [0.729456913827655 0.608247422680412 0.0851723446893787 0.104257797902974],... - 'String',{'Overlapping','and italic'},... - 'FontAngle','italic',... - 'FitBoxToText','off',... - 'BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); - - % Create textbox - annotation(gcf,'textbox',... - [0.420000437011093 0.680170575692964 0.155149863590109 0.192171438527209],... - 'VerticalAlignment','middle',... - 'String',{'Text with a','thick and','dotted','border'},... - 'HorizontalAlignment','center',... - 'FitBoxToText','off',... - 'LineStyle',':',... - 'LineWidth',4); - - % Create textarrow - annotation(gcf,'textarrow',[0.21943887775551 0.2625250501002],... - [0.371002132196162 0.235640648011782],'TextEdgeColor','none',... - 'TextBackgroundColor',[0.678431391716003 0.921568632125854 1],... - 'TextRotation',30,... - 'VerticalAlignment','bottom',... - 'HorizontalAlignment','center',... - 'String',{'Rotated Text'}); - - % Create textarrow - annotation(gcf,'textarrow',[0.238436873747493 0.309619238476953],... - [0.604315828808828 0.524300441826215],'TextEdgeColor','none',... - 'TextColor',[1 1 1],... - 'TextBackgroundColor',[0 0 1],... - 'TextRotation',30,... - 'VerticalAlignment','bottom',... - 'HorizontalAlignment','center',... - 'String',{'Rotated Text 2'},... - 'HeadStyle','diamond',... - 'Color',[1 0 0]); -end -% ========================================================================= -function [stat] = annotationTextUnits() - stat.description = 'Text with changed Units'; - - if ~exist('annotation') - fprintf( 'annotation() not found. Skipping.\n\n' ); - stat.skip = true; - return; - end - - X1 = -5:0.1:5; - Y1 = log(X1.^2+1); - - % Resize figure to fit all text inside - set(gcf,'Units', 'inches'); - set(gcf,'Position', [1.03125, 1.03125, 10.416666666666666, 7.291666666666666 ]); - - % Otherwise the axes is plotted wrongly - drawnow(); - - % Create axes - axes1 = axes('Parent',gcf,'Units','centimeters',... - 'Position',[3.4369697916666664, 2.035743645833333 20.489627604166664 15.083009739583332]); - hold(axes1,'all'); - - % Create plot - plot(X1,Y1); - - % Create text - text('Parent',axes1,'Units','normalized',... - 'String',' \leftarrow some point on the curve',... - 'Position',[0.295865633074935 0.457364341085271 0]); - - % Create text - text('Parent',axes1,'Units','centimeters',... - 'String','another point \rightarrow',... - 'Position',[12.2673383333333 2.98751989583333 0],... - 'HorizontalAlignment','right'); - - % Create textbox - annotation(gcf,'textbox',... - [0.305611222444885 0.292803442287824 0.122244488977956 0.0942562592047128],... - 'String',{'This boxes size','should adjust to','the text size'},... - 'FitBoxToText','off',... - 'Units','pixels'); - - - % Create textarrow - annotation(gcf,'textarrow',[0.21943887775551 0.2625250501002],... - [0.371002132196162 0.235640648011782],'TextEdgeColor','none',... - 'TextBackgroundColor',[0.678431391716003 0.921568632125854 1],... - 'TextRotation',30,... - 'HorizontalAlignment','center',... - 'String',{'Rotated Text'},... - 'Units','points'); - - % Create textarrow - annotation(gcf,'textarrow',[0.238436873747493 0.309619238476953],... - [0.604315828808828 0.524300441826215],'TextEdgeColor','none',... - 'TextColor',[1 1 1],... - 'TextBackgroundColor',[0 0 1],... - 'TextRotation',30,... - 'HorizontalAlignment','center',... - 'String',{'Rotated Text 2'},... - 'HeadStyle','diamond',... - 'Color',[1 0 0]); - - % Create textbox - annotation(gcf,'textbox',... - [0.71643086172344 0.195876288659794 0.10020240480962 0.209240982129118],... - 'String',{'Multiple Lines due to fixed width'},... - 'FitBoxToText','off',... - 'Units','characters'); - - % Create textbox - annotation(gcf,'textbox',... - [0.420000437011093 0.680170575692964 0.155149863590109 0.192171438527209],... - 'VerticalAlignment','middle',... - 'String',{'Text with a','thick and','dotted','border'},... - 'HorizontalAlignment','center',... - 'FitBoxToText','off',... - 'LineStyle',':',... - 'LineWidth',4); - - % Create textbox - annotation(gcf,'textbox',... - [0.729456913827655 0.608247422680412 0.0851723446893787 0.104257797902974],... - 'String',{'Overlapping','and italic'},... - 'FontAngle','italic',... - 'FitBoxToText','off',... - 'BackgroundColor',[0.756862759590149 0.866666674613953 0.776470601558685]); -end -% ========================================================================= -function [stat] = imageOrientation_inline() -% Run test and save pictures as inline TikZ code - [stat] = imageOrientation(false); -end -function [stat] = imageOrientation_PNG() -% Run test and save pictures as external PNGs - [stat] = imageOrientation(true); -end -function [stat] = imageOrientation(imagesAsPng) -% Parameter 'imagesAsPng' is boolean - stat.description = ['Systematic test of different axis', ... - ' orientations and visibility (imagesAsPng = ', ... - num2str(imagesAsPng), ').']; - stat.extraOptions = {'imagesAsPng', imagesAsPng}; - - data = magic(3); - - subplot(3,2,1); - imagesc(data); - set(gca,'XDir','normal'); - xlabel('XDir normal'); - set(gca,'YDir','normal'); - ylabel('YDir normal'); - - subplot(3,2,2); - imagesc(data); - set(gca,'XDir','reverse'); - xlabel('XDir reverse'); - set(gca,'YDir','normal'); - ylabel('YDir normal'); - - subplot(3,2,3); - imagesc(data); - set(gca,'XDir','normal'); - xlabel('XDir normal'); - set(gca,'YDir','reverse'); - ylabel('YDir reverse'); - - subplot(3,2,4); - imagesc(data); - set(gca,'XDir','reverse'); - xlabel('XDir reverse'); - set(gca,'YDir','reverse'); - ylabel('YDir reverse'); - - subplot(3,2,5); - imagesc(data); - set(gca,'XDir','normal'); - xlabel('XDir normal'); - set(gca,'YDir','reverse'); - ylabel('YDir reverse'); - axis off; - title('like above, but axis off'); - - subplot(3,2,6); - imagesc(data); - set(gca,'XDir','reverse'); - xlabel('XDir reverse'); - set(gca,'YDir','reverse'); - ylabel('YDir reverse'); - axis off; - title('like above, but axis off'); -end -% ========================================================================= -function [stat] = texInterpreter() - stat.description = 'Combinations of tex commands'; - axes - text(0.1,0.9, {'\bfBold text before \alpha and also afterwards.', 'Even the next line is bold \itand a bit italic.'}); - text(0.1,0.75, {'Changing \bfthe\fontname{Courier} font or \color[rgb]{0,0.75,0}color doesn''t', 'change the style. Resetting \rmthe style', 'doesn''t change the font or color.'}); - text(0.1,0.6, 'Styles can be {\bflimited} using \{ and \}.'); - text(0.1,0.45, {'But what happens to the output if there is', '{\bfuse an \alpha inside} the limitted style.'}); - text(0.1,0.3, 'Or if the\fontsize{14} size\color{red} and color are \fontsize{10}changed at different\color{blue} points.'); - text(0.1,0.15, {'Also_{some \bf subscripts} and^{superscripts} are possible.', 'Without brackets, it l^o_oks like t_his.' }); -end -% ========================================================================= -function [stat] = stackedBarsWithOther() - stat.description = 'stacked bar plots and other plots'; - stat.issues = 442; - - % dataset stacked - [data,dummy,summy] = svd(magic(7)); %#ok - Y = round(abs(data(2:6,2:4))*10); - n = size(Y,1); - xVals = (1:n).'; - yVals = min((xVals).^2, sum(Y,2)); - - subplot(2,1,1); hold on; - bar(Y,'stack'); - plot(xVals, yVals, 'Color', 'r', 'LineWidth', 2); - legend('show'); - - subplot(2,1,2); hold on; - b2 = barh(Y,'stack','BarWidth', 0.75); - plot(yVals, xVals, 'Color', 'b', 'LineWidth', 2); - - set(b2(1),'FaceColor','c','EdgeColor','none') -end -% ========================================================================= -function [stat] = colorbarLabelTitle() - stat.description = 'colorbar with label and title'; - stat.issues = 429; - - % R2014b handles colorbars smart: `XLabel` and `YLabel` merged into `Label` - % Use colormap 'jet' to create comparable output with MATLAB R2014b - % * Check horizontal/vertical colorbar (subplots) - % * Check if 'direction' is respected - % * Check if multiline label and title works - % * Check if latex interpreter works in label and title - - subplot(1,2,1) - imagesc(magic(3)); - hc = colorbar; - colormap('jet'); - title(hc,'title $\beta$','Interpreter','latex'); - ylabel(hc,'label $a^2$','Interpreter','latex'); - set(hc,'YDir','reverse'); - - subplot(1,2,2) - label_multiline = {'first','second','third'}; - title_multiline = {'title 1','title 2'}; - imagesc(magic(3)); - hc = colorbar('southoutside'); - colormap('jet'); - title(hc,title_multiline); - xlabel(hc,label_multiline); -end -% ========================================================================= -function env = getEnvironment - if ~isempty(ver('MATLAB')) - env = 'MATLAB'; - elseif ~isempty(ver('Octave')) - env = 'Octave'; - else - env = []; - end -end -% ========================================================================= -function [below, noenv] = isVersionBelow ( env, threshMajor, threshMinor ) - % get version string for `env' by iterating over all toolboxes - versionData = ver; - versionString = ''; - for k = 1:max(size(versionData)) - if strcmp( versionData(k).Name, env ) - % found it: store and exit the loop - versionString = versionData(k).Version; - break - end - end - - if isempty( versionString ) - % couldn't find `env' - below = true; - noenv = true; - return - end - - majorVer = str2double(regexprep( versionString, '^(\d+)\..*', '$1' )); - minorVer = str2double(regexprep( versionString, '^\d+\.(\d+\.?\d*)[^\d]*.*', '$1' )); - - if (majorVer < threshMajor) || (majorVer == threshMajor && minorVer < threshMinor) - % version of `env' is below threshold - below = true; - else - % version of `env' is same as or above threshold - below = false; - end - noenv = false; -end -% ========================================================================= diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/README b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/README deleted file mode 100644 index 0c2581a2..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/README +++ /dev/null @@ -1,27 +0,0 @@ -This test module is part of matlab2tikz. - -It provides the means for easily comparing the results of a direct PDF print of -a figure in MATLAB as opposed to having it exported by matlab2tikz. As a matter -of fact, this test suite can take any matlab2xxx-converter as argument (see -step 2 below) with possibly minor modifications to the LaTeX file output. - - - USAGE: -======= - 1. Open MATLAB, make matlab2tikz and matlab2tikz_acidtest available for - calling (by putting in the MATLAB Path,for example). - - 2. Call the script by - - >> matlab2tikz_acidtest( 'testsuite', @ACID ); - - What happens is that MATLAB generates a number of figures as defined in - ACID.m, and exports them as PDF (using the print command) and by - matlab2tikz. - At the same time, a LaTeX file is created in the tex-subfolder. - - 3. You can compile 'tex/acid.tex' with 'make' (making use of 'tex/Makefile'). - -If all goes well, the result will be the file 'tex/acid.pdf' which contains a -list of the test figures, exported as PDF and right next to it the matlab2tikz -generated plot. diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/codeReport.m b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/codeReport.m deleted file mode 100644 index a97c09a0..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/codeReport.m +++ /dev/null @@ -1,268 +0,0 @@ -function [ report ] = codeReport( varargin ) -%CODEREPORT Builds a report of the code health -% -% This function generates a Markdown report on the code health. At the moment -% this is limited to the McCabe (cyclomatic) complexity of a function and its -% subfunctions. -% -% This makes use of |checkcode| in MATLAB. -% -% Usage: -% -% CODEREPORT('function', functionName) to determine which function is -% analyzed. (default: matlab2tikz) -% -% CODEREPORT('complexityThreshold', integer ) to set above which complexity, a -% function is added to the report (default: 10) -% -% See also: checkcode, mlint, - - - %% input options - ipp = m2tInputParser(); - ipp = ipp.addParamValue(ipp, 'function', 'matlab2tikz', @ischar); - ipp = ipp.addParamValue(ipp, 'complexityThreshold', 10, @isnumeric); - ipp = ipp.parse(ipp, varargin{:}); - - %% generate report data - data = checkcode(ipp.Results.function,'-cyc','-struct'); - [complexityAll, mlintMessages] = splitCycloComplexity(data); - - %% analyze cyclomatic complexity - categorizeComplexity = @(x) categoryOfComplexity(x, ... - ipp.Results.complexityThreshold, ... - ipp.Results.function); - - complexityAll = arrayfun(@parseCycloComplexity, complexityAll); - complexityAll = arrayfun(categorizeComplexity, complexityAll); - - complexity = filter(complexityAll, @(x) strcmpi(x.category, 'Bad')); - complexity = sortBy(complexity, 'line', 'ascend'); - complexity = sortBy(complexity, 'complexity', 'descend'); - - [complexityStats] = complexityStatistics(complexityAll); - - %% analyze other messages - %TODO: handle all mlint messages and/or other metrics of the code - - %% format report - dataStr = complexity; - dataStr = arrayfun(@(d) mapField(d, 'function', @markdownInlineCode), dataStr); - if ~isempty(dataStr) - dataStr = addFooterRow(dataStr, 'complexity', @sum, {'line',0, 'function',bold('Total')}); - end - dataStr = arrayfun(@(d) mapField(d, 'line', @integerToString), dataStr); - dataStr = arrayfun(@(d) mapField(d, 'complexity', @integerToString), dataStr); - - report = makeTable(dataStr, {'function', 'complexity'}, ... - {'Function', 'Complexity'}); - - %% command line usage - if nargout == 0 - disp(codelinks(report, ipp.Results.function)); - - figure('name',sprintf('Complexity statistics of %s', ipp.Results.function)); - h = statisticsPlot(complexityStats, 'Complexity', 'Number of functions'); - for hh = h - plot(hh, [1 1]*ipp.Results.complexityThreshold, ylim(hh), ... - 'k--','DisplayName','Threshold'); - end - legend(h(1),'show','Location','NorthEast'); - - clear report - end - -end -%% CATEGORIZATION ============================================================== -function [complexity, others] = splitCycloComplexity(list) -% splits codereport into McCabe complexity and others - filter = @(l) ~isempty(strfind(l.message, 'McCabe complexity')); - idxComplexity = arrayfun(filter, list); - complexity = list( idxComplexity); - others = list(~idxComplexity); -end -function [data] = categoryOfComplexity(data, threshold, mainFunc) -% categorizes the complexity as "Good", "Bad" or "Accepted" - TOKEN = '#COMPLEX'; % token to signal allowed complexity - - try %#ok - helpStr = help(sprintf('%s>%s', mainFunc, data.function)); - if ~isempty(strfind(helpStr, TOKEN)) - data.category = 'Accepted'; - return; - end - end - if data.complexity > threshold - data.category = 'Bad'; - else - data.category = 'Good'; - end -end - -%% PARSING ===================================================================== -function [out] = parseCycloComplexity(in) -% converts McCabe complexity report strings into a better format - out = regexp(in.message, ... - 'The McCabe complexity of ''(?<function>[A-Za-z0-9_]+)'' is (?<complexity>[0-9]+).', ... - 'names'); - out.complexity = str2double(out.complexity); - out.line = in.line; -end - -%% DATA PROCESSING ============================================================= -function selected = filter(list, filterFunc) -% filters an array according to a binary function - idx = logical(arrayfun(filterFunc, list)); - selected = list(idx); -end -function [data] = mapField(data, field, mapping) - data.(field) = mapping(data.(field)); -end -function sorted = sortBy(list, fieldName, mode) -% sorts a struct array by a single field -% extra arguments are as for |sort| - values = arrayfun(@(m)m.(fieldName), list); - [dummy, idxSorted] = sort(values(:), 1, mode); %#ok - sorted = list(idxSorted); -end - -function [stat] = complexityStatistics(list) -% calculate some basic statistics of the complexities - - stat.values = arrayfun(@(c)(c.complexity), list); - stat.binCenter = sort(unique(stat.values)); - - categoryPerElem = {list.category}; - stat.categories = unique(categoryPerElem); - nCategories = numel(stat.categories); - - groupedHist = zeros(numel(stat.binCenter), nCategories); - for iCat = 1:nCategories - category = stat.categories{iCat}; - idxCat = ismember(categoryPerElem, category); - groupedHist(:,iCat) = hist(stat.values(idxCat), stat.binCenter); - end - - stat.histogram = groupedHist; - stat.median = median(stat.values); -end -function [data] = addFooterRow(data, column, func, otherFields) -% adds a footer row to data table based on calculations of a single column -footer = data(end); -for iField = 1:2:numel(otherFields) - field = otherFields{iField}; - value = otherFields{iField+1}; - footer.(field) = value; -end -footer.(column) = func([data(:).(column)]); -data(end+1) = footer; -end - -%% FORMATTING ================================================================== -function str = integerToString(value) -% convert integer to string - str = sprintf('%d',value); -end -function str = markdownInlineCode(str) -% format as inline code for markdown - str = sprintf('`%s`', str); -end -function str = makeTable(data, fields, header) -% make a markdown table from struct array - nData = numel(data); - str = ''; - if nData == 0 - return; % empty input - end - - % determine column sizes - nFields = numel(fields); - table = cell(nFields, nData); - columnWidth = zeros(1,nFields); - for iField = 1:nFields - field = fields{iField}; - table(iField, :) = {data(:).(field)}; - columnWidth(iField) = max(cellfun(@numel, table(iField, :))); - end - columnWidth = max(columnWidth, cellfun(@numel, header)); - columnWidth = columnWidth + 2; % empty space left and right - columnWidth([1,end]) = columnWidth([1,end]) - 1; % except at the edges - - % format table inside cell array - table = [header; table']; - for iField = 1:nFields - FORMAT = ['%' int2str(columnWidth(iField)) 's']; - - for jData = 1:size(table, 1) - table{jData, iField} = strjust(sprintf(FORMAT, ... - table{jData, iField}), 'center'); - end - end - - % insert separator - table = [table(1,:) - arrayfun(@(n) repmat('-',1,n), columnWidth, 'UniformOutput',false) - table(2:end,:)]'; - - % convert cell array to string - FORMAT = ['%s' repmat('|%s', 1,nFields-1) '\n']; - str = sprintf(FORMAT, table{:}); - -end - -function str = codelinks(str, functionName) -% replaces inline functions with clickable links in MATLAB -str = regexprep(str, '`([A-Za-z0-9_]+)`', ... - ['`<a href="matlab:edit ' functionName '>$1">$1</a>`']); -%NOTE: editing function>subfunction will focus on that particular subfunction -% in the editor (this also works for the main function) -end -function str = bold(str) -str = ['**' str '**']; -end - -%% PLOTTING ==================================================================== -function h = statisticsPlot(stat, xLabel, yLabel) -% plot a histogram and box plot - nCategories = numel(stat.categories); - colors = colorscheme; - - h(1) = subplot(5,1,1:4); - hold all; - hb = bar(stat.binCenter, stat.histogram, 'stacked'); - - for iCat = 1:nCategories - category = stat.categories{iCat}; - - set(hb(iCat), 'DisplayName', category, 'FaceColor', colors.(category), ... - 'LineStyle','none'); - end - - %xlabel(xLabel); - ylabel(yLabel); - - h(2) = subplot(5,1,5); - hold all; - - boxplot(stat.values,'orientation','horizontal',... - 'boxstyle', 'outline', ... - 'symbol', 'o', ... - 'colors', colors.All); - xlabel(xLabel); - - xlims = [min(stat.binCenter)-1 max(stat.binCenter)+1]; - c = 1; - ylims = (ylim(h(2)) - c)/3 + c; - - set(h,'XTickMode','manual','XTick',stat.binCenter,'XLim',xlims); - set(h(1),'XTickLabel',''); - set(h(2),'YTickLabel','','YLim',ylims); - linkaxes(h, 'x'); -end -function colors = colorscheme() -% recognizable color scheme for the categories - colors.All = [ 0 113 188]/255; - colors.Good = [118 171 47]/255; - colors.Bad = [161 19 46]/255; - colors.Accepted = [236 176 31]/255; -end diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/data/converted/Makefile b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/data/converted/Makefile deleted file mode 100644 index 2bab3eb5..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/data/converted/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -# ./Makefile - -ECHOCMD:=/bin/echo -e -LATEX:=lualatex --shell-escape -interaction=batchmode - -TEST_SRCS:=$(wildcard test*-converted.tex) -TEST_PDFS:=$(TEST_SRCS:.tex=.pdf) - -default: $(TEST_PDFS) - -%.pdf: %.tex - @$(LATEX) $< - -.PHONY: clean - -clean: - rm -f test*-converted.aux \ - test*-converted.log \ - test*-converted.pdf - -distclean: clean - rm -f test*-converted.tex \ - test*-converted*.png diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/data/reference/Makefile b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/data/reference/Makefile deleted file mode 100644 index 1c39facf..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/data/reference/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# ./Makefile - -EPSTOPDF:=epstopdf - -REFERENCE_EPSS:=$(wildcard test*-reference.eps) -REFERENCE_PDFS:=$(REFERENCE_EPSS:.eps=.pdf) - -default: $(REFERENCE_PDFS) - -%.pdf: %.eps - $(EPSTOPDF) $< - -.PHONY: clean - -clean: - rm -f test*-reference.pdf - -distclean: clean - rm -f test*-reference.eps diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/herrorbar.m b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/herrorbar.m deleted file mode 100644 index 71320285..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/herrorbar.m +++ /dev/null @@ -1,152 +0,0 @@ -function hh = herrorbar(x, y, l, u, symbol) -%HERRORBAR Horizontal Error bar plot. -% HERRORBAR(X,Y,L,R) plots the graph of vector X vs. vector Y with -% horizontal error bars specified by the vectors L and R. L and R contain the -% left and right error ranges for each point in X. Each error bar -% is L(i) + R(i) long and is drawn a distance of L(i) to the right and R(i) -% to the right the points in (X,Y). The vectors X,Y,L and R must all be -% the same length. If X,Y,L and R are matrices then each column -% produces a separate line. -% -% HERRORBAR(X,Y,E) or HERRORBAR(Y,E) plots X with error bars [X-E X+E]. -% HERRORBAR(...,'LineSpec') uses the color and linestyle specified by -% the string 'LineSpec'. See PLOT for possibilities. -% -% H = HERRORBAR(...) returns a vector of line handles. -% -% Example: -% x = 1:10; -% y = sin(x); -% e = std(y)*ones(size(x)); -% herrorbar(x,y,e) -% draws symmetric horizontal error bars of unit standard deviation. -% -% This code is based on ERRORBAR provided in MATLAB. -% -% See also ERRORBAR - -% Jos van der Geest -% email: jos@jasen.nl -% -% File history: -% August 2006 (Jos): I have taken back ownership. I like to thank Greg Aloe from -% The MathWorks who originally introduced this piece of code to the -% Matlab File Exchange. -% September 2003 (Greg Aloe): This code was originally provided by Jos -% from the newsgroup comp.soft-sys.matlab: -% http://newsreader.mathworks.com/WebX?50@118.fdnxaJz9btF^1@.eea3ff9 -% After unsuccessfully attempting to contact the orignal author, I -% decided to take ownership so that others could benefit from finding it -% on the MATLAB Central File Exchange. - -if min(size(x))==1, - npt = length(x); - x = x(:); - y = y(:); - if nargin > 2, - if ~ischar(l), - l = l(:); - end - if nargin > 3 - if ~ischar(u) - u = u(:); - end - end - end -else - [npt,n] = size(x); -end - -if nargin == 3 - if ~ischar(l) - u = l; - symbol = '-'; - else - symbol = l; - l = y; - u = y; - y = x; - [m,n] = size(y); - x(:) = (1:npt)'*ones(1,n);; - end -end - -if nargin == 4 - if ischar(u), - symbol = u; - u = l; - else - symbol = '-'; - end -end - -if nargin == 2 - l = y; - u = y; - y = x; - [m,n] = size(y); - x(:) = (1:npt)'*ones(1,n);; - symbol = '-'; -end - -u = abs(u); -l = abs(l); - -if ischar(x) | ischar(y) | ischar(u) | ischar(l) - error('Arguments must be numeric.') -end - -if ~isequal(size(x),size(y)) | ~isequal(size(x),size(l)) | ~isequal(size(x),size(u)), - error('The sizes of X, Y, L and U must be the same.'); -end - -tee = (max(y(:))-min(y(:)))/100; % make tee .02 x-distance for error bars -% changed from errorbar.m -xl = x - l; -xr = x + u; -ytop = y + tee; -ybot = y - tee; -n = size(y,2); -% end change - -% Plot graph and bars -hold_state = ishold; -cax = newplot; -next = lower(get(cax,'NextPlot')); - -% build up nan-separated vector for bars -% changed from errorbar.m -xb = zeros(npt*9,n); -xb(1:9:end,:) = xl; -xb(2:9:end,:) = xl; -xb(3:9:end,:) = NaN; -xb(4:9:end,:) = xl; -xb(5:9:end,:) = xr; -xb(6:9:end,:) = NaN; -xb(7:9:end,:) = xr; -xb(8:9:end,:) = xr; -xb(9:9:end,:) = NaN; - -yb = zeros(npt*9,n); -yb(1:9:end,:) = ytop; -yb(2:9:end,:) = ybot; -yb(3:9:end,:) = NaN; -yb(4:9:end,:) = y; -yb(5:9:end,:) = y; -yb(6:9:end,:) = NaN; -yb(7:9:end,:) = ytop; -yb(8:9:end,:) = ybot; -yb(9:9:end,:) = NaN; -% end change - - -[ls,col,mark,msg] = colstyle(symbol); if ~isempty(msg), error(msg); end -symbol = [ls mark col]; % Use marker only on data part -esymbol = ['-' col]; % Make sure bars are solid - -h = plot(xb,yb,esymbol); hold on -h = [h;plot(x,y,symbol)]; - -if ~hold_state, hold off; end - -if nargout>0, hh = h; end diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/issues.m b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/issues.m deleted file mode 100644 index e6a9fd00..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/issues.m +++ /dev/null @@ -1,43 +0,0 @@ -function [ status ] = issues( k ) -%ISSUES M2T Test cases related to issues -% -% Issue-related test cases for matlab2tikz -% -% See also: ACID, matlab2tikz_acidtest - testfunction_handles = { - @scatter3Plot3 - }; - - numFunctions = length( testfunction_handles ); - - if (k<=0) - status = testfunction_handles; - return; % This is used for querying numFunctions. - - elseif (k<=numFunctions) - status = testfunction_handles{k}(); - status.function = func2str(testfunction_handles{k}); - - else - error('issues:outOfBounds', ... - 'Out of bounds (number of testfunctions=%d)', numFunctions); - end - -end - -% ========================================================================= -function [stat] = scatter3Plot3() - stat.description = 'Scatter3 plot with 2 colors'; - stat.issues = 292; - - hold on; - x = sin(1:5); - y = cos(3.4 *(1:5)); - z = x.*y; - scatter3(x,y,z,150,... - 'MarkerEdgeColor','none','MarkerFaceColor','k'); - scatter3(-x,y,z,150,... - 'MarkerEdgeColor','none','MarkerFaceColor','b'); -end - -% ========================================================================= diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/matlab2tikz_acidtest.m b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/matlab2tikz_acidtest.m deleted file mode 100644 index ae4324ff..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/matlab2tikz_acidtest.m +++ /dev/null @@ -1,609 +0,0 @@ -function matlab2tikz_acidtest(varargin) -%MATLAB2TIKZ_ACIDTEST unit test driver for matlab2tikz -% -% MATLAB2TIKZ_ACIDTEST('testFunctionIndices', INDICES, ...) or -% MATLAB2TIKZ_ACIDTEST(INDICES, ...) runs the test only for the specified -% indices. When empty, all tests are run. (Default: []). -% -% MATLAB2TIKZ_ACIDTEST('extraOptions', {'name',value, ...}, ...) -% passes the cell array of options to MATLAB2TIKZ. Default: {} -% -% MATLAB2TIKZ_ACIDTEST('figureVisible', LOGICAL, ...) -% plots the figure visibly during the test process. Default: false -% -% MATLAB2TIKZ_ACIDTEST('cleanBefore', LOGICAL, ...) -% tries to run "make clean" in the ./tex folder. Default: true -% -% MATLAB2TIKZ_ACIDTEST('testsuite', FUNCTION_HANDLE, ...) -% Determines which test suite is to be run. Default: @ACID -% A test suite is a function that takes a single integer argument, which: -% when 0: returns a cell array containing the N function handles to the tests -% when >=1 and <=N: runs the appropriate test function -% when >N: throws an error -% -% See also matlab2tikz, ACID - -% Copyright (c) 2008--2014, Nico Schlömer <nico.schloemer@gmail.com> -% All rights reserved. -% -% Redistribution and use in source and binary forms, with or without -% modification, are permitted provided that the following conditions are met: -% -% * Redistributions of source code must retain the above copyright -% notice, this list of conditions and the following disclaimer. -% * Redistributions in binary form must reproduce the above copyright -% notice, this list of conditions and the following disclaimer in -% the documentation and/or other materials provided with the distribution -% -% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -% POSSIBILITY OF SUCH DAMAGE. -% -% ========================================================================= - - % In which environment are we? - env = getEnvironment(); - if ~strcmp(env, 'MATLAB') && ~strcmp(env, 'Octave') - error('Unknown environment. Need MATLAB(R) or GNU Octave.') - end - - - % ----------------------------------------------------------------------- - ipp = m2tInputParser; - - ipp = ipp.addOptional(ipp, 'testFunctionIndices', [], @isfloat); - ipp = ipp.addParamValue(ipp, 'extraOptions', {}, @iscell); - ipp = ipp.addParamValue(ipp, 'figureVisible', false, @islogical); - ipp = ipp.addParamValue(ipp, 'testsuite', @ACID, @(x)(isa(x,'function_handle'))); - ipp = ipp.addParamValue(ipp, 'cleanBefore', true, @islogical); - - ipp = ipp.parse(ipp, varargin{:}); - % ----------------------------------------------------------------------- - - testsuite = ipp.Results.testsuite; - testsuiteName = func2str(testsuite); - - % try to clean the output - cleanFiles(ipp.Results.cleanBefore); - - % first, initialize the tex output - texfile = 'tex/acid.tex'; - fh = fopen(texfile, 'w'); - assert(fh ~= -1, 'Could not open TeX file ''%s'' for writing.', texfile); - texfile_init(fh); - - % output streams - stdout = 1; - if strcmp(env, 'Octave') && ~ipp.Results.figureVisible - % Use the gnuplot backend to work around an fltk bug, see - % <http://savannah.gnu.org/bugs/?43429>. - graphics_toolkit gnuplot - end - - % query the number of test functions - n = length(testsuite(0)); - - defaultStatus = emptyStatus(); - - if ~isempty(ipp.Results.testFunctionIndices) - indices = ipp.Results.testFunctionIndices; - % kick out the illegal stuff - I = find(indices>=1 & indices<=n); - indices = indices(I); %#ok - else - indices = 1:n; - end - - % start overall timing - elapsedTimeOverall = tic; - - errorHasOccurred = false; - - % cell array to accomodate different structure - status = cell(length(indices), 1); - - for k = 1:length(indices) - fprintf(stdout, 'Executing %s test no. %d...\n', testsuiteName, indices(k)); - - % open a window - fig_handle = figure('visible',onOffBoolean(ipp.Results.figureVisible)); - - % plot the figure - try - status{k} = testsuite(indices(k)); - - catch %#ok - e = lasterror('reset'); %#ok - - status{k}.description = '\textcolor{red}{Error during plot generation.}'; - if isempty(status{k}) || ~isfield(status{k}, 'function') ... - || isempty(status{k}.function) - status{k}.function = extractFunctionFromError(e, testsuite); - end - - [status{k}.plotStage, errorHasOccurred] = errorHandler(e, env); - end - - status{k} = fillStruct(status{k}, defaultStatus); - - % plot not successful - if status{k}.skip - close(fig_handle); - continue - end - - reference_eps = sprintf('data/reference/test%d-reference.eps', indices(k)); - reference_pdf = sprintf('data/reference/test%d-reference.pdf', indices(k)); - reference_fig = sprintf('data/reference/test%d-reference', indices(k)); - gen_tex = sprintf('data/converted/test%d-converted.tex', indices(k)); - gen_pdf = sprintf('data/converted/test%d-converted.pdf', indices(k)); - - elapsedTime = tic; - - % Save reference output as PDF - try - switch env - case 'MATLAB' - % MATLAB does not generate properly cropped PDF files. - % So, we generate EPS files that are converted later on. - print(gcf, '-depsc2', reference_eps); - - % On R2014b Win, line endings in .eps are Unix style - % https://github.com/matlab2tikz/matlab2tikz/issues/370 - ensureLineEndings(reference_eps); - - case 'Octave' - % In Octave, figures are properly cropped when using print(). - print(reference_pdf, '-dpdf', '-S415,311', '-r150'); - pause(1.0) - otherwise - error('Unknown environment. Need MATLAB(R) or GNU Octave.') - end - catch %#ok - e = lasterror('reset'); %#ok - [status{k}.saveStage, errorHasOccurred] = errorHandler(e, env); - end - % now, test matlab2tikz - try - cleanfigure(status{k}.extraCleanfigureOptions{:}); - matlab2tikz('filename', gen_tex, ... - 'showInfo', false, ... - 'checkForUpdates', false, ... - 'dataPath', 'data/converted/', ... - 'standalone', true, ... - ipp.Results.extraOptions{:}, ... - status{k}.extraOptions{:} ... - ); - catch %#ok - e = lasterror('reset'); %#ok - % Remove (corrupted) output file. This is necessary to avoid that the - % Makefile tries to compile it and fails. - delete(gen_tex) - [status{k}.tikzStage, errorHasOccurred] = errorHandler(e, env); - end - - % ...and finally write the bits to the LaTeX file - texfile_addtest(fh, reference_fig, gen_pdf, status{k}, indices(k), testsuiteName); - - if ~status{k}.closeall - close(fig_handle); - else - close all; - end - - elapsedTime = toc(elapsedTime); - fprintf(stdout, '%s ', status{k}.function); - fprintf(stdout, 'done (%4.2fs).\n\n', elapsedTime); - end - - % Write the summary table to the LaTeX file - texfile_tab_completion_init(fh) - for k = 1:length(indices) - stat = status{k}; - % Break table up into pieces if it gets too long for one page - if ~mod(k,35) - texfile_tab_completion_finish(fh); - texfile_tab_completion_init(fh); - end - - fprintf(fh, '%d & \\texttt{%s}', indices(k), name2tex(stat.function)); - if stat.skip - fprintf(fh, ' & --- & skipped & ---'); - else - for err = [stat.plotStage.error, ... - stat.saveStage.error, ... - stat.tikzStage.error] - if err - fprintf(fh, ' & \\textcolor{red}{failed}'); - else - fprintf(fh, ' & \\textcolor{green!50!black}{passed}'); - end - end - end - fprintf(fh, ' \\\\\n'); - end - texfile_tab_completion_finish(fh); - - % Write the error messages to the LaTeX file if there are any - if errorHasOccurred - fprintf(fh, '\\section*{Error messages}\n\\scriptsize\n'); - for k = 1:length(indices) - stat = status{k}; - if isempty(stat.plotStage.message) && ... - isempty(stat.saveStage.message) && ... - isempty(stat.tikzStage.message) - continue % No error messages for this test case - end - - fprintf(fh, '\n\\subsection*{Test case %d: \\texttt{%s}}\n', indices(k), name2tex(stat.function)); - print_verbatim_information(fh, 'Plot generation', stat.plotStage.message); - print_verbatim_information(fh, 'PDF generation' , stat.saveStage.message); - print_verbatim_information(fh, 'matlab2tikz' , stat.tikzStage.message); - end - fprintf(fh, '\n\\normalsize\n\n'); - end - - % now, finish off the file and close file and window - texfile_finish(fh, testsuite); - fclose(fh); - - % print out overall timing - elapsedTimeOverall = toc(elapsedTimeOverall); - fprintf(stdout, 'overall time: %4.2fs\n\n', elapsedTimeOverall); - -end -% ========================================================================= -function cleanFiles(cleanBefore) -% clean output files in ./tex using make - if cleanBefore && exist(fullfile('tex','Makefile'),'file') - fprintf(1, 'Cleaning output files...\n'); - cwd = pwd; - try - cd('tex'); - [exitCode, output] = system('make distclean'); - fprintf(1,'%s\n', output); - assert(exitCode==0, 'Exit code 0 means correct execution'); - catch - % This might happen when make is not present - fprintf(2, '\tNot completed succesfully\n\n'); - end - cd(cwd); - end -end -% ========================================================================= -function texfile_init(texfile_handle) - - fprintf(texfile_handle, ... - ['\\documentclass[landscape]{scrartcl}\n' , ... - '\\pdfminorversion=6\n\n' , ... - '\\usepackage{amsmath} %% required for $\\text{xyz}$\n\n', ... - '\\usepackage{hyperref}\n' , ... - '\\usepackage{graphicx}\n' , ... - '\\usepackage{epstopdf}\n' , ... - '\\usepackage{tikz}\n' , ... - '\\usetikzlibrary{plotmarks}\n\n' , ... - '\\usepackage{pgfplots}\n' , ... - '\\pgfplotsset{compat=newest}\n\n' , ... - '\\usepackage[margin=0.5in]{geometry}\n' , ... - '\\newlength\\figurewidth\n' , ... - '\\setlength\\figurewidth{0.4\\textwidth}\n\n' , ... - '\\begin{document}\n\n']); - -end -% ========================================================================= -function texfile_finish(texfile_handle, testsuite) - - [env,versionString] = getEnvironment(); - - - fprintf(texfile_handle, ... - [ - '\\newpage\n',... - '\\begin{tabular}{ll}\n',... - ' Suite & ' name2tex(func2str(testsuite)) ' \\\\ \n', ... - ' Created & ' datestr(now) ' \\\\ \n', ... - ' OS & ' OSVersion ' \\\\ \n',... - ' ' env ' & ' versionString ' \\\\ \n', ... - VersionControlIdentifier, ... - ' TikZ & \\expandafter\\csname ver@tikz.sty\\endcsname \\\\ \n',... - ' Pgfplots & \\expandafter\\csname ver@pgfplots.sty\\endcsname \\\\ \n',... - '\\end{tabular}\n',... - '\\end{document}']); - -end -% ========================================================================= -function print_verbatim_information(texfile_handle, title, contents) - if ~isempty(contents) - fprintf(texfile_handle, ... - ['\\subsubsection*{%s}\n', ... - '\\begin{verbatim}\n%s\\end{verbatim}\n'], ... - title, contents); - end -end -% ========================================================================= -function texfile_addtest(texfile_handle, ref_file, gen_tex, status, funcId, testsuiteName) - % Actually add the piece of LaTeX code that'll later be used to display - % the given test. - - ref_error = status.plotStage.error; - gen_error = status.tikzStage.error; - - fprintf(texfile_handle, ... - ['\\begin{figure}\n' , ... - ' \\centering\n' , ... - ' \\begin{tabular}{cc}\n' , ... - ' %s & %s \\\\\n' , ... - ' reference rendering & generated\n' , ... - ' \\end{tabular}\n' , ... - ' \\caption{%s \\texttt{%s}, \\texttt{%s(%d)}.%s}\n', ... - '\\end{figure}\n' , ... - '\\clearpage\n\n'],... - include_figure(ref_error, 'includegraphics', ref_file), ... - include_figure(gen_error, 'includegraphics', gen_tex), ... - status.description, ... - name2tex(status.function), name2tex(testsuiteName), funcId, ... - formatIssuesForTeX(status.issues)); - -end -% ========================================================================= -function str = include_figure(errorOccured, command, filename) - if errorOccured - str = sprintf(['\\tikz{\\draw[red,thick] ', ... - '(0,0) -- (\\figurewidth,\\figurewidth) ', ... - '(0,\\figurewidth) -- (\\figurewidth,0);}']); - else - switch command - case 'includegraphics' - strFormat = '\\includegraphics[width=\\figurewidth]{../%s}'; - case 'input' - strFormat = '\\input{../%s}'; - otherwise - error('Matlab2tikz_acidtest:UnknownFigureCommand', ... - 'Unknown figure command "%s"', command); - end - str = sprintf(strFormat, filename); - end -end -% ========================================================================= -function texfile_tab_completion_init(texfile_handle) - - fprintf(texfile_handle, ['\\clearpage\n\n' , ... - '\\begin{table}\n' , ... - '\\centering\n' , ... - '\\caption{Test case completion summary}\n' , ... - '\\begin{tabular}{rlccc}\n' , ... - 'No. & Test case & Plot & PDF & TikZ \\\\\n' , ... - '\\hline\n']); - -end -% ========================================================================= -function texfile_tab_completion_finish(texfile_handle) - - fprintf(texfile_handle, ['\\end{tabular}\n' , ... - '\\end{table}\n\n' ]); - -end -% ========================================================================= -function [env,versionString] = getEnvironment() - % Check if we are in MATLAB or Octave. - % Calling ver with an argument: iterating over all entries is very slow - alternatives = {'MATLAB','Octave'}; - for iCase = 1:numel(alternatives) - env = alternatives{iCase}; - vData = ver(env); - if ~isempty(vData) - versionString = vData.Version; - return; % found the right environment - end - end - % otherwise: - env = []; - versionString = []; -end -% ========================================================================= -function [formatted, OSType, OSVersion] = OSVersion() - if ismac - OSType = 'Mac OS'; - [dummy, OSVersion] = system('sw_vers -productVersion'); - elseif ispc - OSType = '';% will already contain Windows in the output of `ver` - [dummy, OSVersion] = system('ver'); - elseif isunix - OSType = 'Unix'; - [dummy, OSVersion] = system('uname -r'); - else - OSType = ''; - OSVersion = ''; - end - formatted = strtrim([OSType ' ' OSVersion]); -end -% ========================================================================= -function msg = format_error_message(e) - msg = ''; - if ~isempty(e.message) - msg = sprintf('%serror: %s\n', msg, e.message); - end - if ~isempty(e.identifier) - msg = sprintf('%serror: %s\n', msg, e.identifier); - end - if ~isempty(e.stack) - msg = sprintf('%serror: called from:\n', msg); - for ee = e.stack(:)' - msg = sprintf('%serror: %s at line %d, in function %s\n', ... - msg, ee.file, ee.line, ee.name); - end - end -end -% ========================================================================= -function disp_error_message(env, msg) - stderr = 2; - % When displaying the error message in MATLAB, all backslashes - % have to be replaced by two backslashes. This must not, however, - % be applied constantly as the string that's saved to the LaTeX - % output must have only one backslash. - if strcmp(env, 'MATLAB') - fprintf(stderr, strrep(msg, '\', '\\')); - else - fprintf(stderr, msg); - end -end -% ========================================================================= -function [formatted,treeish] = VersionControlIdentifier() -% This function gives the (git) commit ID of matlab2tikz -% -% This assumes the standard directory structure as used by Nico's master branch: -% SOMEPATH/src/matlab2tikz.m with a .git directory in SOMEPATH. -% -% The HEAD of that repository is determined from file system information only -% by following dynamic references (e.g. ref:refs/heds/master) in branch files -% until an absolute commit hash (e.g. 1a3c9d1...) is found. -% NOTE: Packed branch references are NOT supported by this approach - MAXITER = 10; % stop following dynamic references after a while - formatted = ''; - REFPREFIX = 'ref:'; - isReference = @(treeish)(any(strfind(treeish, REFPREFIX))); - treeish = [REFPREFIX 'HEAD']; - try - % get the matlab2tikz directory - m2tDir = fileparts(mfilename('fullpath')); - gitDir = fullfile(m2tDir,'..','.git'); - - nIter = 1; - while isReference(treeish) - refName = treeish(numel(REFPREFIX)+1:end); - branchFile = fullfile(gitDir, refName); - - if exist(branchFile, 'file') && nIter < MAXITER - fid = fopen(branchFile,'r'); - treeish = fscanf(fid,'%s'); - fclose(fid); - nIter = nIter + 1; - else % no branch file or iteration limit reached - treeish = ''; - return; - end - end - catch %#ok - treeish = ''; - end - if ~isempty(treeish) - formatted = [' Commit & ' treeish ' \\\\ \n']; - end -end -% ========================================================================= -function texName = name2tex(matlabIdentifier) -texName = strrep(matlabIdentifier, '_', '\_'); -end -% ========================================================================= -function str = formatIssuesForTeX(issues) -% make links to GitHub issues for the LaTeX output - issues = issues(:)'; - if isempty(issues) - str = ''; - return - end - BASEURL = 'https://github.com/matlab2tikz/matlab2tikz/issues/'; - SEPARATOR = sprintf(' \n'); - strs = arrayfun(@(n) sprintf(['\\href{' BASEURL '%d}{\\#%d}'], n,n), issues, ... - 'UniformOutput', false); - strs = [strs; repmat({SEPARATOR}, 1, numel(strs))]; - str = sprintf('{\\color{blue} \\texttt{%s}}', [strs{:}]); -end -% ========================================================================= -function onOff = onOffBoolean(bool) -if bool - onOff = 'on'; -else - onOff = 'off'; -end -end -% ========================================================================= -function ensureLineEndings(filename) -% Read in one line and test the ending -fid = fopen(filename,'r+'); -testline = fgets(fid); -if ispc && ~strcmpi(testline(end-1:end), sprintf('\r\n')) - % Rewind, read the whole - fseek(fid,0,'bof'); - str = fread(fid,'*char')'; - - % Replace, overwrite and close - str = strrep(str, testline(end), sprintf('\r\n')); - fseek(fid,0,'bof'); - fprintf(fid,'%s',str); - fclose(fid); -end -end -% ========================================================================= -function defaultStatus = emptyStatus() -% constructs an empty status struct -defaultStatus = struct('function', '', ... - 'description', '',... - 'issues', [],... - 'skip', false, ... % skipped this test? - 'closeall', false, ... % call close all after? - 'extraOptions', {cell(0)}, ... - 'extraCleanfigureOptions',{cell(0)}, ... - 'plotStage', emptyStage(), ... - 'saveStage', emptyStage(), ... - 'tikzStage', emptyStage()); -end -% ========================================================================= -function stage = emptyStage() -% constructs an empty (workflow) stage struct -stage = struct('message', '', 'error' , false); -end -% ========================================================================= -function [status] = fillStruct(status, defaultStatus) -% fills non-existant fields of |data| with those of |defaultData| - fields = fieldnames(defaultStatus); - for iField = 1:numel(fields) - field = fields{iField}; - if ~isfield(status,field) - status.(field) = defaultStatus.(field); - end - end -end -% ========================================================================= -function name = extractFunctionFromError(e, testsuite) -% extract function name from an error (using the stack) - name = ''; - if isa(testsuite, 'function_handle') - testsuite = func2str(testsuite); - end - for kError = 1:numel(e.stack); - ee = e.stack(kError); - if isempty(name) - name = ''; - if ~isempty(regexp(ee.name, ['^' testsuite '>'],'once')) - % extract function name - name = regexprep(ee.name, ['^' testsuite '>(.*)'], '$1'); - elseif ~isempty(regexp(ee.name, ['^' testsuite],'once')) && ... - kError < numel(e.stack) - % new stack trace format (R2014b) - if kError > 1 - name = e.stack(kError-1).name; - end - end - end - end -end -% ========================================================================= -function [stage, errorHasOccurred] = errorHandler(e,env) -% common error handler code: save and print to console -errorHasOccurred = true; -stage = emptyStage(); -stage.message = format_error_message(e); -stage.error = errorHasOccurred; - -disp_error_message(env, stage.message); -end -% ========================================================================= diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/myCount.dat b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/myCount.dat deleted file mode 100644 index 69e029e2..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/myCount.dat +++ /dev/null @@ -1,24 +0,0 @@ - 11 11 9 - 7 13 11 - 14 17 20 - 11 13 9 - 43 51 69 - 38 46 76 - 61 132 186 - 75 135 180 - 38 88 115 - 28 36 55 - 12 12 14 - 18 27 30 - 18 19 29 - 17 15 18 - 19 36 48 - 32 47 10 - 42 65 92 - 57 66 151 - 44 55 90 - 114 145 257 - 35 58 68 - 11 12 15 - 13 9 15 - 10 9 7 diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/pointReductionTest.m b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/pointReductionTest.m deleted file mode 100644 index 6b6718fb..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/pointReductionTest.m +++ /dev/null @@ -1,34 +0,0 @@ -% ============================================================================== -function pointReductionTest() - - breakTime = 5.0; - - testPlots = {@testPlot1, ... - }; - %@testPlot2}; - - for testPlot = testPlots - testPlot(); - 'a' - %pause(breakTime); - %pointReduction2d(0.1); - pause(breakTime); - 'b' - end - - close all; - -end -% ============================================================================== -function testPlot1() - x = -pi:pi/1000:pi; - y = tan(sin(x)) - sin(tan(x)); - plot(x,y,'--rs'); -end -% ============================================================================== -function testPlot2() - x = -pi:pi/1000:pi; - y = exp(tan(sin(x)) - sin(tan(x))); - semilogy(x,y,'--rs'); -end -% ============================================================================== diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/runtests b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/runtests deleted file mode 100644 index 1135424c..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/runtests +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/octave -q - -# Create -# -template = [ ... - '%%!test\n', ... - '%%! display(''Test %d...'');\n', ... - '%%! graphics_toolkit gnuplot\n', ... - '%%! try\n', ... - '%%! out = ACID(%d);\n', ... - '%%! catch e\n', ... - '%%! error(''Exception in ACID:\\n%%s'', e.message);\n', ... - '%%! end\n', ... - '%%! if ~(isfield(out, ''skip'') && out.skip)\n', ... - '%%! outputFile = ''data/converted/test%d-converted.tex'';\n', ... - '%%! try\n', ... - '%%! matlab2tikz( ...\n', ... - '%%! ''filename'', outputFile, ...\n', ... - '%%! ''width'', ''5cm'', ...\n', ... - '%%! ''showInfo'', false, ...\n', ... - '%%! ''checkForUpdates'', false, ...\n', ... - '%%! ''dataPath'', ''data/converted/'', ...\n', ... - '%%! ''standalone'', true ...\n', ... - '%%! );\n', ... - '%%! catch e\n', ... - '%%! error(''Exception in matlab2tikz:\\n%%s'', e.message);\n', ... - '%%! end\n', ... - '%%! %%type(outputFile);\n', ... - '%%! assert(md5sum(outputFile), out.md5);\n', ... - '%%! end\n', ... - '%%!\n' ... - ]; - -# Create test entries for all tests -testfile = 'testlist.m'; -fh = fopen(testfile, 'w'); -testcases = ACID(0); -for k = 1:length(testcases) - fprintf(fh, template, k, k, k); -end -fclose(fh); - -# Actually run the tests. -# Can't use the [n, max] return arguments -# <https://www.gnu.org/software/octave/doc/interpreter/Test-Functions.html> -# since they don't account for exceptions in tests. -addpath('../src/'); -success = test(testfile); - -if success - printf('Tests successful.'); - ierr = 0; -else - ierr = 1; -end -exit(ierr); diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/testPatches.m b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/testPatches.m deleted file mode 100644 index d4e8cffe..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/testPatches.m +++ /dev/null @@ -1,121 +0,0 @@ -function status = testPatches(k) -% TESTPATCHES Test suite for patches -% -% See also: ACID, matlab2tikz_acidtest - -testfunction_handles = { - @patch01; - @patch02; - @patch03; - @patch04; - @patch05; - @patch06; - @patch07; - @patch08; - }; - -numFunctions = length( testfunction_handles ); - -if nargin < 1 || isempty(k) || k <= 0 - status = testfunction_handles; - return; % This is used for querying numFunctions. - -elseif (k<=numFunctions) - status = testfunction_handles{k}(); - status.function = func2str(testfunction_handles{k}); - -else - error('patchTests:outOfBounds', ... - 'Out of bounds (number of testfunctions=%d)', numFunctions); -end - -end - -% ========================================================================= -function p = patch00() -% DO NOT INCLUDE IN ACID LIST -% Base patch plot for following tests -xdata = [2 2 0 2 5; 2 8 2 4 5; 8 8 2 4 8]; -ydata = [4 4 4 2 0; 8 4 6 2 2; 4 0 4 0 0]; -zdata = ones(3,5)*2; -p = patch(xdata,ydata,zdata); -end -% ========================================================================= -function stat = patch01() -stat.description = 'Set face color red'; - -p = patch00(); -set(p,'FaceColor','r') -end -% ========================================================================= -function stat = patch02() -stat.description = 'Flat face colors scaled in clim [0,40]'; - -p = patch00(); -set(gca,'CLim',[0 40]) -cdata = [15 30 25 2 60]; -set(p,'FaceColor','flat','CData',cdata,'CDataMapping','scaled') -end -% ========================================================================= -function stat = patch03() -stat.description = 'Flat face colors direct in clim [0,40]'; - -p = patch00(); -set(gca,'CLim',[0 40]) -cdata = [15 30 25 2 60]; -set(p,'FaceColor','flat','CData',cdata,'CDataMapping','direct') -end -% ========================================================================= -function stat = patch04() -stat.description = 'Flat face colors with 3D (truecolor) CData'; - -p = patch00(); -cdata(:,:,1) = [0 0 1 0 0.8]; -cdata(:,:,2) = [0 0 0 0 0.8]; -cdata(:,:,3) = [1 1 1 0 0.8]; -set(p,'FaceColor','flat','CData',cdata) -end -% ========================================================================= -function stat = patch05() -stat.description = 'Flat face color, scaled edge colors in clim [0,40]'; - -p = patch00(); -set(gca,'CLim',[0 40]) -cdata = [15 30 25 2 60; 12 23 40 13 26; 24 8 1 65 42]; -set(p,'FaceColor','flat','CData',cdata,'EdgeColor','flat','LineWidth',5,'CDataMapping','scaled') -end -% ========================================================================= -function stat = patch06() -stat.description = 'Flat face color, direct edge colors in clim [0,40]'; - -p = patch00(); -set(gca,'CLim',[0 40]) -cdata = [15 30 25 2 60; 12 23 40 13 26; 24 8 1 65 42]; -set(p,'FaceColor','flat','CData',cdata,'EdgeColor','flat','LineWidth',5,'CDataMapping','direct') -end -% ========================================================================= -function stat = patch07() -stat.description = 'Flat face color with 3D CData and interp edge colors'; - -p = patch00(); -cdata(:,:,1) = [0 0 1 0 0.8; - 0 0 1 0.2 0.6; - 0 1 0 0.4 1]; -cdata(:,:,2) = [0 0 0 0 0.8; - 1 1 1 0.2 0.6; - 1 0 0 0.4 0]; -cdata(:,:,3) = [1 1 1 0 0.8; - 0 1 0 0.2 0.6; - 1 0 1 0.4 0]; -set(p,'FaceColor','flat','CData',cdata,'EdgeColor','interp','LineWidth',5) -end -% ========================================================================= -function stat = patch08() -stat.description = 'Interp face colors, flat edges, scaled CData in clims [0,40]'; - -p = patch00(); -set(gca,'CLim',[0 40]) -cdata = [15 30 25 2 60; 12 23 40 13 26; 24 8 1 65 42]; -set(p,'FaceColor','interp','CData',cdata,'EdgeColor','flat','LineWidth',5,'CDataMapping','scaled') -end -% ========================================================================= \ No newline at end of file diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/testSurfshader.m b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/testSurfshader.m deleted file mode 100644 index e329d9cf..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/testSurfshader.m +++ /dev/null @@ -1,103 +0,0 @@ -function status = testSurfshader(k) -% TESTSURFSHADER Test suite for Surf/mesh shaders (coloring) -% -% See also: ACID, matlab2tikz_acidtest - - testfunction_handles = { - @surfShader1; - @surfShader2; - @surfShader3; - @surfShader4; - @surfShader5; - @surfNoShader; - @surfNoPlot; - @surfMeshInterp; - @surfMeshRGB; - }; - - numFunctions = length( testfunction_handles ); - - if nargin < 1 || isempty(k) || k <= 0 - status = testfunction_handles; - return; % This is used for querying numFunctions. - - elseif (k<=numFunctions) - status = testfunction_handles{k}(); - status.function = func2str(testfunction_handles{k}); - - else - error('patchTests:outOfBounds', ... - 'Out of bounds (number of testfunctions=%d)', numFunctions); - end - -end - -% ========================================================================= -function [stat] = surfShader1() - stat.description = 'shader=flat/(flat mean) | Fc: flat | Ec: none'; - - [X,Y,Z] = peaks(5); - surf(X,Y,Z,'FaceColor','flat','EdgeColor','none') -end -% ========================================================================= -function [stat] = surfShader2() - stat.description = 'shader=interp | Fc: interp | Ec: none'; - - [X,Y,Z] = peaks(5); - surf(X,Y,Z,'FaceColor','interp','EdgeColor','none') -end -% ========================================================================= -function [stat] = surfShader3() - stat.description = 'shader=faceted | Fc: flat | Ec: RGB'; - - [X,Y,Z] = peaks(5); - surf(X,Y,Z,'FaceColor','flat','EdgeColor','green') -end -% ========================================================================= -function [stat] = surfShader4() -stat.description = 'shader=faceted | Fc: RGB | Ec: interp'; -env = getEnvironment(); -if strcmpi(env, 'MATLAB') && isVersionBelow(env, 8, 4) %R2014a and older - warning('m2t:ACID:surfShader4',... - 'The MATLAB EPS export may behave strangely for this case'); -end - -[X,Y,Z] = peaks(5); -surf(X,Y,Z,'FaceColor','blue','EdgeColor','interp') -end -% ========================================================================= -function [stat] = surfShader5() -stat.description = 'shader=faceted interp | Fc: interp | Ec: flat'; - -[X,Y,Z] = peaks(5); -surf(X,Y,Z,'FaceColor','interp','EdgeColor','flat') -end -% ========================================================================= -function [stat] = surfNoShader() -stat.description = 'no shader | Fc: RGB | Ec: RGB'; - -[X,Y,Z] = peaks(5); -surf(X,Y,Z,'FaceColor','blue','EdgeColor','yellow') -end -% ========================================================================= -function [stat] = surfNoPlot() -stat.description = 'no plot | Fc: none | Ec: none'; - -[X,Y,Z] = peaks(5); -surf(X,Y,Z,'FaceColor','none','EdgeColor','none') -end -% ========================================================================= -function [stat] = surfMeshInterp() -stat.description = 'mesh | Fc: none | Ec: interp'; - -[X,Y,Z] = peaks(5); -surf(X,Y,Z,'FaceColor','none','EdgeColor','interp') -end -% ========================================================================= -function [stat] = surfMeshRGB() -stat.description = 'mesh | Fc: none | Ec: RGB'; - -[X,Y,Z] = peaks(5); -surf(X,Y,Z,'FaceColor','none','EdgeColor','green') -end -% ========================================================================= \ No newline at end of file diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/tex/Makefile b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/tex/Makefile deleted file mode 100644 index 89809159..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/test/tex/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -# ./Makefile - -ECHOCMD:=/bin/echo -e -LATEX:=lualatex --shell-escape -TARGET:=acid - -main: - cd ../data/reference/ && $(MAKE) - cd ../data/converted/ && $(MAKE) - @$(LATEX) $(TARGET) - -.PHONY: clean - -clean: - @rm -f $(TARGET).aux \ - $(TARGET).log \ - $(TARGET).nav \ - $(TARGET).out \ - $(TARGET).snm \ - $(TARGET).toc \ - $(TARGET).vrb \ - $(TARGET).pdf \ - $(TARGET).dvi \ - $(TARGET).ps \ - missfont.log - @rm -f *~ - cd ../data/reference/ && $(MAKE) clean - cd ../data/converted/ && $(MAKE) clean - -distclean: clean - @rm -f $(TARGET).tex - cd ../data/reference/ && $(MAKE) distclean - cd ../data/converted/ && $(MAKE) distclean diff --git a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/version-0.6.0 b/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/version-0.6.0 deleted file mode 100644 index 5e89b8a4..00000000 --- a/katoptron/matlab/TPL/matlab2tikz-matlab2tikz-722609f/version-0.6.0 +++ /dev/null @@ -1,6 +0,0 @@ -This file is there to make sure that the HTML page - - http://www.mathworks.de/matlabcentral/fileexchange/22022-matlab2tikz/all_files - -contains the version number in clear text. This is used -by the automatic updater. diff --git a/katoptron/matlab/TPL/matlab2tikz2.m b/katoptron/matlab/TPL/matlab2tikz2.m deleted file mode 100644 index 39c31976..00000000 --- a/katoptron/matlab/TPL/matlab2tikz2.m +++ /dev/null @@ -1,29 +0,0 @@ -function matlab2tikz2(filename,width_macro,height_macro) - - filename_tmp = [filename,'_tmp']; - matlab2tikz(filename_tmp); - - fid = fopen(filename_tmp); - fid2 = fopen(filename, 'w'); - tline = fgetl(fid); - while ischar(tline) - if((length(tline)>5) & (tline(1:5) == 'width')) - disp(tline) - clear tline - tline = ['width=',width_macro, ',']; - disp(tline) - elseif((length(tline)>6) & (tline(1:6) == 'height')) - disp(tline) - clear tline - tline = ['height=',height_macro, ',']; - disp(tline) - end - fwrite(fid2, tline); - fprintf(fid2,char(10)); - tline = fgetl(fid); - end - - fclose(fid); - fclose(fid2); - -end \ No newline at end of file diff --git a/katoptron/matlab/TPL/test.tex b/katoptron/matlab/TPL/test.tex deleted file mode 100644 index 1c8f7cfd..00000000 --- a/katoptron/matlab/TPL/test.tex +++ /dev/null @@ -1,130 +0,0 @@ -% This file was created by matlab2tikz. -% Minimal pgfplots version: 1.3 -% -%The latest updates can be retrieved from -% http://www.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz -%where you can also make suggestions and rate matlab2tikz. -% -\definecolor{mycolor1}{rgb}{0.00000,0.44700,0.74100}% -% -\begin{tikzpicture} - -\begin{axis}[% -width=\hi, -height=\ho, -at={(1.011111in,0.641667in)}, -scale only axis, -xmin=-5, -xmax=5, -ymin=-80, -ymax=80 -] -\addplot [color=mycolor1,solid,forget plot] - table[row sep=crcr]{% --5 -65\\ --4.8989898989899 -58.7883786338026\\ --4.7979797979798 -52.8766648218745\\ --4.6969696969697 -47.258674903303\\ --4.5959595959596 -41.9282252171753\\ --4.49494949494949 -36.8791321025787\\ --4.39393939393939 -32.1052118986003\\ --4.29292929292929 -27.6002809443275\\ --4.19191919191919 -23.3581555788474\\ --4.09090909090909 -19.3726521412472\\ --3.98989898989899 -15.6375869706142\\ --3.88888888888889 -12.1467764060357\\ --3.78787878787879 -8.89403678659878\\ --3.68686868686869 -5.87318445139076\\ --3.58585858585859 -3.07803573949884\\ --3.48484848484848 -0.502406990010293\\ --3.38383838383838 1.85988545798769\\ --3.28282828282828 4.01502526540787\\ --3.18181818181818 5.96919609316303\\ --3.08080808080808 7.72858160216593\\ --2.97979797979798 9.29936545332934\\ --2.87878787878788 10.687731307566\\ --2.77777777777778 11.8998628257887\\ --2.67676767676768 12.9419436689103\\ --2.57575757575758 13.8201574978434\\ --2.47474747474747 14.540687973501\\ --2.37373737373737 15.1097187567956\\ --2.27272727272727 15.5334335086401\\ --2.17171717171717 15.8180158899473\\ --2.07070707070707 15.96964956163\\ --1.96969696969697 15.9945181846008\\ --1.86868686868687 15.8988054197727\\ --1.76767676767677 15.6886949280583\\ --1.66666666666667 15.3703703703704\\ --1.56565656565657 14.9500154076218\\ --1.46464646464646 14.4338137007252\\ --1.36363636363636 13.8279489105935\\ --1.26262626262626 13.1386046981394\\ --1.16161616161616 12.3719647242757\\ --1.06060606060606 11.5342126499151\\ --0.959595959595959 10.6315321359705\\ --0.858585858585859 9.67010684335447\\ --0.757575757575758 8.65612043297994\\ --0.656565656565657 7.59575656575963\\ --0.555555555555555 6.49519890260631\\ --0.454545454545454 5.36063110443275\\ --0.353535353535354 4.19823683215174\\ --0.252525252525253 3.01419974667603\\ --0.151515151515151 1.81470350891838\\ --0.0505050505050502 0.605931779791586\\ -0.0505050505050502 -0.605931779791586\\ -0.151515151515151 -1.81470350891838\\ -0.252525252525253 -3.01419974667603\\ -0.353535353535354 -4.19823683215174\\ -0.454545454545454 -5.36063110443275\\ -0.555555555555555 -6.49519890260631\\ -0.656565656565657 -7.59575656575963\\ -0.757575757575758 -8.65612043297994\\ -0.858585858585859 -9.67010684335447\\ -0.959595959595959 -10.6315321359705\\ -1.06060606060606 -11.5342126499151\\ -1.16161616161616 -12.3719647242757\\ -1.26262626262626 -13.1386046981394\\ -1.36363636363636 -13.8279489105935\\ -1.46464646464646 -14.4338137007252\\ -1.56565656565657 -14.9500154076218\\ -1.66666666666667 -15.3703703703704\\ -1.76767676767677 -15.6886949280583\\ -1.86868686868687 -15.8988054197727\\ -1.96969696969697 -15.9945181846008\\ -2.07070707070707 -15.96964956163\\ -2.17171717171717 -15.8180158899473\\ -2.27272727272727 -15.5334335086401\\ -2.37373737373737 -15.1097187567956\\ -2.47474747474747 -14.540687973501\\ -2.57575757575758 -13.8201574978434\\ -2.67676767676768 -12.9419436689103\\ -2.77777777777778 -11.8998628257887\\ -2.87878787878788 -10.687731307566\\ -2.97979797979798 -9.29936545332933\\ -3.08080808080808 -7.72858160216592\\ -3.18181818181818 -5.96919609316303\\ -3.28282828282828 -4.0150252654079\\ -3.38383838383838 -1.85988545798769\\ -3.48484848484848 0.502406990010286\\ -3.58585858585859 3.07803573949887\\ -3.68686868686869 5.87318445139076\\ -3.78787878787879 8.89403678659875\\ -3.88888888888889 12.1467764060357\\ -3.98989898989899 15.6375869706142\\ -4.09090909090909 19.3726521412472\\ -4.19191919191919 23.3581555788474\\ -4.29292929292929 27.6002809443274\\ -4.39393939393939 32.1052118986004\\ -4.49494949494949 36.8791321025787\\ -4.5959595959596 41.9282252171753\\ -4.6969696969697 47.258674903303\\ -4.7979797979798 52.8766648218745\\ -4.8989898989899 58.7883786338026\\ -5 65\\ -}; -\node[right, align=left, inner sep=0mm, text=black] -at (axis cs:-2,16,0) {dy/dx = 0}; -\node[right, align=left, inner sep=0mm, text=black] -at (axis cs:2,-16,0) {dy/dx = 0}; -\end{axis} -\end{tikzpicture}% diff --git a/katoptron/matlab/TPL/test.tex_tmp b/katoptron/matlab/TPL/test.tex_tmp deleted file mode 100644 index b9209af1..00000000 --- a/katoptron/matlab/TPL/test.tex_tmp +++ /dev/null @@ -1,130 +0,0 @@ -% This file was created by matlab2tikz. -% Minimal pgfplots version: 1.3 -% -%The latest updates can be retrieved from -% http://www.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz -%where you can also make suggestions and rate matlab2tikz. -% -\definecolor{mycolor1}{rgb}{0.00000,0.44700,0.74100}% -% -\begin{tikzpicture} - -\begin{axis}[% -width=6.027778in, -height=4.754167in, -at={(1.011111in,0.641667in)}, -scale only axis, -xmin=-5, -xmax=5, -ymin=-80, -ymax=80 -] -\addplot [color=mycolor1,solid,forget plot] - table[row sep=crcr]{% --5 -65\\ --4.8989898989899 -58.7883786338026\\ --4.7979797979798 -52.8766648218745\\ --4.6969696969697 -47.258674903303\\ --4.5959595959596 -41.9282252171753\\ --4.49494949494949 -36.8791321025787\\ --4.39393939393939 -32.1052118986003\\ --4.29292929292929 -27.6002809443275\\ --4.19191919191919 -23.3581555788474\\ --4.09090909090909 -19.3726521412472\\ --3.98989898989899 -15.6375869706142\\ --3.88888888888889 -12.1467764060357\\ --3.78787878787879 -8.89403678659878\\ --3.68686868686869 -5.87318445139076\\ --3.58585858585859 -3.07803573949884\\ --3.48484848484848 -0.502406990010293\\ --3.38383838383838 1.85988545798769\\ --3.28282828282828 4.01502526540787\\ --3.18181818181818 5.96919609316303\\ --3.08080808080808 7.72858160216593\\ --2.97979797979798 9.29936545332934\\ --2.87878787878788 10.687731307566\\ --2.77777777777778 11.8998628257887\\ --2.67676767676768 12.9419436689103\\ --2.57575757575758 13.8201574978434\\ --2.47474747474747 14.540687973501\\ --2.37373737373737 15.1097187567956\\ --2.27272727272727 15.5334335086401\\ --2.17171717171717 15.8180158899473\\ --2.07070707070707 15.96964956163\\ --1.96969696969697 15.9945181846008\\ --1.86868686868687 15.8988054197727\\ --1.76767676767677 15.6886949280583\\ --1.66666666666667 15.3703703703704\\ --1.56565656565657 14.9500154076218\\ --1.46464646464646 14.4338137007252\\ --1.36363636363636 13.8279489105935\\ --1.26262626262626 13.1386046981394\\ --1.16161616161616 12.3719647242757\\ --1.06060606060606 11.5342126499151\\ --0.959595959595959 10.6315321359705\\ --0.858585858585859 9.67010684335447\\ --0.757575757575758 8.65612043297994\\ --0.656565656565657 7.59575656575963\\ --0.555555555555555 6.49519890260631\\ --0.454545454545454 5.36063110443275\\ --0.353535353535354 4.19823683215174\\ --0.252525252525253 3.01419974667603\\ --0.151515151515151 1.81470350891838\\ --0.0505050505050502 0.605931779791586\\ -0.0505050505050502 -0.605931779791586\\ -0.151515151515151 -1.81470350891838\\ -0.252525252525253 -3.01419974667603\\ -0.353535353535354 -4.19823683215174\\ -0.454545454545454 -5.36063110443275\\ -0.555555555555555 -6.49519890260631\\ -0.656565656565657 -7.59575656575963\\ -0.757575757575758 -8.65612043297994\\ -0.858585858585859 -9.67010684335447\\ -0.959595959595959 -10.6315321359705\\ -1.06060606060606 -11.5342126499151\\ -1.16161616161616 -12.3719647242757\\ -1.26262626262626 -13.1386046981394\\ -1.36363636363636 -13.8279489105935\\ -1.46464646464646 -14.4338137007252\\ -1.56565656565657 -14.9500154076218\\ -1.66666666666667 -15.3703703703704\\ -1.76767676767677 -15.6886949280583\\ -1.86868686868687 -15.8988054197727\\ -1.96969696969697 -15.9945181846008\\ -2.07070707070707 -15.96964956163\\ -2.17171717171717 -15.8180158899473\\ -2.27272727272727 -15.5334335086401\\ -2.37373737373737 -15.1097187567956\\ -2.47474747474747 -14.540687973501\\ -2.57575757575758 -13.8201574978434\\ -2.67676767676768 -12.9419436689103\\ -2.77777777777778 -11.8998628257887\\ -2.87878787878788 -10.687731307566\\ -2.97979797979798 -9.29936545332933\\ -3.08080808080808 -7.72858160216592\\ -3.18181818181818 -5.96919609316303\\ -3.28282828282828 -4.0150252654079\\ -3.38383838383838 -1.85988545798769\\ -3.48484848484848 0.502406990010286\\ -3.58585858585859 3.07803573949887\\ -3.68686868686869 5.87318445139076\\ -3.78787878787879 8.89403678659875\\ -3.88888888888889 12.1467764060357\\ -3.98989898989899 15.6375869706142\\ -4.09090909090909 19.3726521412472\\ -4.19191919191919 23.3581555788474\\ -4.29292929292929 27.6002809443274\\ -4.39393939393939 32.1052118986004\\ -4.49494949494949 36.8791321025787\\ -4.5959595959596 41.9282252171753\\ -4.6969696969697 47.258674903303\\ -4.7979797979798 52.8766648218745\\ -4.8989898989899 58.7883786338026\\ -5 65\\ -}; -\node[right, align=left, inner sep=0mm, text=black] -at (axis cs:-2,16,0) {dy/dx = 0}; -\node[right, align=left, inner sep=0mm, text=black] -at (axis cs:2,-16,0) {dy/dx = 0}; -\end{axis} -\end{tikzpicture}% \ No newline at end of file diff --git a/katoptron/matlab/ensemble/eric_data.m b/katoptron/matlab/ensemble/eric_data.m deleted file mode 100644 index cfea0b6b..00000000 --- a/katoptron/matlab/ensemble/eric_data.m +++ /dev/null @@ -1,571 +0,0 @@ -% clear all -% close all -% clc -% -% throughput_haswell = ... -% [0.9119170984455955, 7.906111492602527; -% 3.979274611398962, 10.228603533304188; -% 7.792746113989635, 10.62563206192646; -% 11.772020725388602, 11.215931081840303; -% 15.917098445595853, 11.132030713527676; -% 19.813471502590673, 11.336537861289713; -% 23.875647668393782, 11.348773331668632; -% 27.689119170984455, 11.360259691616193; -% 31.751295336787564, 11.372495161995118]; -% -% throughput_haswell(:,1) = round(throughput_haswell(:,1)); -% -% throughput_cray = ... -% [1.0777202072538863, 2.3162494537736436; -% 4.145077720207253, 3.0965728197765117; -% 7.87564766839378, 3.204195018415625; -% 12.020725388601038, 3.2166801922716672; -% 15.999999999999998, 3.4214370435108137; -% 19.979274611398964, 3.3370372682439537; -% 23.875647668393782, 3.3487733316686317; -% 27.772020725388607, 3.5532804794306685; -% 31.834196891191716, 3.469130407640911]; -% -% throughput_cray(:,1) = round(throughput_cray(:,1)); -% -% throughput_nvidia = ... -% [0.9948186528497391, 17.159373244272423; -% 15.999999999999998, 34.168424995318055; -% 31.834196891191716, 35.08358823896622]; -% -% throughput_nvidia(:,1) = round(throughput_nvidia(:,1)); -% -% throughput_knc = ... -% [0.8290155440414484, 14.749235283101314; -% 7.626943005181348, 15.348024221237274; -% 15.917098445595853, 19.228416255696352; -% 23.875647668393782, 24.457207066608397; -% 31.751295336787564, 25.73394094512765]; -% -% throughput_knc(:,1) = round(throughput_knc(:,1)); -% -% %% -% matrix_speed_up_haswell = ... -% [0.8000000000000007, 0.9986486486486488; -% 3.9200000000000017, 1.307657657657658; -% 7.759999999999998, 1.3896396396396398; -% 11.84, 1.4211711711711714; -% 15.84, 1.4400900900900904; -% 19.759999999999998, 1.4495495495495496; -% 23.839999999999996, 1.4495495495495496; -% 27.839999999999996, 1.4590090090090093; -% 31.919999999999995, 1.4653153153153156]; -% -% matrix_speed_up_cray = ... -% [0.8000000000000007, 0.9954954954954955; -% 4.080000000000002, 1.307657657657658; -% 7.920000000000002, 1.326576576576577; -% 12, 1.392792792792793; -% 15.999999999999996, 1.4211711711711714; -% 19.92, 1.411711711711712; -% 23.919999999999995, 1.3833333333333335; -% 28, 1.4810810810810813; -% 32, 1.4211711711711714]; -% -% matrix_speed_up_nvidia = ... -% [0.8000000000000007, 1.001801801801802; -% 15.999999999999996, 1.9855855855855857; -% 32, 2.032882882882883]; -% -% matrix_speed_up_knc = ... -% [0.8000000000000007, 0.9986486486486488; -% 7.759999999999998, 1.0490990990990992; -% 15.84, 1.3234234234234237; -% 23.759999999999998, 1.6702702702702705; -% 31.83999999999999, 1.7585585585585588]; -% -% matrix_speed_up_haswell(:,1) = round(matrix_speed_up_haswell(:,1)); -% matrix_speed_up_cray(:,1) = round(matrix_speed_up_cray(:,1)); -% matrix_speed_up_nvidia(:,1) = round(matrix_speed_up_nvidia(:,1)); -% matrix_speed_up_knc(:,1) = round(matrix_speed_up_knc(:,1)); -% %% -% mrhs_assembly_time_haswell = ... -% [0.8226221079691509, 78.73303167420812; -% 3.86632390745501, 52.26244343891403; -% 7.814910025706938, 36.65158371040724; -% 15.87660668380463, 29.864253393665194; -% 31.835475578406168, 27.149321266968343]; -% -% mrhs_assembly_time_cray = ... -% [0.9871465295629829, 269.4570135746606; -% 4.030848329048842, 171.71945701357464; -% 7.97943444730077, 144.5701357466063; -% 16.041131105398456, 138.46153846153845; -% 31.917737789203088, 132.3529411764706]; -% -% mrhs_assembly_time_nvidia = ... -% [0.9871465295629829, 51.58371040723978; -% 15.958868894601542, 43.43891402714934; -% 32, 43.43891402714934]; -% -% mrhs_assembly_time_knc = ... -% [0.8226221079691509, 74.66063348416293; -% 7.814910025706938, 28.50678733031674; -% 15.87660668380463, 20.361990950226243; -% 31.835475578406168, 16.968325791855193]; -% -% -% mrhs_assembly_time_haswell(:,1) = round(mrhs_assembly_time_haswell(:,1)); -% mrhs_assembly_time_cray(:,1) = round(mrhs_assembly_time_cray(:,1)); -% mrhs_assembly_time_nvidia(:,1) = round(mrhs_assembly_time_nvidia(:,1)); -% mrhs_assembly_time_knc(:,1) = round(mrhs_assembly_time_knc(:,1)); -% -% %% -% mrhs_assembly_speed_up_haswell = ... -% [0.9663930062484223, 0.9955056179775283; -% 4.007778307041386, 1.501123595505618; -% 7.850575807671829, 2.1988764044943823; -% 15.918495895093729, 2.653932584269663; -% 31.96305864552103, 2.91685393258427]; -% -% mrhs_assembly_speed_up_cray = ... -% [0.9663930062484223, 0.9955056179775283; -% 4.08883409453893, 1.571910112359551; -% 8.0040796884194, 1.8550561797752811; -% 16.06536467819216, 1.9359550561797754; -% 32.027257698450505, 2.037078651685394]; -% -% mrhs_assembly_speed_up_nvidia = ... -% [0.9663930062484223, 0.9955056179775283; -% 16.051556502003415, 1.1573033707865177; -% 32.011656252626864, 1.1573033707865177]; -% -% mrhs_assembly_speed_up_knc = ... -% [0.9663930062484223, 0.9955056179775283; -% 7.860438790663787, 2.755056179775281; -% 15.937325226260194, 3.7157303370786523; -% 31.990674997898516, 4.474157303370787]; -% -% mrhs_assembly_speed_up_theoretical = ... -% [0.9663930062484223, 0.9955056179775283; -% 4.094572557370617, 1.8955056179775278; -% 8.010535459105045, 2.2191011235955065; -% 15.994351200650064, 2.4314606741573037; -% 32.116024545378124, 2.542696629213484]; -% -% mrhs_assembly_speed_up_haswell(:,1) = round(mrhs_assembly_speed_up_haswell(:,1)); -% mrhs_assembly_speed_up_cray(:,1) = round(mrhs_assembly_speed_up_cray(:,1)); -% mrhs_assembly_speed_up_nvidia(:,1) = round(mrhs_assembly_speed_up_nvidia(:,1)); -% mrhs_assembly_speed_up_knc(:,1) = round(mrhs_assembly_speed_up_knc(:,1)); -% mrhs_assembly_speed_up_theoretical(:,1) = round(mrhs_assembly_speed_up_theoretical(:,1)); -% %% -% halo_time = zeros(5,6); -% halo_time(:,1:2) = ... -% [1.079518072289158, 0.927835051546392; -% 4.086746987951807, 1.4536082474226788; -% 8.096385542168676, 2.195876288659793; -% 16.11566265060241, 3.9587628865979383; -% 31.999999999999996, 7.422680412371134]; -% -% halo_time(:,[1,3]) = ... -% [0.7710843373493983, 1.0515463917525736; -% 4.086746987951807, 1.6082474226804138; -% 7.865060240963853, 2.3505154639175245; -% 15.807228915662652, 3.9278350515463902; -% 31.922891566265054, 7.824742268041238]; -% -% halo_time(:,[1,4]) = ... -% [0.9253012048192772, 0.927835051546392; -% 3.9325301204819283, 1.4536082474226788; -% 7.942168674698795, 2.1030927835051543; -% 16.11566265060241, 3.8350515463917514; -% 31.999999999999996, 7.608247422680414]; -% -% halo_time(:,[1,5]) = ... -% [0.7710843373493983, 1.0824742268041234; -% 4.009638554216867, 1.731958762886599; -% 7.865060240963853, 2.5670103092783503; -% 16.038554216867468, 5.041237113402062; -% 31.922891566265054, 9.34020618556701]; -% -% halo_time(:,[1,6]) = ... -% [1.0024096385542158, 1.144329896907216; -% 4.009638554216867, 1.8247422680412377; -% 7.942168674698795, 2.7525773195876297; -% 16.038554216867468, 5.443298969072165; -% 31.999999999999996, 10.453608247422682]; -% -% halo_time(:,1) = round(halo_time(:,1)); -% -% %% -% halo_speed_up = zeros(5,6); -% halo_speed_up(:,1:2) = ... -% [0.9230769230769234, 1.0141388174807187; -% 4, 2.6079691516709502; -% 8.000000000000002, 3.4717223650385596; -% 16.07692307692308, 3.8213367609254494; -% 32.15384615384615, 4.088688946015424]; -% -% halo_speed_up(:,[1,3]) = ... -% [0.9230769230769234, 1.0141388174807187; -% 3.8461538461538467, 2.5874035989717212; -% 7.8461538461538485, 3.410025706940874; -% 16, 4.057840616966581; -% 31.846153846153847, 3.9858611825192796]; -% -% halo_speed_up(:,[1,4]) = ... -% [1, 0.9935732647814906; -% 4.153846153846155, 2.5874035989717212; -% 7.923076923076925, 3.5745501285347037; -% 16.07692307692308, 3.996143958868894; -% 32, 4.07840616966581]; -% -% halo_speed_up(:,[1,5]) = ... -% [0.9230769230769234, 1.0038560411311046; -% 3.9230769230769234, 2.597686375321336; -% 8.076923076923078, 3.3791773778920304; -% 16, 3.482005141388174; -% 32, 3.7596401028277633]; -% -% halo_speed_up(:,[1,6]) = ... -% [1, 1.0038560411311046; -% 4, 2.515424164524421; -% 8.000000000000002, 3.2763496143958863; -% 16.07692307692308, 3.30719794344473; -% 32, 3.451156812339331]; -% -% halo_speed_up(:,1) = round(halo_speed_up(:,1)); -% halo_speed_up(1,:) = round(halo_speed_up(1,:)); -% -% %% -% multigrid_time_haswell = ... -% [0.7346938775510221, 161.43497757847535; -% 3.8367346938775526, 115.69506726457405; -% 7.836734693877553, 108.96860986547085; -% 15.836734693877553, 108.96860986547085; -% 31.755102040816325, 107.62331838565024]; -% -% multigrid_time_cray = ... -% [0.9795918367346967, 516.5919282511211; -% 4.0000000000000036, 390.13452914798205; -% 7.918367346938776, 367.2645739910314; -% 15.918367346938776, 360.5381165919282; -% 31.91836734693878, 356.50224215246635]; -% -% multigrid_time_nvidia = ... -% [0.8979591836734713, 217.9372197309417; -% 16.000000000000004, 40.35874439461884; -% 32, 34.97757847533637]; -% -% multigrid_time_knc = ... -% [0.8163265306122458, 357.84753363228697; -% 7.836734693877553, 137.21973094170403; -% 15.836734693877553, 122.42152466367713; -% 31.836734693877553, 96.86098654708519]; -% -% multigrid_time_haswell(:,1) = round(multigrid_time_haswell(:,1)); -% multigrid_time_cray(:,1) = round(multigrid_time_cray(:,1)); -% multigrid_time_nvidia(:,1) = round(multigrid_time_nvidia(:,1)); -% multigrid_time_knc(:,1) = round(multigrid_time_knc(:,1)); -% -% %% -% -% multigrid_speed_up_haswell = ... -% [0.8256346233874332, 1.0224719101123583; -% 3.9409071993341662, 1.4157303370786511; -% 7.8678318768206434, 1.5101123595505612; -% 15.86799833541407, 1.525842696629213; -% 31.86799833541407, 1.525842696629213]; -% -% multigrid_speed_up_cray = ... -% [1.0476903870162317, 1.0067415730337075; -% 4.088056595921765, 1.321348314606741; -% 8.01498127340824, 1.4157303370786511; -% 16.015147732001665, 1.4314606741573028; -% 32.015147732001665, 1.4314606741573028]; -% -% multigrid_speed_up_nvidia = ... -% [1.1210986267166057, 0.9438202247191008; -% 15.98119017894299, 5.222471910112359; -% 32.135996670828135, 5.8516853932584265]; -% -% multigrid_speed_up_knc = ... -% [0.8998751560549323, 1.0382022471910108; -% 7.9542238868081565, 2.6741573033707864; -% 15.883478984602585, 2.988764044943819; -% 31.965709529754477, 3.7595505617977523]; -% -% multigrid_speed_up_haswell(:,1) = round(multigrid_speed_up_haswell(:,1)); -% multigrid_speed_up_cray(:,1) = round(multigrid_speed_up_cray(:,1)); -% multigrid_speed_up_nvidia(:,1) = round(multigrid_speed_up_nvidia(:,1)); -% multigrid_speed_up_knc(:,1) = round(multigrid_speed_up_knc(:,1)); -% -% %% -% multigrid_time = zeros(11,6); -% multigrid_time (:,1:2) = ... -% [1.004601335761512, 0.431561091324417; -% 2.0022310518627857, 0.4648076936073582; -% 3.9907541866293017, 0.5024579804956508; -% 8.067136920042914, 0.6656173335946528; -% 15.871378265692428, 0.6812451424979895; -% 31.611875431385002, 0.6528401603060142; -% 65.54680834192969, 0.8049984118080382; -% 128.93640540214113, 0.8052133245926456; -% 263.7529429587845, 0.8847067251481749; -% 512.2327024531801, 0.8827157406719066; -% 1034.5108168706413, 0.96000324396656]; -% -% multigrid_time (:,[1,3]) = ... -% [0.9898630039192093, 0.24219859833611546; -% 1.972163655048691, 0.24241756607892295; -% 3.781986290199016, 0.2514317381578326; -% 7.736449695170425, 0.3309251387133618; -% 15.41451655389125, 0.33554779106152055; -% 31.501006611194768, 0.3225638149046748; -% 62.81135245994453, 0.39764542093845257; -% 123.54105127778845, 0.38685112220968176; -% 252.4499560516854, 0.36726161914480926; -% 496.95223315463164, 0.4357336433123602; -% 1015.8300692705786, 0.4469699324849459]; -% -% multigrid_time (:,[1,4]) = ... -% [0.9896311818224733, 0.22018017530935952; -% 1.9968919285183184, 0.21379767110234038; -% 3.978621194896021, 0.21621848114782338; -% 8.034514473381059, 0.28469861523177475; -% 15.804975192978107, 0.28711537031905743; -% 31.891504605957156, 0.2807328661120385; -% 64.38430149678541, 0.3227908925638825; -% 128.2797245536246, 0.3252117026093655; -% 262.1025006692223, 0.294612988031115; -% 509.3374728580412, 0.34986990342441215; -% 1041.3420944190705, 0.37872093101840276]; -% -% multigrid_time (:,[1,5]) = ... -% [0.9895152911343404, 0.20917096379598155; -% 2.0481938350469275, 0.1983928849000116; -% 4.028979554277443, 0.198607797684619; -% 8.135828113905916, 0.2626842471632187; -% 16.004272808348748, 0.2651010022505018; -% 32.29213742842352, 0.25431481343813145; -% 66.03065729822492, 0.29637689484817553; -% 128.22565290964383, 0.28557854116120485; -% 258.69919460762884, 0.265984983138132; -% 522.4595100453286, 0.3410706441301099; -% 1041.1469872085095, 0.36110619259699783]; -% -% multigrid_time (:,[1,6]) = ... -% [1.0020632930844884, 0.19376212263545245; -% 2.0218829033820773, 0.18297593382308208; -% 3.9772236101291005, 0.18319084660768947; -% 8.030751609469974, 0.24066176917826287; -% 16.000899443790264, 0.24528442152642138; -% 32.287599599458105, 0.24110375962207797; -% 65.18090612879159, 0.2787581014685707; -% 128.2466780623628, 0.30099143727993405; -% 258.77797808513225, 0.2946089330729149; -% 515.7238781063681, 0.3212500084478296; -% 1040.6837540786007, 0.31927118884616146]; -% -% multigrid_time(:,1) = [1;2;4;8;16;32;64;128;256;512;1024]; -% -% %% -% multigrid_speed_up = zeros(11,5); -% multigrid_speed_up (:,1:2) = ... -% [0.9748386077230256, 1.8175824175824178; -% 1.939765632694965, 1.9593406593406595; -% 3.8598088750025874, 2.0186813186813186; -% 7.778860438260265, 2.0351648351648355; -% 15.282657491732875, 2.0615384615384618; -% 30.79988248222343, 2.0483516483516486; -% 62.86846815377844, 2.064835164835165; -% 123.51388400008273, 2.130769230769231; -% 248.92353402432835, 2.463736263736264; -% 495.3161606896037, 2.0615384615384618; -% 998.2347343083767, 2.173626373626374]; -% -% multigrid_speed_up (:,[1,3]) = ... -% [0.9873391553681163, 1.9791208791208796; -% 2.0153486066729274, 2.1472527472527476; -% 3.959433740543081, 2.2989010989010987; -% 7.979639272217277, 2.3450549450549456; -% 15.677115545750981, 2.384615384615385; -% 31.5948529717797, 2.338461538461539; -% 64.49115541353366, 2.5; -% 128.32660287856152, 2.5032967032967033; -% 258.6228403103788, 2.9714285714285715; -% 501.6676974640312, 2.565934065934066; -% 1023.9999999999993, 2.5758241758241756]; -% -% multigrid_speed_up (:,[1,4]) = ... -% [0.9873391553681163, 2.0813186813186815; -% 2.0153486066729274, 2.308791208791209; -% 4.010206339955046, 2.5; -% 7.979639272217277, 2.5626373626373624; -% 15.878146288957785, 2.6021978021978027; -% 31.5948529717797, 2.6054945054945056; -% 65.31813821309349, 2.753846153846154; -% 126.70187969737844, 2.757142857142857; -% 255.34845671095258, 3.301098901098901; -% 514.6161564485006, 2.5593406593406596; -% 1011.0352950969501, 2.6483516483516487]; -% -% multigrid_speed_up (:,[1,5]) = ... -% [1, 2.104395604395605; -% 1.9898325910847585, 2.374725274725275; -% 3.909303965123828, 2.565934065934066; -% 7.979639272217277, 2.651648351648352; -% 15.677115545750981, 2.6714285714285717; -% 32.4103423084332, 2.5791208791208793; -% 64.49115541353366, 2.803296703296703; -% 126.70187969737844, 2.6483516483516487; -% 255.34845671095258, 2.987912087912088; -% 501.6676974640312, 2.684615384615385; -% 1037.130953869863, 2.9450549450549453]; -% -% multigrid_speed_up(:,1) = [1;2;4;8;16;32;64;128;256;512;1024]; -%% -clear all -close all -clc -load('eric_paper.mat') -load('timers.mat') -s = linspace(1,32,100); - -figure(1); -hold on -plot(throughput_haswell(:,1),throughput_haswell(:,2),'-o','linewidth',2) -plot(throughput_cray(:,1),throughput_cray(:,2),'-o','linewidth',2) -plot(throughput_nvidia(:,1),throughput_nvidia(:,2),'-o','linewidth',2) -plot(throughput_knc(:,1),throughput_knc(:,2),'-o','linewidth',2) -xlim([1,32]) -title('throughput') -grid on -hold off - -figure(2); -hold on -plot(matrix_speed_up_haswell(:,1),matrix_speed_up_haswell(:,2),'-o','linewidth',2) -plot(matrix_speed_up_cray(:,1),matrix_speed_up_cray(:,2),'-o','linewidth',2) -plot(matrix_speed_up_nvidia(:,1),matrix_speed_up_nvidia(:,2),'-o','linewidth',2) -plot(matrix_speed_up_knc(:,1),matrix_speed_up_knc(:,2),'-o','linewidth',2) -%plot(E,E.*timers(6,1)./timers(6,:),'-o','linewidth',2); -xlim([1,32]) -title('matrix x vector speed up') -grid on -hold off - -figure(3); -hold on -plot(mrhs_assembly_time_haswell(:,1),mrhs_assembly_time_haswell(:,2),'-o','linewidth',2) -plot(mrhs_assembly_time_cray(:,1),mrhs_assembly_time_cray(:,2),'-o','linewidth',2) -plot(mrhs_assembly_time_nvidia(:,1),mrhs_assembly_time_nvidia(:,2),'-o','linewidth',2) -plot(mrhs_assembly_time_knc(:,1),mrhs_assembly_time_knc(:,2),'-o','linewidth',2) -xlim([1,32]) -title('matrix and rhs assembly time') -grid on -hold off - -figure(4); -hold on -plot(mrhs_assembly_speed_up_haswell(:,1),mrhs_assembly_speed_up_haswell(:,2),'-o','linewidth',2) -plot(mrhs_assembly_speed_up_cray(:,1),mrhs_assembly_speed_up_cray(:,2),'-o','linewidth',2) -plot(mrhs_assembly_speed_up_nvidia(:,1),mrhs_assembly_speed_up_nvidia(:,2),'-o','linewidth',2) -plot(mrhs_assembly_speed_up_knc(:,1),mrhs_assembly_speed_up_knc(:,2),'-o','linewidth',2) -plot(mrhs_assembly_speed_up_theoretical(:,1),mrhs_assembly_speed_up_theoretical(:,2),'ko','linewidth',2) -plot(s,(8368+4992).*s./(8368+4992.*s),'k','linewidth',2) -title('matrix and rhs speed up') -xlim([1,32]) -grid on -hold off - -figure(5); -hold on -plot(halo_time(:,1),halo_time(:,2),'-o','linewidth',2) -plot(halo_time(:,1),halo_time(:,3),'-o','linewidth',2) -plot(halo_time(:,1),halo_time(:,4),'-o','linewidth',2) -plot(halo_time(:,1),halo_time(:,5),'-o','linewidth',2) -plot(halo_time(:,1),halo_time(:,6),'-o','linewidth',2) -title('halo time') -xlim([1,32]) -grid on -hold off - -figure(6); -hold on -plot(halo_speed_up(:,1),halo_speed_up(:,2),'-o','linewidth',2) -plot(halo_speed_up(:,1),halo_speed_up(:,3),'-o','linewidth',2) -plot(halo_speed_up(:,1),halo_speed_up(:,4),'-o','linewidth',2) -plot(halo_speed_up(:,1),halo_speed_up(:,5),'-o','linewidth',2) -plot(halo_speed_up(:,1),halo_speed_up(:,6),'-o','linewidth',2) -title('halo speed up') -xlim([1,32]) -grid on -hold off - -figure(7); -hold on -plot(multigrid_time_haswell(:,1),multigrid_time_haswell(:,2),'-o','linewidth',2) -plot(multigrid_time_cray(:,1),multigrid_time_cray(:,2),'-o','linewidth',2) -plot(multigrid_time_nvidia(:,1),multigrid_time_nvidia(:,2),'-o','linewidth',2) -plot(multigrid_time_knc(:,1),multigrid_time_knc(:,2),'-o','linewidth',2) -title('multigrid time') -xlim([1,32]) -grid on -hold off - -figure(8); -hold on -plot(multigrid_speed_up_haswell(:,1),multigrid_speed_up_haswell(:,2),'-o','linewidth',2) -plot(multigrid_speed_up_cray(:,1),multigrid_speed_up_cray(:,2),'-o','linewidth',2) -plot(multigrid_speed_up_nvidia(:,1),multigrid_speed_up_nvidia(:,2),'-o','linewidth',2) -plot(multigrid_speed_up_knc(:,1),multigrid_speed_up_knc(:,2),'-o','linewidth',2) -xlim([1,32]) -title('multigrid speed up') -grid on -hold off - -figure(9); -semilogx(multigrid_time(:,1),multigrid_time(:,2),'k-o','linewidth',2) -hold on -plot(multigrid_time(:,1),multigrid_time(:,3),'-o','linewidth',2) -plot(multigrid_time(:,1),multigrid_time(:,4),'-o','linewidth',2) -plot(multigrid_time(:,1),multigrid_time(:,5),'-o','linewidth',2) -plot(multigrid_time(:,1),multigrid_time(:,6),'-o','linewidth',2) -xlim([1,1024]) -title('multigrid time') -grid on -hold off - -figure(10); -semilogx(multigrid_speed_up(:,1),multigrid_speed_up(:,2),'-o','linewidth',2) -hold on -plot(multigrid_speed_up(:,1),multigrid_speed_up(:,3),'-o','linewidth',2) -plot(multigrid_speed_up(:,1),multigrid_speed_up(:,4),'-o','linewidth',2) -plot(multigrid_speed_up(:,1),multigrid_speed_up(:,5),'-o','linewidth',2) -xlim([1,1024]) -title('multigrid speed up') -grid on -hold off - -%% -s = linspace(1,64,100); -%close all -p = polyfit(halo_time(1:3,1),halo_time(1:3,2),1); - -figure(11); -subplot(1,2,1) -hold on -plot(halo_time(:,1),halo_time(:,2),'-o','linewidth',2) -plot(s,polyval(p,s),'k','linewidth',2) -title('halo time') -%xlim([1,32]) -grid on -hold off -subplot(1,2,2) -hold on -%plot(halo_speed_up(:,1),halo_speed_up(:,2),'-o','linewidth',2) -plot(halo_time(:,1),(halo_time(:,1).*halo_time(1,2))./halo_time(:,2),'-o','linewidth',2) -plot(s,polyval(p,1).*s./polyval(p,s),'k','linewidth',2) -plot([min(s),max(s)],[(sum(p))/p(1),(sum(p))/p(1)],'k--','linewidth',2) -title('halo speed up') -%xlim([1,32]) -grid on -hold off - - diff --git a/katoptron/matlab/ensemble/eric_paper.mat b/katoptron/matlab/ensemble/eric_paper.mat deleted file mode 100644 index 1fe2848fa6caa4f96ed19ac814a9e998508d919f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4953 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 L0Tf7yUK{&ATpe{_ diff --git a/katoptron/matlab/ensemble/timers.mat b/katoptron/matlab/ensemble/timers.mat deleted file mode 100644 index f2bd7eb04e3c5b3b36b8dc7af2a04128daf99749..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 689 zcmeZu4DoSvQZUssQ1EpO(M`+DN!3vZ$Vn_o%P-2c0*X0%nwjV*I2WZRmZYXA<mXu_ zgp{T#I2IHs7?~;<nphbaTbY<E7#SFvD-a79V1UunmmkRX0OE={kCPJ;JQ$M96rMF) zQaHf%)R<|b!W6cTbMHPj_73XqifqVHRp?9YOtj=^Yj0eW?C^_)+xm5#LjT;a3IfF& zoX#*aoZrv$8DyRr+`JEH=FLb;DPX<iV_+xDEzK^@Kfhr@$BdRKJ#&~s<QeR(7{7va z&t?R<CN{{{`*46r?W6RC9E%p+wYuu5(UIYhdrR%(>T5@?<cm1+aEW>c2X6QCyUXPy zd&E=VxZXcjNA=}-bLYs!-1VvQlRLux@X5XEb34C3OAX-ocv;tFemgVMi}`WK{@ycw zVjH_A^xQfBQ|kl--~YXO*|+pu`m22p=XY?)gv$P}IlD^!{Xfot6|$d|gLz*cJ5YXX zX8Z(>SpJeM$5#eVSw1Nptjql7Z!FJx?E8{+%x6`8tIj;H<d<?IpXKA*g;!Xs55zO- zrz`Yje(5gWpZqE6f@|opBR7<4O_jcPSO;DA+#PvjEzhf~s!12}g+4yc+!23v!F#U# z&J9+Tmk(@zWPjJF<gCrl)pvr^?OVTcuROeWO`*Q<j@iuTc}t8t;=R7)Cht!a{uem= zkIfH%tM`tL^Fyau-RW-q<J<Us-tzu~b;TXs>#jVE%XyN``t0WUix&TFKHTIzA9?>l z&FwSmi|t-XY5uSYS;AK;{d1q}i`>coXZpoSeY~4maqgAckFT{qw5R=<x8ifXMr>>8 ZTip-!{2gMi*#ZyWxqtnYeA_Gkn*h5PCbR$m diff --git a/katoptron/matlab/gmsh/distancePointPlane.m b/katoptron/matlab/gmsh/distancePointPlane.m deleted file mode 100644 index 356697c1..00000000 --- a/katoptron/matlab/gmsh/distancePointPlane.m +++ /dev/null @@ -1,13 +0,0 @@ -function d = distancePointPlane(point, plane) -%DISTANCEPOINTPLANE Signed distance betwen 3D point and plane -% -% D = distancePointPlane(POINT, PLANE) -% Returns the euclidean distance between point POINT and the plane PLANE, -% given by: -% POINT : [x0 y0 z0] -% PLANE : [a b c d] -% D : scalar - - -d = (plane(1)*point(1)+plane(2)*point(2)+plane(3)*point(3)+plane(4))... - /sqrt(plane(1)^2+plane(2)^2+plane(3)^2); \ No newline at end of file diff --git a/katoptron/matlab/gmsh/readMshFile.m b/katoptron/matlab/gmsh/readMshFile.m deleted file mode 100644 index bf89cf7e..00000000 --- a/katoptron/matlab/gmsh/readMshFile.m +++ /dev/null @@ -1,68 +0,0 @@ -function [Nodes,Elements] = readMshFile(filename) - - fileID = fopen(filename,'r'); - - tline = fgetl(fileID); - - stop = false; - while 1 - if strcmp(tline,'$Nodes') - disp('Start reading nodes'); - while 1 - tline = fgetl(fileID); - if strcmp(tline,'$EndNodes') - break - end - tmp = strread(tline); - if length(tmp) == 1 - Nodes = zeros(tmp,3); - else - Nodes(tmp(1),:) = tmp(2:4); - end - end - disp('Stop reading nodes'); - elseif strcmp(tline,'$Elements') - disp('Start reading elements'); - while 1 - tline = fgetl(fileID); - if strcmp(tline,'$EndElements') - stop = true; - break - end - tmp = strread(tline); - if length(tmp) == 1 - Elements = zeros(tmp,9); - else - Elements(tmp(1),1) = tmp(2); - - switch Elements(tmp(1),1) - case 1 - %segment - Elements(tmp(1),(end-1):end)= tmp((end-1):end); - case 2 - %triangle - Elements(tmp(1),(end-2):end)= tmp((end-2):end); - case 3 - %quadrangle - Elements(tmp(1),(end-3):end)= tmp((end-3):end); - case 4 - %tetrahedron - Elements(tmp(1),(end-3):end)= tmp((end-3):end); - case 5 - %hexahedron - Elements(tmp(1),(end-7):end)= tmp((end-7):end); - end - - end - end - disp('Stop reading elements'); - end - if stop - break - end - tline = fgetl(fileID); - end - - fclose(fileID); - -end diff --git a/katoptron/matlab/gmsh/showMsh.m b/katoptron/matlab/gmsh/showMsh.m deleted file mode 100644 index 8c886c41..00000000 --- a/katoptron/matlab/gmsh/showMsh.m +++ /dev/null @@ -1,129 +0,0 @@ -function [fig] = showMsh(filename, plane, point, vec1, vec2, tol) - - [Nodes,Elements] = readMshFile(filename); - - fig = figure; - - hold on - for i=1:size(Nodes,1) - if distancePointPlane(Nodes(i,:), plane) < tol - x = (Nodes(i,:)-point)*vec1'; - y = (Nodes(i,:)-point)*vec2'; - plot(x,y,'k.','MarkerSize',10); - end - end - - for i=1:size(Elements,1) - switch Elements(i,1) - case 1 - %segment - if distancePointPlane(Nodes(Elements(i,end-1),:), plane) < tol && ... - distancePointPlane(Nodes(Elements(i,end),:), plane) < tol - - x1 = (Nodes(Elements(i,end-1),:)-point)*vec1'; - x2 = (Nodes(Elements(i,end),:)-point)*vec1'; - y1 = (Nodes(Elements(i,end-1),:)-point)*vec2'; - y2 = (Nodes(Elements(i,end),:)-point)*vec2'; - plot([x1,x2],[y1,y2],'k'); - - end - - case 2 - %triangle - for j=1:3 - index1 = size(Elements,2)-j; - if j==3 - index1 = size(Elements,2); - end - index2 = size(Elements,2)-j+1; - if distancePointPlane(Nodes(Elements(i,index1),:), plane) < tol && ... - distancePointPlane(Nodes(Elements(i,index2),:), plane) < tol - - x1 = (Nodes(Elements(i,index1),:)-point)*vec1'; - x2 = (Nodes(Elements(i,index2),:)-point)*vec1'; - y1 = (Nodes(Elements(i,index1),:)-point)*vec2'; - y2 = (Nodes(Elements(i,index2),:)-point)*vec2'; - plot([x1,x2],[y1,y2],'k'); - - end - end - case 3 - %quadrangle - for j=1:4 - index1 = size(Elements,2)-j; - if j==4 - index1 = size(Elements,2); - end - index2 = size(Elements,2)-j+1; - if distancePointPlane(Nodes(Elements(i,index1),:), plane) < tol && ... - distancePointPlane(Nodes(Elements(i,index2),:), plane) < tol - - x1 = (Nodes(Elements(i,index1),:)-point)*vec1'; - x2 = (Nodes(Elements(i,index2),:)-point)*vec1'; - y1 = (Nodes(Elements(i,index1),:)-point)*vec2'; - y2 = (Nodes(Elements(i,index2),:)-point)*vec2'; - plot([x1,x2],[y1,y2],'k'); - - end - end - case 5 - %hexahedron - for j=1:4 - index1 = size(Elements,2)-j; - if j==4 - index1 = size(Elements,2); - end - index2 = size(Elements,2)-j+1; - if distancePointPlane(Nodes(Elements(i,index1),:), plane) < tol && ... - distancePointPlane(Nodes(Elements(i,index2),:), plane) < tol - - x1 = (Nodes(Elements(i,index1),:)-point)*vec1'; - x2 = (Nodes(Elements(i,index2),:)-point)*vec1'; - y1 = (Nodes(Elements(i,index1),:)-point)*vec2'; - y2 = (Nodes(Elements(i,index2),:)-point)*vec2'; - plot([x1,x2],[y1,y2],'k'); - - end - end - for j=1:4 - index1 = size(Elements,2)-j-4; - if j==4 - index1 = size(Elements,2)-4; - end - index2 = size(Elements,2)-j-3; - if distancePointPlane(Nodes(Elements(i,index1),:), plane) < tol && ... - distancePointPlane(Nodes(Elements(i,index2),:), plane) < tol - - x1 = (Nodes(Elements(i,index1),:)-point)*vec1'; - x2 = (Nodes(Elements(i,index2),:)-point)*vec1'; - y1 = (Nodes(Elements(i,index1),:)-point)*vec2'; - y2 = (Nodes(Elements(i,index2),:)-point)*vec2'; - plot([x1,x2],[y1,y2],'k'); - - end - end - for j=1:4 - index1 = size(Elements,2)-j-4; - if j==4 - index1 = size(Elements,2)-4; - end - index2 = size(Elements,2)-j; - if j==4 - index2 = size(Elements,2); - end - if distancePointPlane(Nodes(Elements(i,index1),:), plane) < tol && ... - distancePointPlane(Nodes(Elements(i,index2),:), plane) < tol - - x1 = (Nodes(Elements(i,index1),:)-point)*vec1'; - x2 = (Nodes(Elements(i,index2),:)-point)*vec1'; - y1 = (Nodes(Elements(i,index1),:)-point)*vec2'; - y2 = (Nodes(Elements(i,index2),:)-point)*vec2'; - plot([x1,x2],[y1,y2],'k'); - - end - end - end - - end - axis equal -end \ No newline at end of file diff --git a/katoptron/matlab/gmsh/test_readMshFile.m b/katoptron/matlab/gmsh/test_readMshFile.m deleted file mode 100644 index d6b20049..00000000 --- a/katoptron/matlab/gmsh/test_readMshFile.m +++ /dev/null @@ -1,80 +0,0 @@ -clear all -close all -clc - -filename = '../tests/aa.msh'; -[Nodes,Elements] = readMshFile(filename); - - -figure -hold on -for i=1:size(Nodes,1) - - -end - -for i=1:size(Elements,1) - switch Elements(i,1) - case 1 - %segment - plot3([Nodes(Elements(i,end-1),1),Nodes(Elements(i,end),1)],... - [Nodes(Elements(i,end-1),2),Nodes(Elements(i,end),2)],... - [Nodes(Elements(i,end-1),3),Nodes(Elements(i,end),3)],'k'); - case 2 - %triangle - for j=1:3 - plot3([Nodes(Elements(i,end-j),1),Nodes(Elements(i,end-j+1),1)],... - [Nodes(Elements(i,end-j),2),Nodes(Elements(i,end-j+1),2)],... - [Nodes(Elements(i,end-j),3),Nodes(Elements(i,end-j+1),3)],'k'); - end - case 3 - %quadrangle - for j=1:4 - index1 = size(Elements,2)-j; - if j==4 - index1 = size(Elements,2); - end - index2 = size(Elements,2)-j+1; - plot3([Nodes(Elements(i,index1),1),Nodes(Elements(i,index2),1)],... - [Nodes(Elements(i,index1),2),Nodes(Elements(i,index2),2)],... - [Nodes(Elements(i,index1),3),Nodes(Elements(i,index2),3)],'k'); - end - case 5 - %hexahedron - for j=1:4 - index1 = size(Elements,2)-j; - if j==4 - index1 = size(Elements,2); - end - index2 = size(Elements,2)-j+1; - plot3([Nodes(Elements(i,index1),1),Nodes(Elements(i,index2),1)],... - [Nodes(Elements(i,index1),2),Nodes(Elements(i,index2),2)],... - [Nodes(Elements(i,index1),3),Nodes(Elements(i,index2),3)],'k'); - end - for j=1:4 - index1 = size(Elements,2)-j-4; - if j==4 - index1 = size(Elements,2)-4; - end - index2 = size(Elements,2)-j-3; - plot3([Nodes(Elements(i,index1),1),Nodes(Elements(i,index2),1)],... - [Nodes(Elements(i,index1),2),Nodes(Elements(i,index2),2)],... - [Nodes(Elements(i,index1),3),Nodes(Elements(i,index2),3)],'k'); - end - for j=1:4 - index1 = size(Elements,2)-j-4; - if j==4 - index1 = size(Elements,2)-4; - end - index2 = size(Elements,2)-j; - if j==4 - index2 = size(Elements,2); - end - plot3([Nodes(Elements(i,index1),1),Nodes(Elements(i,index2),1)],... - [Nodes(Elements(i,index1),2),Nodes(Elements(i,index2),2)],... - [Nodes(Elements(i,index1),3),Nodes(Elements(i,index2),3)],'k'); - end - end - -end -axis equal \ No newline at end of file diff --git a/katoptron/matlab/gmsh/test_showMsh.m b/katoptron/matlab/gmsh/test_showMsh.m deleted file mode 100644 index c549d99c..00000000 --- a/katoptron/matlab/gmsh/test_showMsh.m +++ /dev/null @@ -1,12 +0,0 @@ -clear all -close all -clc - -filename = '../tests/aa.msh'; -tol = 0.00001; -plane = [0,1,0,0]; -point = [0,0,0]; -vec1 = [1,0,0]; -vec2 = [0,0,1]; - -[fig] = showMsh(filename, plane, point, vec1, vec2, tol); \ No newline at end of file diff --git a/katoptron/matlab/matrix graph/load_crs_matrix.m b/katoptron/matlab/matrix graph/load_crs_matrix.m deleted file mode 100644 index 04cf7ba7..00000000 --- a/katoptron/matlab/matrix graph/load_crs_matrix.m +++ /dev/null @@ -1,42 +0,0 @@ -function [ A ] = load_crs_matrix( file_name, ensemble_size, sample ) - - -crsA = []; - -fid = fopen(file_name); - -tline = fgets(fid); -while length(tline) >=2 - words = strsplit(tline); - if ensemble_size > 1 && length(words) >= 4+ensemble_size - if length(crsA) == 0 - crsA = zeros(1,3); - crsA(1) = str2num(char(words(1)))+1; - crsA(2) = str2num(char(words(2)))+1; - crsA(3) = str2num(char(words(3+sample))); - else - - crsA = [crsA; str2num(char(words(1)))+1, str2num(char(words(2)))+1, str2num(char(words(3+sample)))]; - end - - elseif ensemble_size == 1 && length(words) >= 3 - if length(crsA) == 0 - crsA = zeros(1,3); - crsA(1) = str2num(char(words(1)))+1; - crsA(2) = str2num(char(words(2)))+1; - crsA(3) = str2num(char(words(3))); - else - - crsA = [crsA; str2num(char(words(1)))+1, str2num(char(words(2)))+1, str2num(char(words(3)))]; - end - - end - tline = fgets(fid); -end - -fclose(fid); - -A = crsA; - -end - diff --git a/katoptron/matlab/matrix graph/show_graph.m b/katoptron/matlab/matrix graph/show_graph.m deleted file mode 100644 index b85cc5ad..00000000 --- a/katoptron/matlab/matrix graph/show_graph.m +++ /dev/null @@ -1,52 +0,0 @@ -function show_graph(A,type) - - figure; - xmax = size(A,2); - ymax = size(A,1); - if type == 'C' - imagesc([0.5 xmax-0.5],[0.5 ymax-0.5],A); - else - imagesc([1.5 xmax+0.5],[1.5 ymax+0.5],A); - end - axis equal - grid on - box on - %colorbar - - - if type == 'C' - xlim([0,xmax]); - ylim([0,ymax]); - - tmp = []; - for i=1:xmax - tmp = [tmp, i-1]; - end - set(gca,'XTick',tmp) - tmp = []; - for i=1:ymax - tmp = [tmp, i-1]; - end - set(gca,'YTick',tmp) - else - xlim([1,xmax+1]); - ylim([1,ymax+1]); - - tmp = []; - for i=1:xmax - tmp = [tmp, i]; - end - set(gca,'XTick',tmp) - tmp = []; - for i=1:ymax - tmp = [tmp, i]; - end - set(gca,'YTick',tmp) - end - caxis([0,1]); - - set(gca,'fontsize',18) - - colormap(gray); - colormap(flipud(colormap)); -end \ No newline at end of file diff --git a/katoptron/matlab/matrix graph/show_trilinos_graph.m b/katoptron/matlab/matrix graph/show_trilinos_graph.m deleted file mode 100644 index 6d5f5b67..00000000 --- a/katoptron/matlab/matrix graph/show_trilinos_graph.m +++ /dev/null @@ -1,31 +0,0 @@ -function [H] = show_trilinos_graph(file_name) - -trilinos_out = load(file_name); - -matrix = trilinos_out; -matrix(:,1) = matrix(:,1)+1; -matrix(:,2) = matrix(:,2)+1; - -matrix(1,:) - -zero_indices = []; - -tol = 10^(-16); - -for i=1:size(matrix,1) - if abs(matrix(i,3)) < tol - zero_indices = [zero_indices, i]; - elseif matrix(i,1) < 1 || matrix(i,2) < 1 - zero_indices = [zero_indices, i]; - disp(strcat('Attention, file: ',file_name,' line: ', int2str(i))); - end - -end - -matrix = matrix(setdiff(1:size(matrix,1),zero_indices),1:3); - -H = spconvert(matrix); -%spy(H); - -end - diff --git a/katoptron/matlab/matrix graph/testSchur.m b/katoptron/matlab/matrix graph/testSchur.m deleted file mode 100644 index 24747c86..00000000 --- a/katoptron/matlab/matrix graph/testSchur.m +++ /dev/null @@ -1,70 +0,0 @@ -clear all -close all -clc - -ensemble_size = 2; - - -A = load_crs_matrix( 'Schur test input/A 1.txt', ensemble_size,1 ); -B_T = load_crs_matrix( 'Schur test input/B_T1.txt', ensemble_size,1 ); - -B1 = load_crs_matrix( 'Schur test input/B1.txt', ensemble_size,1 ); -C1 = load_crs_matrix( 'Schur test input/C1.txt', ensemble_size,1 ); - -B2 = load_crs_matrix( 'Schur test input/B1.txt', ensemble_size,2 ); -C2 = load_crs_matrix( 'Schur test input/C1.txt', ensemble_size,2 ); - -%load('schur_test.mat') - -%format longEng - -format long - -crsA = spconvert(A); -crsB_T = spconvert(B_T); -crsB1 = spconvert(B1); -crsB2 = spconvert(B2); -crsC1 = spconvert(C1); -crsC2 = spconvert(C2); - -n = size(crsA,1); -n_2 = size(crsB_T,1); -m = size(crsB_T,2); - -fullA = full(crsA); -fullB_T = zeros(n,m); -tmpfullB_T = full(crsB_T); -fullB_T(1:n_2,:) = tmpfullB_T; - -fullC1 = zeros(m,m); -fullC2 = zeros(m,m); - -tmpfullC1 = full(crsC1); -tmpfullC2 = full(crsC2); - -fullC1(1:size(crsC1,1),1:size(crsC1,2)) = tmpfullC1; -fullC2(1:size(crsC2,1),1:size(crsC2,2)) = tmpfullC2; - - -fullB1 = zeros(m,n); -fullB2 = zeros(m,n); - -tmpfullB1 = full(crsB1); -tmpfullB2 = full(crsB2); - -fullB1(1:size(crsB1,1),1:size(crsB1,2)) = tmpfullB1; -fullB2(1:size(crsB2,1),1:size(crsB2,2)) = tmpfullB2; - -invDiagA = diag(1./diag(fullA)); - -Schur1 = fullC1 - fullB1*invDiagA*fullB_T; -Schur2 = fullC2 - fullB2*invDiagA*fullB_T; - -crsSchur1 = sparse(Schur1); -crsSchur2 = sparse(Schur2); - -diagEnsemble = [full(diag(crsSchur1)),full( diag(crsSchur2))] - - - - diff --git a/katoptron/matlab/matrix graph/test_show_graph.m b/katoptron/matlab/matrix graph/test_show_graph.m deleted file mode 100644 index 36f54c42..00000000 --- a/katoptron/matlab/matrix graph/test_show_graph.m +++ /dev/null @@ -1,42 +0,0 @@ -close all -clear all - -XWO0 = [1,1,0,0,0; - 1,1,1,0,0; - 0,1,1,0,0; - 0,0,0,0,0; - 0,0,0,0,0]; -XWO1 = [0,0,0,0,0; - 0,0,0,0,0; - 0,0,1,1,0; - 0,0,1,1,1; - 0,0,0,1,1]; - -X0 = [1,1,0,0,0; - 1,1,1,0,0; - 0,1,1,1,0; - 0,0,0,0,0; - 0,0,0,0,0]; - -X1 = [0,0,0,0,0; - 0,0,0,0,0; - 0,0,0,0,0; - 0,0,1,1,1; - 0,0,0,1,1]; - -XG = [1,1,0,0,0; - 1,1,1,0,0; - 0,1,1,1,0; - 0,0,1,1,1; - 0,0,0,1,1]; - -show_graph(XWO0,'C') -%matlab2tikz('XWO0.txt') -show_graph(XWO1,'C') -%matlab2tikz('XWO1.txt') -show_graph(XG,'C') -%matlab2tikz('XG.txt') -show_graph(X0,'C') -%matlab2tikz('X0.txt') -show_graph(X1,'C') -%matlab2tikz('X1.txt') \ No newline at end of file diff --git a/katoptron/preconditioners/AMG_BGS_gs_gs.xml b/katoptron/preconditioners/AMG_BGS_gs_gs.xml deleted file mode 100644 index 65889a5d..00000000 --- a/katoptron/preconditioners/AMG_BGS_gs_gs.xml +++ /dev/null @@ -1,232 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Elasticity 3 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 3 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) Heat equation--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 1 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 1 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- It needs information about the coarse map for block 1 (myCoarseMap1 in this - example). It builds a new coarse map starting with GIDs from myCoarseMap1.maxGID + 1. - The number of GIDs is determined using the aggregation information. Since we are - reusing the aggregation from the first sub block for this sub block we have to - provide that information (myAggFact1). In fact, the information should also available - through the group "mySecondGroup", but it does not hurt here. --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="BlockedCoarseMapFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from elasticity block! --> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - <Parameter name="Striding info" type="string" value="{ 1 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from elasticity block! --> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from elasticity block! --> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="1."/> - </ParameterList> - </ParameterList> - - <ParameterList name="mySmooFact2"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="1."/> - </ParameterList> - </ParameterList> - - - <!-- Use Block GS: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="BlockedGaussSeidelSmoother"/> - <Parameter name="Sweeps" type="int" value="3"/> - <Parameter name="Damping factor" type="double" value="1.0"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Smoother" type="string" value="mySmooFact2"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/BraessSarazin_cheby.xml b/katoptron/preconditioners/BraessSarazin_cheby.xml deleted file mode 100644 index 1b9d268f..00000000 --- a/katoptron/preconditioners/BraessSarazin_cheby.xml +++ /dev/null @@ -1,243 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="CHEBYSHEV"/> - <ParameterList name="ParameterList"> - <Parameter name="degree" type="int" value="2"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="CHEBYSHEV"/> - <ParameterList name="ParameterList"> - <Parameter name="degree" type="int" value="2"/> - </ParameterList> - </ParameterList> - - <!-- Use Braess-Sarazin: --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="BraessSarazinSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/BraessSarazin_direct.xml b/katoptron/preconditioners/BraessSarazin_direct.xml deleted file mode 100644 index e4128204..00000000 --- a/katoptron/preconditioners/BraessSarazin_direct.xml +++ /dev/null @@ -1,237 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <!-- Use Braess-Sarazin: --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="BraessSarazinSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/BraessSarazin_gs.xml b/katoptron/preconditioners/BraessSarazin_gs.xml deleted file mode 100644 index 348a4f7c..00000000 --- a/katoptron/preconditioners/BraessSarazin_gs.xml +++ /dev/null @@ -1,249 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Use Braess-Sarazin: --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="BraessSarazinSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/BraessSarazin_jacobi.xml b/katoptron/preconditioners/BraessSarazin_jacobi.xml deleted file mode 100644 index ba583b55..00000000 --- a/katoptron/preconditioners/BraessSarazin_jacobi.xml +++ /dev/null @@ -1,249 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Jacobi"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Jacobi"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Use Braess-Sarazin: --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="BraessSarazinSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/BraessSarazin_mtgs.xml b/katoptron/preconditioners/BraessSarazin_mtgs.xml deleted file mode 100644 index aa57ebe1..00000000 --- a/katoptron/preconditioners/BraessSarazin_mtgs.xml +++ /dev/null @@ -1,251 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: symmetric matrix structure" type="bool" value="True"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: symmetric matrix structure" type="bool" value="True"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Use Braess-Sarazin: --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="BraessSarazinSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/IndefiniteBlockDiagonal_cheby.xml b/katoptron/preconditioners/IndefiniteBlockDiagonal_cheby.xml deleted file mode 100644 index 9994cda6..00000000 --- a/katoptron/preconditioners/IndefiniteBlockDiagonal_cheby.xml +++ /dev/null @@ -1,250 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="CHEBYSHEV"/> - <ParameterList name="ParameterList"> - <Parameter name="degree" type="int" value="2"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="CHEBYSHEV"/> - <ParameterList name="ParameterList"> - <Parameter name="degree" type="int" value="2"/> - </ParameterList> - </ParameterList> - - <!-- Use indefinite block diagonal smoother: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="IndefiniteBlockDiagonalSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/IndefiniteBlockDiagonal_direct.xml b/katoptron/preconditioners/IndefiniteBlockDiagonal_direct.xml deleted file mode 100644 index 0eb1c647..00000000 --- a/katoptron/preconditioners/IndefiniteBlockDiagonal_direct.xml +++ /dev/null @@ -1,244 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <!-- Use indefinite block diagonal smoother: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="IndefiniteBlockDiagonalSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/IndefiniteBlockDiagonal_gs.xml b/katoptron/preconditioners/IndefiniteBlockDiagonal_gs.xml deleted file mode 100644 index 4860200f..00000000 --- a/katoptron/preconditioners/IndefiniteBlockDiagonal_gs.xml +++ /dev/null @@ -1,256 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Use indefinite block diagonal smoother: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="IndefiniteBlockDiagonalSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/IndefiniteBlockDiagonal_jacobi.xml b/katoptron/preconditioners/IndefiniteBlockDiagonal_jacobi.xml deleted file mode 100644 index b13e54b2..00000000 --- a/katoptron/preconditioners/IndefiniteBlockDiagonal_jacobi.xml +++ /dev/null @@ -1,256 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Jacobi"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Jacobi"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Use indefinite block diagonal smoother: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="IndefiniteBlockDiagonalSmoother"/> - <Parameter name="Sweeps" type="int" value="3"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/IndefiniteBlockDiagonal_mtgs.xml b/katoptron/preconditioners/IndefiniteBlockDiagonal_mtgs.xml deleted file mode 100644 index c6a9d26e..00000000 --- a/katoptron/preconditioners/IndefiniteBlockDiagonal_mtgs.xml +++ /dev/null @@ -1,258 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: symmetric matrix structure" type="bool" value="True"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: symmetric matrix structure" type="bool" value="True"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Use indefinite block diagonal smoother: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="IndefiniteBlockDiagonalSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLEC_cheby.xml b/katoptron/preconditioners/SIMPLEC_cheby.xml deleted file mode 100644 index 6a860ca0..00000000 --- a/katoptron/preconditioners/SIMPLEC_cheby.xml +++ /dev/null @@ -1,251 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="CHEBYSHEV"/> - <ParameterList name="ParameterList"> - <Parameter name="degree" type="int" value="2"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <!--<Parameter name="lumping" type="bool" value="true"/>--> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="CHEBYSHEV"/> - <ParameterList name="ParameterList"> - <Parameter name="degree" type="int" value="2"/> - </ParameterList> - </ParameterList> - - <!-- Use SIMPLEC: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <Parameter name="UseSIMPLEC" type="bool" value="true"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLEC_direct.xml b/katoptron/preconditioners/SIMPLEC_direct.xml deleted file mode 100644 index 181f71e6..00000000 --- a/katoptron/preconditioners/SIMPLEC_direct.xml +++ /dev/null @@ -1,245 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <!--<Parameter name="lumping" type="bool" value="true"/>--> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <!-- Use SIMPLEC: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <Parameter name="UseSIMPLEC" type="bool" value="true"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLEC_gs.xml b/katoptron/preconditioners/SIMPLEC_gs.xml deleted file mode 100644 index aa8574d4..00000000 --- a/katoptron/preconditioners/SIMPLEC_gs.xml +++ /dev/null @@ -1,257 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <!--<Parameter name="lumping" type="bool" value="true"/>--> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Use SIMPLEC: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <Parameter name="UseSIMPLEC" type="bool" value="true"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLEC_jacobi.xml b/katoptron/preconditioners/SIMPLEC_jacobi.xml deleted file mode 100644 index 0748d678..00000000 --- a/katoptron/preconditioners/SIMPLEC_jacobi.xml +++ /dev/null @@ -1,257 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Jacobi"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <!--<Parameter name="lumping" type="bool" value="true"/>--> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Jacobi"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Use SIMPLEC: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="3"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <Parameter name="UseSIMPLEC" type="bool" value="true"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLEC_mtgs.xml b/katoptron/preconditioners/SIMPLEC_mtgs.xml deleted file mode 100644 index 750a4c79..00000000 --- a/katoptron/preconditioners/SIMPLEC_mtgs.xml +++ /dev/null @@ -1,259 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: symmetric matrix structure" type="bool" value="True"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <!--<Parameter name="lumping" type="bool" value="true"/>--> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: symmetric matrix structure" type="bool" value="True"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Use SIMPLEC: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <Parameter name="UseSIMPLEC" type="bool" value="true"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLE_cheby.xml b/katoptron/preconditioners/SIMPLE_cheby.xml deleted file mode 100644 index 27fc352b..00000000 --- a/katoptron/preconditioners/SIMPLE_cheby.xml +++ /dev/null @@ -1,251 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="CHEBYSHEV"/> - <ParameterList name="ParameterList"> - <Parameter name="degree" type="int" value="2"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="CHEBYSHEV"/> - <ParameterList name="ParameterList"> - <Parameter name="degree" type="int" value="2"/> - </ParameterList> - </ParameterList> - - <!-- Use SIMPLE: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <Parameter name="UseSIMPLEC" type="bool" value="false"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLE_direct.xml b/katoptron/preconditioners/SIMPLE_direct.xml deleted file mode 100644 index bbb4f080..00000000 --- a/katoptron/preconditioners/SIMPLE_direct.xml +++ /dev/null @@ -1,245 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <!-- Use SIMPLE: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="1."/> - <Parameter name="UseSIMPLEC" type="bool" value="false"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLE_direct_2_lvls.xml b/katoptron/preconditioners/SIMPLE_direct_2_lvls.xml deleted file mode 100644 index c1caa86a..00000000 --- a/katoptron/preconditioners/SIMPLE_direct_2_lvls.xml +++ /dev/null @@ -1,245 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <!-- Use SIMPLE: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="1."/> - <Parameter name="UseSIMPLEC" type="bool" value="false"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="2"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLE_gs.xml b/katoptron/preconditioners/SIMPLE_gs.xml deleted file mode 100644 index a2ec20ff..00000000 --- a/katoptron/preconditioners/SIMPLE_gs.xml +++ /dev/null @@ -1,257 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="1."/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="1."/> - </ParameterList> - </ParameterList> - - <!-- Use SIMPLE: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="1."/> - <Parameter name="UseSIMPLEC" type="bool" value="false"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLE_gs.xml.in b/katoptron/preconditioners/SIMPLE_gs.xml.in deleted file mode 100644 index 8bed4cda..00000000 --- a/katoptron/preconditioners/SIMPLE_gs.xml.in +++ /dev/null @@ -1,257 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ $BLOCK_00_STRIDING_INFO }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ $BLOCK_00_STRIDING_INFO }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ $BLOCK_00_STRIDING_INFO }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ $BLOCK_11_STRIDING_INFO }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ $BLOCK_11_STRIDING_INFO }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ $BLOCK_11_STRIDING_INFO }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="$BLOCK_11_STRIDING_INFO"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="$BLOCK_00_GS_sweeps"/> - <Parameter name="relaxation: damping factor" type="double" value="$BLOCK_00_GS_damping"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="$SCHUR_omega"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="$BLOCK_11_GS_sweeps"/> - <Parameter name="relaxation: damping factor" type="double" value="$BLOCK_11_GS_damping"/> - </ParameterList> - </ParameterList> - - <!-- Use SIMPLE: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="$SimpleSmoother_damping"/> - <Parameter name="UseSIMPLEC" type="bool" value="false"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLE_gs_2_lvls.xml b/katoptron/preconditioners/SIMPLE_gs_2_lvls.xml deleted file mode 100644 index be2fa416..00000000 --- a/katoptron/preconditioners/SIMPLE_gs_2_lvls.xml +++ /dev/null @@ -1,257 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="1."/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="1."/> - </ParameterList> - </ParameterList> - - <!-- Use SIMPLE: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="1."/> - <Parameter name="UseSIMPLEC" type="bool" value="false"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="2"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockDirectSolver"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLE_gs_3_sweeps.xml b/katoptron/preconditioners/SIMPLE_gs_3_sweeps.xml deleted file mode 100644 index 5cc57667..00000000 --- a/katoptron/preconditioners/SIMPLE_gs_3_sweeps.xml +++ /dev/null @@ -1,257 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="1."/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="1."/> - </ParameterList> - </ParameterList> - - <!-- Use SIMPLE: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="1."/> - <Parameter name="UseSIMPLEC" type="bool" value="false"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLE_gs_direct.xml.in b/katoptron/preconditioners/SIMPLE_gs_direct.xml.in deleted file mode 100644 index 60705f07..00000000 --- a/katoptron/preconditioners/SIMPLE_gs_direct.xml.in +++ /dev/null @@ -1,250 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ $BLOCK_00_STRIDING_INFO }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ $BLOCK_00_STRIDING_INFO }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ $BLOCK_00_STRIDING_INFO }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ $BLOCK_11_STRIDING_INFO }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ $BLOCK_11_STRIDING_INFO }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ $BLOCK_11_STRIDING_INFO }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="$BLOCK_11_STRIDING_INFO"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="$BLOCK_00_GS_sweeps"/> - <Parameter name="relaxation: damping factor" type="$BLOCK_00_GS_damping"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="$SCHUR_omega"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <!-- Use SIMPLE: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="$SimpleSmoother_damping"/> - <Parameter name="UseSIMPLEC" type="bool" value="false"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLE_gs_direct_lvl.xml.in b/katoptron/preconditioners/SIMPLE_gs_direct_lvl.xml.in deleted file mode 100644 index 80271977..00000000 --- a/katoptron/preconditioners/SIMPLE_gs_direct_lvl.xml.in +++ /dev/null @@ -1,276 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ $BLOCK_00_STRIDING_INFO }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ $BLOCK_00_STRIDING_INFO }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ $BLOCK_00_STRIDING_INFO }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myCoalesceDropFact"> - <Parameter name="factory" type="string" value="CoalesceDropFactory"/> - <Parameter name="lightweight wrap" type="bool" value="true"/> - <!-- for aggregation dropping --> - <!--<Parameter name="aggregation: drop tol" type="double" value="1e-10"/>--> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <!--<Parameter name="aggregation: min agg size" type="int" value="7"/>--> - <!--<Parameter name="aggregation: max agg size" type="int" value="10"/>--> - <!--<Parameter name="aggregation: max selected neighbors" type="int" value="1"/>--> - <!--<Parameter name="Graph" type="string" value="myCoalesceDropFact"/> - <Parameter name="DofsPerNode" type="string" value="myCoalesceDropFact"/>--> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - <Parameter name="multigrid algorithm" type="string" value="unsmoothed"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ $BLOCK_11_STRIDING_INFO }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ $BLOCK_11_STRIDING_INFO }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ $BLOCK_11_STRIDING_INFO }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="$BLOCK_11_STRIDING_INFO"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - <Parameter name="multigrid algorithm" type="string" value="unsmoothed"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!--<ParameterList name="myAggExport"> - <Parameter name="factory" type="string" value="AggregationExportFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="aggregation: output filename" type="string" value="structured_aggs"/> - <Parameter name="aggregation: output file: agg style" type="string" value="Jacks"/> - <Parameter name="aggregation: output file: agg style" type="string" value="Convex Hulls"/> - </ParameterList> --> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - <!--<Parameter name="ExportVTK" type="string" value="myAggExport"/>--> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="$BLOCK_00_GS_sweeps"/> - <Parameter name="relaxation: damping factor" type="double" value="$BLOCK_00_GS_damping"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="$SCHUR_omega"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="BASKER"/> - </ParameterList> - - <!-- Use SIMPLE: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="$SimpleSmoother_sweeps"/> - <Parameter name="Damping factor" type="double" value="$SimpleSmoother_damping"/> - <Parameter name="UseSIMPLEC" type="bool" value="false"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - <Parameter name="type" type="string" value="BASKER"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="$N_LVLS"/> - <Parameter name="coarse: max size" type="int" value="$N_SIZES"/> - <Parameter name="verbosity" type="string" value="High"/> - <Parameter name="aggregation: export visualization data" type="bool" value="$EXPORT_DATA"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockDirectSolver"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <Parameter name="Coordinates" type="string" value="myTransferCoordinatesFact"/> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLE_gs_direct_lvl_MT.xml.in b/katoptron/preconditioners/SIMPLE_gs_direct_lvl_MT.xml.in deleted file mode 100644 index daa5b75e..00000000 --- a/katoptron/preconditioners/SIMPLE_gs_direct_lvl_MT.xml.in +++ /dev/null @@ -1,276 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ $BLOCK_00_STRIDING_INFO }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ $BLOCK_00_STRIDING_INFO }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ $BLOCK_00_STRIDING_INFO }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myCoalesceDropFact"> - <Parameter name="factory" type="string" value="CoalesceDropFactory"/> - <Parameter name="lightweight wrap" type="bool" value="true"/> - <!-- for aggregation dropping --> - <!--<Parameter name="aggregation: drop tol" type="double" value="1e-10"/>--> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <!--<Parameter name="aggregation: min agg size" type="int" value="7"/>--> - <!--<Parameter name="aggregation: max agg size" type="int" value="10"/>--> - <!--<Parameter name="aggregation: max selected neighbors" type="int" value="1"/>--> - <!--<Parameter name="Graph" type="string" value="myCoalesceDropFact"/> - <Parameter name="DofsPerNode" type="string" value="myCoalesceDropFact"/>--> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - <Parameter name="multigrid algorithm" type="string" value="unsmoothed"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ $BLOCK_11_STRIDING_INFO }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ $BLOCK_11_STRIDING_INFO }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ $BLOCK_11_STRIDING_INFO }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="$BLOCK_11_STRIDING_INFO"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - <Parameter name="multigrid algorithm" type="string" value="unsmoothed"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!--<ParameterList name="myAggExport"> - <Parameter name="factory" type="string" value="AggregationExportFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="aggregation: output filename" type="string" value="structured_aggs"/> - <Parameter name="aggregation: output file: agg style" type="string" value="Jacks"/> - <Parameter name="aggregation: output file: agg style" type="string" value="Convex Hulls"/> - </ParameterList> --> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - <!--<Parameter name="ExportVTK" type="string" value="myAggExport"/>--> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="$BLOCK_00_GS_sweeps"/> - <Parameter name="relaxation: damping factor" type="double" value="$BLOCK_00_GS_damping"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="$SCHUR_omega"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <!-- Use SIMPLE: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="$SimpleSmoother_sweeps"/> - <Parameter name="Damping factor" type="double" value="$SimpleSmoother_damping"/> - <Parameter name="UseSIMPLEC" type="bool" value="false"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - <Parameter name="type" type="string" value="BASKER"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="$N_LVLS"/> - <Parameter name="coarse: max size" type="int" value="$N_SIZES"/> - <Parameter name="verbosity" type="string" value="High"/> - <Parameter name="aggregation: export visualization data" type="bool" value="$EXPORT_DATA"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockDirectSolver"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <Parameter name="Coordinates" type="string" value="myTransferCoordinatesFact"/> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLE_jacobi.xml b/katoptron/preconditioners/SIMPLE_jacobi.xml deleted file mode 100644 index 8a9ca96c..00000000 --- a/katoptron/preconditioners/SIMPLE_jacobi.xml +++ /dev/null @@ -1,257 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Jacobi"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Jacobi"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Use SIMPLE: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="3"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <Parameter name="UseSIMPLEC" type="bool" value="false"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/SIMPLE_mtgs.xml b/katoptron/preconditioners/SIMPLE_mtgs.xml deleted file mode 100644 index 0cba3b54..00000000 --- a/katoptron/preconditioners/SIMPLE_mtgs.xml +++ /dev/null @@ -1,257 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="1."/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="1."/> - </ParameterList> - </ParameterList> - - <!-- Use SIMPLE: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="1."/> - <Parameter name="UseSIMPLEC" type="bool" value="false"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/Uzawa_cheby.xml b/katoptron/preconditioners/Uzawa_cheby.xml deleted file mode 100644 index 1c8d7bdf..00000000 --- a/katoptron/preconditioners/Uzawa_cheby.xml +++ /dev/null @@ -1,250 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="CHEBYSHEV"/> - <ParameterList name="ParameterList"> - <Parameter name="degree" type="int" value="2"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="CHEBYSHEV"/> - <ParameterList name="ParameterList"> - <Parameter name="degree" type="int" value="2"/> - </ParameterList> - </ParameterList> - - <!-- Use Uzawa: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="UzawaSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/Uzawa_direct.xml b/katoptron/preconditioners/Uzawa_direct.xml deleted file mode 100644 index 0953891f..00000000 --- a/katoptron/preconditioners/Uzawa_direct.xml +++ /dev/null @@ -1,244 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <!-- Use Uzawa: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="UzawaSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/Uzawa_gs.xml b/katoptron/preconditioners/Uzawa_gs.xml deleted file mode 100644 index 920eaa7e..00000000 --- a/katoptron/preconditioners/Uzawa_gs.xml +++ /dev/null @@ -1,256 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Use Uzawa: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="UzawaSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/Uzawa_jacobi.xml b/katoptron/preconditioners/Uzawa_jacobi.xml deleted file mode 100644 index becd02d9..00000000 --- a/katoptron/preconditioners/Uzawa_jacobi.xml +++ /dev/null @@ -1,256 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Jacobi"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Jacobi"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Use Uzawa: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="UzawaSmoother"/> - <Parameter name="Sweeps" type="int" value="3"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/Uzawa_mtgs.xml b/katoptron/preconditioners/Uzawa_mtgs.xml deleted file mode 100644 index c1d21dca..00000000 --- a/katoptron/preconditioners/Uzawa_mtgs.xml +++ /dev/null @@ -1,258 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 2 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="3"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: symmetric matrix structure" type="bool" value="True"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory --> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="false"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: symmetric matrix structure" type="bool" value="True"/> - <Parameter name="relaxation: sweeps" type="int" value="3"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Use Uzawa: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="UzawaSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/preconditioners/blockdirect.xml b/katoptron/preconditioners/blockdirect.xml deleted file mode 100644 index 4a5b0a72..00000000 --- a/katoptron/preconditioners/blockdirect.xml +++ /dev/null @@ -1,30 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="CoarseSolver" type="string" value="myBlockDirectSolver"/> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> diff --git a/katoptron/preconditioners/gs_lvl.xml.in b/katoptron/preconditioners/gs_lvl.xml.in deleted file mode 100644 index 2439cadc..00000000 --- a/katoptron/preconditioners/gs_lvl.xml.in +++ /dev/null @@ -1,95 +0,0 @@ - -<ParameterList name="MueLu"> - - <ParameterList name="Matrix"> - <Parameter name="PDE equations" type="int" value="$BLOCK_00_STRIDING_INFO"/> <!-- Number of PDE equations at each grid node.--> - </ParameterList> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <ParameterList name="myCoalesceDropFact"> - <Parameter name="factory" type="string" value="CoalesceDropFactory"/> - <Parameter name="lightweight wrap" type="bool" value="true"/> - <!-- for aggregation dropping --> - <Parameter name="aggregation: drop tol" type="double" value="1e-10"/> - </ParameterList> - - <ParameterList name="mySmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: backward mode" type="bool" value="true"/> - <Parameter name="relaxation: sweeps" type="int" value="$BLOCK_00_GS_sweeps"/> - <Parameter name="relaxation: damping factor" type="double" value="$BLOCK_00_GS_damping"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myCoarseFact"> - <Parameter name="factory" type="string" value="DirectSolver"/> - <Parameter name="type" type="string" value="KLU"/> - </ParameterList> - - <ParameterList name="myAggFact"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <!-- <Parameter name="aggregation: min agg size" type="int" value="7"/> --> - <!-- <Parameter name="aggregation: max agg size" type="int" value="4"/> --> - <!-- <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> --> - <Parameter name="Graph" type="string" value="myCoalesceDropFact"/> - <Parameter name="DofsPerNode" type="string" value="myCoalesceDropFact"/> - </ParameterList> - - <ParameterList name="MyCoarseMap"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ $BLOCK_00_STRIDING_INFO }"/> - <Parameter name="Aggregates" type="string" value="myAggFact"/> - </ParameterList> - - <ParameterList name="myTentativePFact"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact"/> - <Parameter name="CoarseMap" type="string" value="MyCoarseMap"/> - </ParameterList> - - <ParameterList name="myRFact"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact"/> - </ParameterList> - - <ParameterList name="myAggExport"> - <Parameter name="factory" type="string" value="AggregationExportFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact"/> - <Parameter name="aggregation: output filename" type="string" value="structured_aggs"/> - <Parameter name="aggregation: output file: agg style" type="string" value="Jacks"/> - <Parameter name="aggregation: output file: agg style" type="string" value="Convex Hulls"/> - </ParameterList> - - <ParameterList name="myRAPFact"> - <Parameter name="factory" type="string" value="RAPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact"/> - <Parameter name="R" type="string" value="myRFact"/> - <ParameterList name="TransferFactories"> - <Parameter name="ExportVTK" type="string" value="myAggExport"/> - </ParameterList> - </ParameterList> - - </ParameterList> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - <Parameter name="max levels" type="int" value="$N_LVLS"/> - <Parameter name="coarse: max size" type="int" value="$N_SIZES"/> - <Parameter name="verbosity" type="string" value="High"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="mySmooFact"/> - <Parameter name="CoarseSolver" type="string" value="myCoarseFact"/> - <Parameter name="P" type="string" value="myTentativePFact"/> - <Parameter name="R" type="string" value="myRFact"/> - <Parameter name="A" type="string" value="myRAPFact"/> - </ParameterList> - </ParameterList> -</ParameterList> \ No newline at end of file diff --git a/katoptron/readers.py b/katoptron/readers.py deleted file mode 100644 index 2d887e26..00000000 --- a/katoptron/readers.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - -import numpy as np - - -def read_timers(filename, querylines): - file = open(filename, "r") - times = np.zeros((len(querylines),)) - for line in file: - words = line.split() - if len(words) == 0: - continue - for i in range(0, len(querylines)): - if times[i] == 0.: - if words[0] == querylines[i]: - times[i] = float(words[2]) - continue - file.close() - return times - - -def read_teuchos_timers(filename, querylines): - file = open(filename, "r") - times = np.zeros((len(querylines),)) - for line in file: - words = line.split() - if len(words) == 0: - continue - for i in range(0, len(querylines)): - if times[i] == 0.: - querylines_words = querylines[i].split() - has_to_be_read = True - for j in range(0, len(querylines_words)): - if words[j] != querylines_words[j]: - has_to_be_read = False - break - if has_to_be_read: - times[i] = float(words[len(querylines_words)]) - continue - file.close() - return times - - -def read_Belos(filename, ensemble_size): - active_set_number = 1 - - number_of_criterion = 0 - - previously_an_iter = False - - iter_indices = np.array([]) - - residuals = np.array([]) - - file = open(filename, "r") - for line in file: - words = line.split() - if len(words) == 0: - continue - if words[0] == "Iter": - previously_an_iter = True - word = words[1] - len_word = len(word) - if iter_indices.size != 0: - iter_indices = np.append( - iter_indices, [int(word[:(len_word-1)])], axis=0) - else: - iter_indices = np.array([int(word[:(len_word-1)])]) - - if number_of_criterion == 0: - word = words[3] - len_word = len(word) - - number_of_criterion = int(word[:(len_word-1)]) - if number_of_criterion == 1: - if ensemble_size > 1: - - residual = np.array([float(words[6])]) - for i in range(1, ensemble_size): - residual = np.append(residual, [float(words[6+i])]) - if residuals.size != 0: - residuals = np.append(residuals, [residual], axis=0) - else: - residuals = np.array([residual]) - - else: - if residuals.size != 0: - residuals = np.append( - residuals, [float(words[5])], axis=0) - else: - residuals = np.array([float(words[5])]) - elif previously_an_iter: - previously_an_iter = False - active_set_number = active_set_number + 1 - - file.close() - return iter_indices, residuals - - -def plot_Belos(iter_indices, residuals, ensemble_size=1, hold=False, color_offset=1): - import matplotlib.pyplot as plt - - col = {'c1': (0., 0.4470, 0.7410), 'c2': (0.8500, 0.3250, 0.0980), - 'c3': (0.9290, 0.6940, 0.1250), 'c4': (0.4940, 0.1840, 0.5560), - 'c5': (0.4660, 0.6740, 0.1880), 'c6': (0.3010, 0.7450, 0.9330), - 'c7': (0.6350, 0.0780, 0.1840), 'c8': (0, 0.4470, 0.7410)} - - plt_linewidth = 2 - plt.style.use('ggplot') - - if hold == False: - plt.figure(figsize=(8, 8)) - plt.grid(True) - - if ensemble_size > 1: - for i in range(0, ensemble_size): - plt.semilogy(iter_indices, residuals[:, i], '-', color=col['c'+str( - color_offset+i)], zorder=2, linewidth=plt_linewidth) - else: - plt.semilogy(iter_indices, residuals, '-', - color=col['c'+str(color_offset)], zorder=2, linewidth=plt_linewidth) diff --git a/katoptron/speedup.py b/katoptron/speedup.py deleted file mode 100644 index 16750d4b..00000000 --- a/katoptron/speedup.py +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import numpy as np - -from katoptron.readers import * - - -def read_iter_all_ensemble_sizes(n_samples, ensemble_sizes, file_base_dir, reduction=False): - iter = np.zeros((len(ensemble_sizes), n_samples)) - for i in range(0, len(ensemble_sizes)): - file_base_dir_2 = file_base_dir + '/' + str(ensemble_sizes[i])+'/' - for j in range(0, int((n_samples // ensemble_sizes[i]))): - input_MC_file_dir = file_base_dir_2 + str(j)+'/' - es = ensemble_sizes[i] - if reduction: - es = 1 - iter_indices, residuals = read_Belos( - input_MC_file_dir + 'belos_out.txt', es) - for k in range(0, ensemble_sizes[i]): - iter[i][j*ensemble_sizes[i]+k] = iter_indices[-1] - return iter - - -def read_timers_all_ensemble_sizes(n_samples, ensemble_sizes, file_base_dir, querylines, use_waves_timers, use_teuchos_timers): - timers = np.zeros((len(ensemble_sizes), n_samples, len(querylines))) - timers_s = np.zeros((len(querylines),)) - for i in range(0, len(ensemble_sizes)): - file_base_dir_2 = file_base_dir + '/' + str(ensemble_sizes[i])+'/' - for j in range(0, int((n_samples // ensemble_sizes[i]))): - input_MC_file_dir = file_base_dir_2 + str(j)+'/' - for k in use_waves_timers: - timers_s[int(k)] = read_timers(input_MC_file_dir + - 'timers.txt', [querylines[int(k)]])[0] - for k in use_teuchos_timers: - timers_s[int(k)] = read_teuchos_timers( - input_MC_file_dir + 'teuchos_timers.txt', [querylines[int(k)]])[0] - for k in range(0, ensemble_sizes[i]): - timers[i][j*ensemble_sizes[i]+k][:] = timers_s[:] - - return timers - - -def compute_speedup(n_samples, ensemble_sizes, file_base_dir, querylines, per_iteration, quantiles, use_waves_timers, use_teuchos_timers, reduction=False): - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_base_dir, reduction) - timers = read_timers_all_ensemble_sizes( - n_samples, ensemble_sizes, file_base_dir, querylines, use_waves_timers, use_teuchos_timers) - - n_quantiles = len(quantiles) - - speedup = np.zeros((len(ensemble_sizes), len(querylines), n_quantiles)) - - i_no_ep = 0 - - for i in range(0, len(ensemble_sizes)): - if i == i_no_ep: - speedup[i][:][:] = np.ones((1, len(querylines), n_quantiles)) - else: - cum_timers = np.zeros( - (2, int((n_samples // ensemble_sizes[i])), len(querylines))) - for j in range(0, int((n_samples // ensemble_sizes[i]))): - for l in range(0, len(querylines)): - if per_iteration[l]: - sum_iter = 0 - else: - sum_iter = 1 - for k in range(0, ensemble_sizes[i]): - cum_timers[0][j][l] = cum_timers[0][j][l] + \ - timers[i_no_ep][j*ensemble_sizes[i]+k][l] - if per_iteration[l]: - sum_iter = sum_iter + \ - iter[i_no_ep][j*ensemble_sizes[i]+k] - cum_timers[0][j][l] = ( - cum_timers[0][j][l] / sum_iter) - if cum_timers[0][j][l] == 0: - print('Warning! The cumulated cpu cost of ' + querylines[l] + ' is zero and is replaced by ' + str( - (0.01 / sum_iter)) + ', the precision of the timers has to be increased or the test is too small.') - cum_timers[0][j][l] = (0.01 / sum_iter) - if per_iteration[l]: - cum_timers[1][j][l] = ( - timers[i][j*ensemble_sizes[i]][l] / (iter[i][j*ensemble_sizes[i]]*ensemble_sizes[i])) - else: - cum_timers[1][j][l] = timers[i][j*ensemble_sizes[i]][l] - for l in range(0, len(querylines)): - speedup[i][l] = np.quantile( - (cum_timers[0, :, l] / cum_timers[1, :, l]), quantiles, axis=0) - return speedup - - -def plot_speedup(speedup, ensemble_sizes, which_l=[0], title=None, querylines=None, per_iteration=None): - import matplotlib.pyplot as plt - - plt.figure(figsize=(8, 8)) - - col = {'c1': (0., 0.4470, 0.7410), 'c2': (0.8500, 0.3250, 0.0980), - 'c3': (0.9290, 0.6940, 0.1250), 'c4': (0.4940, 0.1840, 0.5560), - 'c5': (0.4660, 0.6740, 0.1880), 'c6': (0.3010, 0.7450, 0.9330), - 'c7': (0.6350, 0.0780, 0.1840), 'c8': (0, 0.4470, 0.7410)} - - plt_linewidth = 2 - plt.style.use('ggplot') - - for i in range(0, len(which_l)): - color = col['c'+str(i+1)] - for j in range(0, speedup.shape[2]): - if j == 0 and querylines is not None: - plt.plot(ensemble_sizes, speedup[:, which_l[i], j], color=color, - label=querylines[which_l[i]]+'_'+str(per_iteration[which_l[i]])) - else: - plt.plot(ensemble_sizes, - speedup[:, which_l[i], j], color=color) - - plt.xlabel('ensemble size') - plt.ylabel('speedup') - plt.xlim(min(ensemble_sizes), max(ensemble_sizes)) - if title is not None: - plt.title(title) - if querylines is not None: - plt.legend() - - -def save_speedup(speedup, ensemble_sizes, querylines, filename): - tmp = np.zeros((speedup.shape[0], speedup.shape[2]+1)) - tmp[:, 0] = ensemble_sizes - for l in range(0, len(querylines)): - for i in range(1, speedup.shape[2]+1): - tmp[:, i] = speedup[:, l, i-1] - name = filename + '_' + querylines[l] + '.txt' - name = name.replace(" ", "_") - name = name.replace(":", "") - name = name.replace("[", "") - name = name.replace("]", "") - name = name.replace("(", "") - name = name.replace(")", "") - name = name.replace("*", "") - np.savetxt(name, tmp, delimiter=' ') - - -def compute_R(n_samples, ensemble_sizes, file_base_dir, quantiles, reduction=False): - iter = read_iter_all_ensemble_sizes( - n_samples, ensemble_sizes, file_base_dir, reduction) - n_quantiles = len(quantiles) - - R = np.ones((len(ensemble_sizes), n_quantiles)) - - i_no_ep = 0 - - for i in range(0, len(ensemble_sizes)): - if i != i_no_ep: - cum_iter = np.zeros( - (2, int((n_samples // ensemble_sizes[i])))) - for j in range(0, int((n_samples // ensemble_sizes[i]))): - for k in range(0, ensemble_sizes[i]): - cum_iter[0][j] = cum_iter[0][j] + \ - iter[i_no_ep][j*ensemble_sizes[i]+k] - cum_iter[1][j] = iter[i][j*ensemble_sizes[i]]*ensemble_sizes[i] - R[i, :] = np.quantile( - (cum_iter[1, :] / cum_iter[0, :]), quantiles, axis=0) - return R - - -def save_R(R, filename): - name = filename + '.txt' - name = name.replace(" ", "_") - name = name.replace(":", "") - name = name.replace("[", "") - name = name.replace("]", "") - name = name.replace("(", "") - name = name.replace(")", "") - name = name.replace("*", "") - np.savetxt(name, R, delimiter=' ') diff --git a/katoptron/src/Algebraic.h b/katoptron/src/Algebraic.h deleted file mode 100644 index dffadb95..00000000 --- a/katoptron/src/Algebraic.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef KATOPTRON_ALGEBRAIC_H -#define KATOPTRON_ALGEBRAIC_H - -#include "katoptron.h" -#include "Map.h" -#include "Domain.h" -#include "Loads.h" -#include "Graph.h" -#include "Matrices.h" -#include "Vectors.h" - -#include "LinearSolver.h" - -#include "EnsembleTraits.h" - -#include <limits> - -namespace katoptron -{ - -/** - * @brief Class which is used to store Teuchos::RCP to the algebraic information of the problem: - * <ul> - * <li> map: an object that stores all the maps, - * <li> graph: an object that stores all the graphs (the sparsity patterns of the matrices), - * <li> matrices: an object that stores all the matrices, - * <li> vectors: an object that stores all the vectors. - * </ul> - */ -template <typename scalar> -class Algebraic -{ - typedef Map::local_ordinal_type local_ordinal_type; - typedef Map::global_ordinal_type global_ordinal_type; - -public: - Teuchos::RCP<Map> map; - Teuchos::RCP<Graph> graph; - Teuchos::RCP<Matrices<scalar>> matrices; - Teuchos::RCP<Vectors<scalar>> vectors; - - Algebraic(Teuchos::RCP<Map> map, Teuchos::RCP<Domain<scalar>> domain); - - Teuchos::RCP<Tpetra::Vector<scalar, local_ordinal_type, global_ordinal_type>> readVectorFromFile(std::string &name, size_t myRank); -}; -}; // namespace katoptron - -#endif //KATOPTRON_ALGEBRAIC_H diff --git a/katoptron/src/Algebraic.hpp b/katoptron/src/Algebraic.hpp deleted file mode 100644 index 1ad56e35..00000000 --- a/katoptron/src/Algebraic.hpp +++ /dev/null @@ -1,79 +0,0 @@ -namespace katoptron -{ - -/** - * @brief Algebraic constructor - * - * This contrusctor calls the constructor of the katoptron::Graph, katoptron::Matrices, and katoptron::Vectors classes. - * To do so, we need information regarding the distributions of the nodes and elements over the MPI processes (information - * included in the katoptron::Map class) and information regarding the connectivity between the degrees of freedom (or, - * equivalently, between the nodes) (information included in katoptron::Domain::elementsList). - * - * Arguments: - * <ul> - * <li> map: an RCP to a Map object, - * <li> domain: an RCP to a Domain object. - * </ul> - */ -template <typename scalar> -Algebraic<scalar>::Algebraic(Teuchos::RCP<Map> _map, Teuchos::RCP<Domain<scalar>> domain) -{ - map = _map; - - LinearSolver::getTimers()["graph"].start(); - graph = Teuchos::rcp(new Graph(_map, domain->elementsList)); - LinearSolver::getTimers()["graph"].stop(); - matrices = Teuchos::rcp(new Matrices<scalar>(graph)); - vectors = Teuchos::rcp(new Vectors<scalar>(map)); -} - -/** - * @brief Function to read a vector from file and distribute it to the MPI processes. - * - * Arguments: - * <ul> - * <li> name: the name of input file, - * <li> myRank: rank of the process. - * </ul> - */ -template <typename scalar> -Teuchos::RCP<Tpetra::Vector<scalar, Map::local_ordinal_type, Map::global_ordinal_type>> -Algebraic<scalar>::readVectorFromFile(std::string &name, size_t myRank) -{ - using Teuchos::RCP; - using Teuchos::rcp; - - std::ifstream inputfile; - if (myRank == 0) - inputfile.open(name); - - RCP<Tpetra::Vector<scalar, Map::local_ordinal_type, Map::global_ordinal_type>> x_0 = - rcp(new Tpetra::Vector<scalar, Map::local_ordinal_type, Map::global_ordinal_type>(map->mapOutput, true)); - RCP<Tpetra::Vector<scalar, Map::local_ordinal_type, Map::global_ordinal_type>> x = - rcp(new Tpetra::Vector<scalar, Map::local_ordinal_type, Map::global_ordinal_type>(map->mapDofs, true)); - - if (myRank == 0) - { - auto line_size = map->mapOutput->getGlobalNumElements(); - - typedef EnsembleTraits<scalar> ET; - const int ensemble_size = ET::size; - - for (Map::global_ordinal_type global_index = 0; global_index < line_size; ++global_index) - { - scalar tmp; - for (auto j = 0; j < ensemble_size; ++j) - inputfile >> ET::coeff(tmp, j); - - x_0->replaceGlobalValue(global_index, tmp); - } - inputfile.close(); - } - - Tpetra::Export<> exportDof(map->mapOutput, map->mapDofs); - - x->doExport(*x_0, exportDof, Tpetra::ADD); - return x; -} - -}; // namespace katoptron diff --git a/katoptron/src/AlgebraicETI.cpp b/katoptron/src/AlgebraicETI.cpp deleted file mode 100644 index 2bef1983..00000000 --- a/katoptron/src/AlgebraicETI.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "Algebraic.h" -#include "Algebraic.hpp" - -using namespace katoptron; - -template class Algebraic<double>; -template class Algebraic<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>>>; -template class Algebraic<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>>>; -template class Algebraic<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>>>; -template class Algebraic<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>>>; \ No newline at end of file diff --git a/katoptron/src/BelosStatusTestWeightedGenResNorm_MP_Vector.hpp b/katoptron/src/BelosStatusTestWeightedGenResNorm_MP_Vector.hpp deleted file mode 100644 index 2011eb80..00000000 --- a/katoptron/src/BelosStatusTestWeightedGenResNorm_MP_Vector.hpp +++ /dev/null @@ -1,769 +0,0 @@ -//@HEADER -// ************************************************************************ -// -// Belos: Block Linear Solvers Package -// Copyright 2004 Sandia Corporation -// -// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, -// the U.S. Government retains certain rights in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact Michael A. Heroux (maherou@sandia.gov) -// -// ************************************************************************ -//@HEADER - -#ifndef BELOS_STATUS_TEST_WEIGHTED_GEN_RESNORM_MP_VECTORH -#define BELOS_STATUS_TEST_WEIGHTED_GEN_RESNORM_MP_VECTORH - -/*! - \file BelosStatusTestWeightedGenResNorm.hpp - \brief Belos::StatusTestResNorm for specifying general residual norm stopping criteria. -*/ - -#include "BelosStatusTestResNorm.hpp" -#include "BelosLinearProblem.hpp" -#include "BelosMultiVecTraits.hpp" - -#include "EnsembleTraits.h" - -/*! - \class Belos::StatusTestWeightedGenResNorm - \brief An implementation of StatusTestResNorm using a family of weighted residual norms. - - StatusTestWeightedGenResNorm is an implementation of StatusTestResNorm that allows a user to construct - one of a family of residual tests for use as a status/convergence test for Belos. - The form of the test is - \f[ - \frac{\|w\odot r_i\|}{\sigma_i} \le \tau - \f] - where - <ul> - <li> \f$w\f$ is a vector of weights, - <li> \f$\odot\f$ is the Hadamard product, - <li> \f$r_i\f$ is the i-th residual std::vector, implicitly or explicitly computed (determined by enum ResType), - <li> \f$\|r_i\|\f$ is the i-th residual norm determined by the enum NormType (1-norm, 2-norm or inf-norm), - <li> \f$\sigma_i\f$ is the i-th scale factor that can be passed in as a precomputed number of the templated type, - or can be selected from by the enum ScaleType (norm of RHS, norm of initial residual). - <li> \f$\tau\f$ is the tolerance that is passed in as a number of the templated type to the constructor. - The value of \f$\tau\f$ can be reset using the setTolerance() method. - </ul> - -*/ - -namespace Belos -{ - -template <class ScalarType, class MV, class OP> -class StatusTestWeightedGenResNorm : public StatusTestResNorm<ScalarType, MV, OP> -{ - -public: - // Convenience typedefs - typedef Teuchos::ScalarTraits<ScalarType> SCT; - typedef typename SCT::magnitudeType MagnitudeType; - typedef MultiVecTraits<ScalarType, MV> MVT; - - //! @name Enums. - //@{ - - /*! - \brief Select how the residual std::vector is produced. - */ - enum ResType - { - Implicit, /*!< Use the residual std::vector produced by the iterative solver. */ - Explicit /*!< Explicitly compute the residual std::vector r = b - A*x using the - linear problem. */ - }; - - //@} - - //! @name Constructors/destructors. - //@{ - //! Constructor - /*! The constructor takes a single argument specifying the tolerance (\f$\tau\f$). - If none of the form definition methods are called, we use \f$\|r\|_2/\|r^{(0)}\|_2 \le \tau\f$ - as the stopping criterion, where \f$\|r\|_2\f$ uses the least costly form of the 2-norm of - residual available from the iterative method and \f$\|r^{(0)}\|_2\f$ is the corresponding norm - of the initial residual. The least costly form of the 2-norm depends on the chosen iterative - method. Most Krylov methods produce the preconditioned residual std::vector in a form that would be - exact in infinite precision arithmetic. This std::vector may be different from the true residual - either because left preconditioning was used, or because round-off error has - introduced significant error, or both. - - You can also state the number of vectors that must pass the convergence criteria before the - status test passes by using the \c quorum argument. - */ - StatusTestWeightedGenResNorm(MagnitudeType Tolerance, Teuchos::RCP<MV> weights, int quorum = -1, bool showMaxResNormOnly = false); - - //! Destructor - virtual ~StatusTestWeightedGenResNorm(); - //@} - - //! @name Form and parameter definition methods. - //@{ - - //! Define form of the residual, its norm and optional weighting std::vector. - /*! This method defines the form of \f$\|r\|\f$. We specify: - <ul> - <li> Whether the residual std::vector should be explicitly computed, or taken from the iterative method. - <li> The norm to be used on the residual (this may be different than the norm used in - DefineScaleForm()). - </ul> - */ - int defineResForm(ResType TypeOfResidual, NormType TypeOfNorm); - - //! Define form of the scaling, its norm, its optional weighting std::vector, or, alternatively, define an explicit value. - /*! This method defines the form of how the residual is scaled (if at all). It operates in two modes: - <ol> - <li> User-provided scaling value: - <ul> - <li> Set argument TypeOfScaling to UserProvided. - <li> Set ScaleValue to a non-zero value that the residual norm will be divided by. - <li> TypeOfNorm argument will be ignored. - <li> Sample use: Define ScaleValue = \f$\|A\|_{\infty}\f$ where \f$ A \f$ is the matrix - of the linear problem. - </ul> - - <li> Use a supported Scaling Form: - <ul> - <li> Define TypeOfScaling to be the norm of the right hand side, the initial residual std::vector, - or to none. - <li> Define norm to be used on the scaling std::vector (this may be different than the norm used - in DefineResForm()). - </ul> - </ol> - */ - int defineScaleForm(ScaleType TypeOfScaling, NormType TypeOfNorm, MagnitudeType ScaleValue = Teuchos::ScalarTraits<MagnitudeType>::one()); - - NormType getResNormType() { return resnormtype_; } - - //! Set the value of the tolerance - /*! We allow the tolerance to be reset for cases where, in the process of testing the residual, - we find that the initial tolerance was too tight or too lax. - */ - int setTolerance(MagnitudeType tolerance) - { - tolerance_ = tolerance; - return (0); - } - - //! Sets the number of residuals that must pass the convergence test before Passed is returned. - //! \note If \c quorum=-1 then all residuals must pass the convergence test before Passed is returned. - int setQuorum(int quorum) - { - quorum_ = quorum; - return (0); - } - - //! Set whether the only maximum residual norm is displayed when the print() method is called - int setShowMaxResNormOnly(bool showMaxResNormOnly) - { - showMaxResNormOnly_ = showMaxResNormOnly; - return (0); - } - - //@} - - //! @name Status methods - //@{ - //! Check convergence status: Passed, Failed, or Undefined. - /*! This method checks to see if the convergence criteria are met. - Depending on how the residual test is constructed this method will return - the appropriate status type. - - \return StatusType: Passed, Failed, or Undefined. - */ - StatusType checkStatus(Iteration<ScalarType, MV, OP> *iSolver); - - //! Return the result of the most recent CheckStatus call. - StatusType getStatus() const { return (status_); }; - //@} - - //! @name Reset methods - //@{ - - //! Resets the internal configuration to the initial state. - void reset(); - - //@} - - //! @name Print methods - //@{ - - //! Output formatted description of stopping test to output stream. - void print(std::ostream &os, int indent = 0) const; - - //! Print message for each status specific to this stopping test. - void printStatus(std::ostream &os, StatusType type) const; - //@} - - //! @name Methods to access data members. - //@{ - - //! Returns the current solution estimate that was computed for the most recent residual test. - //! \note This is useful for explicit residual tests, if this test is an implicit residual test - //! a null pointer will be returned. - Teuchos::RCP<MV> getSolution() { return curSoln_; } - - //! Returns the number of residuals that must pass the convergence test before Passed is returned. - //! \note If \c quorum=-1 then all residuals must pass the convergence test before Passed is returned. - int getQuorum() const { return quorum_; } - - //! Returns whether the only maximum residual norm is displayed when the print() method is called - bool getShowMaxResNormOnly() { return showMaxResNormOnly_; } - - //! Returns the std::vector containing the indices of the residuals that passed the test. - std::vector<int> convIndices() { return ind_; } - - //! Returns the value of the tolerance, \f$ \tau \f$, set in the constructor. - MagnitudeType getTolerance() const { return (tolerance_); }; - - //! Returns the test value, \f$ \frac{\|r\|}{\sigma} \f$, computed in most recent call to CheckStatus. - const std::vector<MagnitudeType> *getTestValue() const { return (&testvector_); }; - - //! Returns the residual norm value, \f$ \|r\| \f$, computed in most recent call to CheckStatus. - const std::vector<MagnitudeType> *getResNormValue() const { return (&resvector_); }; - - //! Returns the scaled norm value, \f$ \sigma \f$. - const std::vector<MagnitudeType> *getScaledNormValue() const { return (&scalevector_); }; - - //! Returns a boolean indicating a loss of accuracy has been detected in computing the residual. - //! \note This status test does not check for loss of accuracy, so this method will always return false. - bool getLOADetected() const { return false; } - - //! Returns number of ensemble iterations - const std::vector<int> getEnsembleIterations() const { return ensemble_iterations; } - //@} - - /** @name Misc. */ - //@{ - - /** \brief Call to setup initial scaling std::vector. - * - * After this function is called <tt>getScaledNormValue()</tt> can be called - * to get the scaling std::vector. - */ - StatusType firstCallCheckStatusSetup(Iteration<ScalarType, MV, OP> *iSolver); - //@} - - /** \name Overridden from Teuchos::Describable */ - //@{ - - /** \brief Method to return description of the maximum iteration status test */ - std::string description() const - { - std::ostringstream oss; - oss << "Belos::StatusTestWeightedGenResNorm<>: " << resFormStr(); - oss << ", tol = " << tolerance_; - return oss.str(); - } - //@} - -protected: -private: - //! @name Private methods. - //@{ - /** \brief Description of current residual form */ - std::string resFormStr() const - { - std::ostringstream oss; - oss << "("; - oss << ((resnormtype_ == OneNorm) ? "1-Norm" : (resnormtype_ == TwoNorm) ? "2-Norm" : "Inf-Norm"); - oss << " Exp"; - oss << " Res Vec) "; - - // If there is no residual scaling, return current string. - if (scaletype_ != None) - { - // Insert division sign. - oss << "/ "; - - // Determine output string for scaling, if there is any. - if (scaletype_ == UserProvided) - oss << " (User Scale)"; - else - { - oss << "("; - oss << ((scalenormtype_ == OneNorm) ? "1-Norm" : (resnormtype_ == TwoNorm) ? "2-Norm" : "Inf-Norm"); - if (scaletype_ == NormOfInitRes || scaletype_ == NormOfFullInitRes || scaletype_ == NormOfFullScaledInitRes) - oss << " Res0"; - else if (scaletype_ == NormOfPrecInitRes || scaletype_ == NormOfFullPrecInitRes || scaletype_ == NormOfFullScaledPrecInitRes) - oss << " Prec Res0"; - else - oss << " RHS "; - oss << ")"; - } - } - - return oss.str(); - } - - //@} - - //! @name Private helper functions - //@{ - - // calculate weighted norm - void MvWNorm(const MV &mv, const MV &w, std::vector<typename Teuchos::ScalarTraits<ScalarType>::magnitudeType> &normVec, NormType type = TwoNorm) - { - - Teuchos::RCP<MV> wmv = MVT::CloneCopy(mv); - - Teuchos::ArrayRCP<typename MV::scalar_type> wmv_entries; - Teuchos::ArrayRCP<const typename MV::scalar_type> w_entries; - - for (size_t j = 0; j < MVT::GetNumberVecs(mv); ++j) - { - wmv_entries = wmv->getDataNonConst(j); - w_entries = w.getData(j); - for (size_t i = 0; i < wmv_entries.size(); ++i) - wmv_entries[i] *= w_entries[i]; - } - MVT::MvNorm(*wmv, normVec, type); - } - //@} - - //! @name Private data members. - //@{ - - //! Tolerance used to determine convergence - MagnitudeType tolerance_; - - //! Number of residuals that must pass the convergence test before Passed is returned. - int quorum_; - - //! Determines if the entries for all of the residuals are shown or just the max. - bool showMaxResNormOnly_; - - //! Type of norm to use on residual (OneNorm, TwoNorm, or InfNorm). - NormType resnormtype_; - - //! Type of scaling to use (Norm of RHS, Norm of Initial Residual, None or User provided) - ScaleType scaletype_; - - //! Type of norm to use on the scaling (OneNorm, TwoNorm, or InfNorm) - NormType scalenormtype_; - - //! Scaling value. - MagnitudeType scalevalue_; - - //! Scaling std::vector. - std::vector<MagnitudeType> scalevector_; - - //! Residual norm std::vector. - std::vector<MagnitudeType> resvector_; - - //! Test std::vector = resvector_ / scalevector_ - std::vector<MagnitudeType> testvector_; - - //! Vector containing the indices for the vectors that passed the test. - std::vector<int> ind_; - - //! Most recent solution vector used by this status test. - Teuchos::RCP<MV> curSoln_; - - //! Status - StatusType status_; - - //! The current blocksize of the linear system being solved. - int curBlksz_; - - //! The current number of right-hand sides being solved for. - int curNumRHS_; - - //! The indices of the current number of right-hand sides being solved for. - std::vector<int> curLSIdx_; - - //! The current number of linear systems that have been loaded into the linear problem. - int curLSNum_; - - //! The total number of right-hand sides being solved for. - int numrhs_; - - //! Is this the first time CheckStatus is called? - bool firstcallCheckStatus_; - - //! Is this the first time DefineResForm is called? - bool firstcallDefineResForm_; - - //! Is this the first time DefineScaleForm is called? - bool firstcallDefineScaleForm_; - - //! Weights of the used norm: - Teuchos::RCP<MV> weights_; - - //! The number of iterations at which point each ensemble component converges - std::vector<int> ensemble_iterations; - - //@} -}; - -template <class ScalarType, class MV, class OP> -StatusTestWeightedGenResNorm<ScalarType, MV, OP>:: - StatusTestWeightedGenResNorm(MagnitudeType Tolerance, Teuchos::RCP<MV> weights, int quorum, bool showMaxResNormOnly) - : tolerance_(Tolerance), - quorum_(quorum), - showMaxResNormOnly_(showMaxResNormOnly), - resnormtype_(TwoNorm), - scaletype_(NormOfInitRes), - scalenormtype_(TwoNorm), - scalevalue_(Teuchos::ScalarTraits<MagnitudeType>::one()), - status_(Undefined), - curBlksz_(0), - curNumRHS_(0), - curLSNum_(0), - numrhs_(0), - firstcallCheckStatus_(true), - firstcallDefineResForm_(true), - firstcallDefineScaleForm_(true), - weights_(weights), - ensemble_iterations(EnsembleTraits<ScalarType>::size, 0) -{ - // This constructor will compute the residual ||r_i||/||r0_i|| <= tolerance using the 2-norm of - // the explicit residual std::vector. -} - -template <class ScalarType, class MV, class OP> -StatusTestWeightedGenResNorm<ScalarType, MV, OP>::~StatusTestWeightedGenResNorm() -{ -} - -template <class ScalarType, class MV, class OP> -void StatusTestWeightedGenResNorm<ScalarType, MV, OP>::reset() -{ - status_ = Undefined; - curBlksz_ = 0; - curLSNum_ = 0; - curLSIdx_.resize(0); - numrhs_ = 0; - ind_.resize(0); - firstcallCheckStatus_ = true; - curSoln_ = Teuchos::null; -} - -template <class ScalarType, class MV, class OP> -int StatusTestWeightedGenResNorm<ScalarType, MV, OP>::defineResForm(ResType TypeOfResidual, NormType TypeOfNorm) -{ - TEUCHOS_TEST_FOR_EXCEPTION(firstcallDefineResForm_ == false, StatusTestError, - "StatusTestWeightedGenResNorm::defineResForm(): The residual form has already been defined."); - firstcallDefineResForm_ = false; - - resnormtype_ = TypeOfNorm; - - return (0); -} - -template <class ScalarType, class MV, class OP> -int StatusTestWeightedGenResNorm<ScalarType, MV, OP>::defineScaleForm(ScaleType TypeOfScaling, NormType TypeOfNorm, - MagnitudeType ScaleValue) -{ - TEUCHOS_TEST_FOR_EXCEPTION(firstcallDefineScaleForm_ == false, StatusTestError, - "StatusTestWeightedGenResNorm::defineScaleForm(): The scaling type has already been defined."); - firstcallDefineScaleForm_ = false; - - scaletype_ = TypeOfScaling; - scalenormtype_ = TypeOfNorm; - scalevalue_ = ScaleValue; - - return (0); -} - -template <class ScalarType, class MV, class OP> -StatusType StatusTestWeightedGenResNorm<ScalarType, MV, OP>::checkStatus(Iteration<ScalarType, MV, OP> *iSolver) -{ - typedef EnsembleTraits<ScalarType> ET; - const int ensemble_size = ET::size; - MagnitudeType zero = Teuchos::ScalarTraits<MagnitudeType>::zero(); - const LinearProblem<ScalarType, MV, OP> &lp = iSolver->getProblem(); - // Compute scaling term (done once for each block that's being solved) - if (firstcallCheckStatus_) - { - StatusType status = firstCallCheckStatusSetup(iSolver); - if (status == Failed) - { - status_ = Failed; - return (status_); - } - } - // - // This section computes the norm of the residual std::vector - // - if (curLSNum_ != lp.getLSNumber()) - { - // - // We have moved on to the next rhs block - // - curLSNum_ = lp.getLSNumber(); - curLSIdx_ = lp.getLSIndex(); - curBlksz_ = (int)curLSIdx_.size(); - int validLS = 0; - for (int i = 0; i < curBlksz_; ++i) - { - if (curLSIdx_[i] > -1 && curLSIdx_[i] < numrhs_) - validLS++; - } - curNumRHS_ = validLS; - curSoln_ = Teuchos::null; - // - } - else - { - // - // We are in the same rhs block, return if we are converged - // - if (status_ == Passed) - { - return status_; - } - } - { - // - // Request the true residual for this block of right-hand sides. - // - Teuchos::RCP<MV> cur_update = iSolver->getCurrentUpdate(); - curSoln_ = lp.updateSolution(cur_update); - Teuchos::RCP<MV> cur_res = MVT::Clone(*curSoln_, MVT::GetNumberVecs(*curSoln_)); - lp.computeCurrResVec(&*cur_res, &*curSoln_); - std::vector<MagnitudeType> tmp_resvector(MVT::GetNumberVecs(*cur_res)); - MvWNorm(*cur_res, *weights_, tmp_resvector, resnormtype_); - typename std::vector<int>::iterator p = curLSIdx_.begin(); - for (int i = 0; p < curLSIdx_.end(); ++p, ++i) - { - // Check if this index is valid - if (*p != -1) - resvector_[*p] = tmp_resvector[i]; - } - } - // - // Compute the new linear system residuals for testing. - // (if any of them don't meet the tolerance or are NaN, then we exit with that status) - // - if (scalevector_.size() > 0) - { - typename std::vector<int>::iterator p = curLSIdx_.begin(); - for (; p < curLSIdx_.end(); ++p) - { - // Check if this index is valid - if (*p != -1) - { - // Scale the std::vector accordingly - if (scalevector_[*p] != zero) - { - // Don't intentionally divide by zero. - testvector_[*p] = resvector_[*p] / scalevector_[*p] / scalevalue_; - } - else - { - testvector_[*p] = resvector_[*p] / scalevalue_; - } - } - } - } - else - { - typename std::vector<int>::iterator p = curLSIdx_.begin(); - for (; p < curLSIdx_.end(); ++p) - { - // Check if this index is valid - if (*p != -1) - testvector_[*p] = resvector_[*p] / scalevalue_; - } - } - - // Check status of new linear system residuals and see if we have the quorum. - int have = 0; - ind_.resize(curLSIdx_.size()); - typename std::vector<int>::iterator p = curLSIdx_.begin(); - for (; p < curLSIdx_.end(); ++p) - { - // Check if this index is valid - if (*p != -1) - { - // Check if any of the residuals are larger than the tolerance. - bool all_converged = true; - for (int ii = 0; ii < ensemble_size; ++ii) - { - if (ET::coeff(testvector_[*p], ii) > ET::coeff(tolerance_, ii)) - { - ++ensemble_iterations[ii]; - all_converged = false; - } - else if (!(ET::coeff(testvector_[*p], ii) <= ET::coeff(tolerance_, ii))) - { - // Throw an std::exception if a NaN is found. - status_ = Failed; - TEUCHOS_TEST_FOR_EXCEPTION(true, StatusTestError, "StatusTestWeightedGenResNorm::checkStatus(): NaN has been detected."); - } - } - if (all_converged) - { - ind_[have] = *p; - have++; - } - } - } - ind_.resize(have); - int need = (quorum_ == -1) ? curNumRHS_ : quorum_; - status_ = (have >= need) ? Passed : Failed; - - // Return the current status - return status_; -} - -template <class ScalarType, class MV, class OP> -void StatusTestWeightedGenResNorm<ScalarType, MV, OP>::print(std::ostream &os, int indent) const -{ - for (int j = 0; j < indent; j++) - os << ' '; - printStatus(os, status_); - os << resFormStr(); - if (status_ == Undefined) - os << ", tol = " << tolerance_ << std::endl; - else - { - os << std::endl; - if (showMaxResNormOnly_ && curBlksz_ > 1) - { - const MagnitudeType maxRelRes = *std::max_element( - testvector_.begin() + curLSIdx_[0], testvector_.begin() + curLSIdx_[curBlksz_ - 1]); - for (int j = 0; j < indent + 13; j++) - os << ' '; - os << "max{residual[" << curLSIdx_[0] << "..." << curLSIdx_[curBlksz_ - 1] << "]} = " << maxRelRes - << (maxRelRes <= tolerance_ ? " <= " : " > ") << tolerance_ << std::endl; - } - else - { - for (int i = 0; i < numrhs_; i++) - { - for (int j = 0; j < indent + 13; j++) - os << ' '; - os << "residual [ " << i << " ] = " << testvector_[i]; - os << ((testvector_[i] < tolerance_) ? " < " : (testvector_[i] == tolerance_) ? " == " : (testvector_[i] > tolerance_) ? " > " : " ") << tolerance_ << std::endl; - } - } - } - os << std::endl; -} - -template <class ScalarType, class MV, class OP> -void StatusTestWeightedGenResNorm<ScalarType, MV, OP>::printStatus(std::ostream &os, StatusType type) const -{ - os << std::left << std::setw(13) << std::setfill('.'); - switch (type) - { - case Passed: - os << "Converged"; - break; - case Failed: - os << "Unconverged"; - break; - case Undefined: - default: - os << "**"; - break; - } - os << std::left << std::setfill(' '); - return; -} - -template <class ScalarType, class MV, class OP> -StatusType StatusTestWeightedGenResNorm<ScalarType, MV, OP>::firstCallCheckStatusSetup(Iteration<ScalarType, MV, OP> *iSolver) -{ - int i; - MagnitudeType zero = Teuchos::ScalarTraits<MagnitudeType>::zero(); - MagnitudeType one = Teuchos::ScalarTraits<MagnitudeType>::one(); - const LinearProblem<ScalarType, MV, OP> &lp = iSolver->getProblem(); - // Compute scaling term (done once for each block that's being solved) - if (firstcallCheckStatus_) - { - // - // Get some current solver information. - // - firstcallCheckStatus_ = false; - - if (scaletype_ == NormOfRHS) - { - Teuchos::RCP<const MV> rhs = lp.getRHS(); - numrhs_ = MVT::GetNumberVecs(*rhs); - scalevector_.resize(numrhs_); - MvWNorm(*rhs, *weights_, scalevector_, scalenormtype_); - } - else if (scaletype_ == NormOfInitRes || scaletype_ == NormOfFullInitRes || scaletype_ == NormOfFullScaledInitRes) - { - Teuchos::RCP<const MV> init_res = lp.getInitResVec(); - numrhs_ = MVT::GetNumberVecs(*init_res); - scalevector_.resize(numrhs_); - MvWNorm(*init_res, *weights_, scalevector_, scalenormtype_); - } - else if (scaletype_ == NormOfPrecInitRes || scaletype_ == NormOfFullPrecInitRes || scaletype_ == NormOfFullScaledPrecInitRes) - { - Teuchos::RCP<const MV> init_res = lp.getInitPrecResVec(); - numrhs_ = MVT::GetNumberVecs(*init_res); - scalevector_.resize(numrhs_); - MvWNorm(*init_res, *weights_, scalevector_, scalenormtype_); - } - else - { - numrhs_ = MVT::GetNumberVecs(*(lp.getRHS())); - } - - resvector_.resize(numrhs_); - testvector_.resize(numrhs_); - - curLSNum_ = lp.getLSNumber(); - curLSIdx_ = lp.getLSIndex(); - curBlksz_ = (int)curLSIdx_.size(); - int validLS = 0; - for (i = 0; i < curBlksz_; ++i) - { - if (curLSIdx_[i] > -1 && curLSIdx_[i] < numrhs_) - validLS++; - } - curNumRHS_ = validLS; - // - // Initialize the testvector. - for (i = 0; i < numrhs_; i++) - { - testvector_[i] = one; - } - - // Return an error if the scaling is zero. - if (scalevalue_ == zero) - { - return Failed; - } - } - return Undefined; -} - -} // end namespace Belos - -#endif /* BELOS_STATUS_TEST_RESNORM_H */ diff --git a/katoptron/src/BelosXpetraStatusTestGenResSubNorm_MP_Vector.hpp b/katoptron/src/BelosXpetraStatusTestGenResSubNorm_MP_Vector.hpp deleted file mode 100644 index c06459d5..00000000 --- a/katoptron/src/BelosXpetraStatusTestGenResSubNorm_MP_Vector.hpp +++ /dev/null @@ -1,1537 +0,0 @@ -// @HEADER -// -// *********************************************************************** -// -// MueLu: A package for multigrid based preconditioning -// Copyright 2012 Sandia Corporation -// -// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, -// the U.S. Government retains certain rights in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact -// Jonathan Hu (jhu@sandia.gov) -// Andrey Prokopenko (aprokop@sandia.gov) -// Ray Tuminaro (rstumin@sandia.gov) -// Tobias Wiesner (tawiesn@sandia.gov) -// -// *********************************************************************** -// -// @HEADER -#ifndef BELOS_XPETRA_STATUS_TEST_GEN_RES_SUB_NORM_MP_VECTORHPP -#define BELOS_XPETRA_STATUS_TEST_GEN_RES_SUB_NORM_MP_VECTORHPP - -#include "Stokhos_config.h" - -#ifdef HAVE_STOKHOS_ENSEMBLE_REDUCT - -#include "Xpetra_ConfigDefs.hpp" - -#include "Xpetra_BlockedCrsMatrix.hpp" - -#include "MueLu_Exceptions.hpp" - -#include <BelosConfigDefs.hpp> -#include <BelosTypes.hpp> -#include <BelosOperatorT.hpp> -#include <BelosXpetraAdapterOperator.hpp> -#include <BelosStatusTestGenResSubNorm.hpp> -#include <BelosXpetraStatusTestGenResSubNorm.hpp> -#include "EnsembleTraits.h" - -namespace Belos -{ - -/*! \brief Template specialization of Belos::StatusTestGenResSubNorm class using the - * Xpetra::MultiVector and Belos::OperatorT MueLu adapter class. - */ -template <class Storage, class LocalOrdinal, class GlobalOrdinal, class Node> -class StatusTestGenResSubNorm<typename Teuchos::ScalarTraits<Sacado::MP::Vector<Storage>>::magnitudeType, Xpetra::MultiVector<Sacado::MP::Vector<Storage>, LocalOrdinal, GlobalOrdinal, Node>, Belos::OperatorT<Xpetra::MultiVector<Sacado::MP::Vector<Storage>, LocalOrdinal, GlobalOrdinal, Node>>> - : public StatusTestResNorm<typename Teuchos::ScalarTraits<Sacado::MP::Vector<Storage>>::magnitudeType, Xpetra::MultiVector<Sacado::MP::Vector<Storage>, LocalOrdinal, GlobalOrdinal, Node>, Belos::OperatorT<Xpetra::MultiVector<Sacado::MP::Vector<Storage>, LocalOrdinal, GlobalOrdinal, Node>>> -{ - -public: - // Convenience typedefs - typedef Sacado::MP::Vector<Storage> ScalarType; - - typedef Xpetra::MultiVector<ScalarType, LocalOrdinal, GlobalOrdinal, Node> MV; - typedef Xpetra::BlockedCrsMatrix<ScalarType, LocalOrdinal, GlobalOrdinal, Node> BCRS; - typedef Xpetra::MapExtractor<ScalarType, LocalOrdinal, GlobalOrdinal, Node> ME; - typedef Belos::OperatorT<MV> OP; - - typedef Teuchos::ScalarTraits<ScalarType> SCT; - typedef typename SCT::magnitudeType MagnitudeType; - typedef MultiVecTraits<ScalarType, MV> MVT; - typedef OperatorTraits<ScalarType, MV, OP> OT; - - //! @name Constructors/destructors. - //@{ - //! Constructor - /*! The constructor takes a single argument specifying the tolerance (\f$\tau\f$). - If none of the form definition methods are called, we use \f$\|r\|/\|r^{(0)}\| \le \tau\f$ - as the stopping criterion, where \f$\|r\|\f$ always uses the true residual and - \f$\|r^{(0)}\|\f$ is the corresponding norm of the initial residual. - The used norm can be specified by defineResForm and defineScaleForm. - - @param Tolerance: Specifies tolerance \f$\tau\f - @param subIdx: index of block row in the n x n block system we want to check the residual of - @param quorum: Number of residual (sub-)vectors which are needed to be within the tolerance before check is considered to be passed - @param showMaxResNormOnly: for output only - - */ - StatusTestGenResSubNorm(MagnitudeType Tolerance, size_t subIdx, int quorum = -1, bool showMaxResNormOnly = false) - : tolerance_(Tolerance), - subIdx_(subIdx), - quorum_(quorum), - showMaxResNormOnly_(showMaxResNormOnly), - resnormtype_(TwoNorm), - scaletype_(NormOfInitRes), - scalenormtype_(TwoNorm), - scalevalue_(Teuchos::ScalarTraits<MagnitudeType>::one()), - status_(Undefined), - curBlksz_(0), - curNumRHS_(0), - curLSNum_(0), - numrhs_(0), - firstcallCheckStatus_(true), - firstcallDefineResForm_(true), - firstcallDefineScaleForm_(true), - mapExtractor_(Teuchos::null), - ensemble_iterations(EnsembleTraits<MagnitudeType>::size, 0) {} - - //! Destructor - virtual ~StatusTestGenResSubNorm(){}; - //@} - - //! @name Form and parameter definition methods. - //@{ - - //! Define form of the residual, its norm and optional weighting std::vector. - /*! This method defines the form of \f$\|r\|\f$. We specify: - <ul> - <li> The norm to be used on the residual (this may be different than the norm used in - DefineScaleForm()). - </ul> - */ - int defineResForm(NormType TypeOfNorm) - { - TEUCHOS_TEST_FOR_EXCEPTION(firstcallDefineResForm_ == false, StatusTestError, - "StatusTestGenResSubNorm::defineResForm(): The residual form has already been defined."); - firstcallDefineResForm_ = false; - - resnormtype_ = TypeOfNorm; - - return (0); - } - - //! Define form of the scaling, its norm, its optional weighting std::vector, or, alternatively, define an explicit value. - /*! This method defines the form of how the residual is scaled (if at all). It operates in two modes: - <ol> - <li> User-provided scaling value: - <ul> - <li> Set argument TypeOfScaling to UserProvided. - <li> Set ScaleValue to a non-zero value that the residual norm will be divided by. - <li> TypeOfNorm argument will be ignored. - <li> Sample use: Define ScaleValue = \f$\|A\|_{\infty}\f$ where \f$ A \f$ is the matrix - of the linear problem. - </ul> - - <li> Use a supported Scaling Form: - <ul> - <li> Define TypeOfScaling to be the norm of the right hand side, the initial residual std::vector, - or to none. - <li> Define norm to be used on the scaling std::vector (this may be different than the norm used - in DefineResForm()). - </ul> - </ol> - */ - int defineScaleForm(ScaleType TypeOfScaling, NormType TypeOfNorm, MagnitudeType ScaleValue = Teuchos::ScalarTraits<MagnitudeType>::one()) - { - TEUCHOS_TEST_FOR_EXCEPTION(firstcallDefineScaleForm_ == false, StatusTestError, - "StatusTestGenResSubNorm::defineScaleForm(): The scaling type has already been defined."); - firstcallDefineScaleForm_ = false; - - scaletype_ = TypeOfScaling; - scalenormtype_ = TypeOfNorm; - scalevalue_ = ScaleValue; - - return (0); - } - - //! Set the value of the tolerance - /*! We allow the tolerance to be reset for cases where, in the process of testing the residual, - we find that the initial tolerance was too tight or too lax. - */ - int setTolerance(MagnitudeType tolerance) - { - tolerance_ = tolerance; - return (0); - } - - //! Set the block index of which we want to check the norm of the sub-residuals - /*! It does not really make sense to change/reset the index during the solution process - */ - int setSubIdx(size_t subIdx) - { - subIdx_ = subIdx; - return (0); - } - - //! Sets the number of residuals that must pass the convergence test before Passed is returned. - //! \note If \c quorum=-1 then all residuals must pass the convergence test before Passed is returned. - int setQuorum(int quorum) - { - quorum_ = quorum; - return (0); - } - - //! Set whether the only maximum residual norm is displayed when the print() method is called - int setShowMaxResNormOnly(bool showMaxResNormOnly) - { - showMaxResNormOnly_ = showMaxResNormOnly; - return (0); - } - - //@} - - //! @name Status methods - //@{ - //! Check convergence status: Passed, Failed, or Undefined. - /*! This method checks to see if the convergence criteria are met. - Depending on how the residual test is constructed this method will return - the appropriate status type. - - \return StatusType: Passed, Failed, or Undefined. - */ - StatusType checkStatus(Iteration<MagnitudeType, MV, OP> *iSolver) - { - typedef EnsembleTraits<MagnitudeType> ET; - const int ensemble_size = ET::size; - MagnitudeType zero = Teuchos::ScalarTraits<MagnitudeType>::zero(); - const LinearProblem<MagnitudeType, MV, OP> &lp = iSolver->getProblem(); - // Compute scaling term (done once for each block that's being solved) - if (firstcallCheckStatus_) - { - StatusType status = firstCallCheckStatusSetup(iSolver); - if (status == Failed) - { - status_ = Failed; - return (status_); - } - } - - // - // This section computes the norm of the residual std::vector - // - if (curLSNum_ != lp.getLSNumber()) - { - // - // We have moved on to the next rhs block - // - curLSNum_ = lp.getLSNumber(); - curLSIdx_ = lp.getLSIndex(); - curBlksz_ = (int)curLSIdx_.size(); - int validLS = 0; - for (int i = 0; i < curBlksz_; ++i) - { - if (curLSIdx_[i] > -1 && curLSIdx_[i] < numrhs_) - validLS++; - } - curNumRHS_ = validLS; - curSoln_ = Teuchos::null; - // - } - else - { - // - // We are in the same rhs block, return if we are converged - // - if (status_ == Passed) - { - return status_; - } - } - - // - // Request the true residual for this block of right-hand sides. - // - Teuchos::RCP<MV> cur_update = iSolver->getCurrentUpdate(); - curSoln_ = lp.updateSolution(cur_update); - Teuchos::RCP<MV> cur_res = MVT::Clone(*curSoln_, MVT::GetNumberVecs(*curSoln_)); - lp.computeCurrResVec(&*cur_res, &*curSoln_); - std::vector<MagnitudeType> tmp_resvector(MVT::GetNumberVecs(*cur_res)); - MvSubNorm(*cur_res, subIdx_, tmp_resvector, resnormtype_); - - typename std::vector<int>::iterator p = curLSIdx_.begin(); - for (int i = 0; p < curLSIdx_.end(); ++p, ++i) - { - // Check if this index is valid - if (*p != -1) - resvector_[*p] = tmp_resvector[i]; - } - - // - // Compute the new linear system residuals for testing. - // (if any of them don't meet the tolerance or are NaN, then we exit with that status) - // - if (scalevector_.size() > 0) - { - typename std::vector<int>::iterator pp = curLSIdx_.begin(); - for (; pp < curLSIdx_.end(); ++pp) - { - // Check if this index is valid - if (*pp != -1) - { - // Scale the std::vector accordingly - if (scalevector_[*pp] != zero) - { - // Don't intentionally divide by zero. - testvector_[*pp] = resvector_[*pp] / scalevector_[*pp] / scalevalue_; - } - else - { - testvector_[*pp] = resvector_[*pp] / scalevalue_; - } - } - } - } - else - { - typename std::vector<int>::iterator pp = curLSIdx_.begin(); - for (; pp < curLSIdx_.end(); ++pp) - { - // Check if this index is valid - if (*pp != -1) - testvector_[*pp] = resvector_[*pp] / scalevalue_; - } - } - // Check status of new linear system residuals and see if we have the quorum. - int have = 0; - ind_.resize(curLSIdx_.size()); - typename std::vector<int>::iterator p2 = curLSIdx_.begin(); - for (; p2 < curLSIdx_.end(); ++p2) - { - // Check if this index is valid - if (*p2 != -1) - { - // Check if any of the residuals are larger than the tolerance. - bool all_converged = true; - for (int ii = 0; ii < ensemble_size; ++ii) - { - if (ET::coeff(testvector_[*p2], ii) > ET::coeff(tolerance_, ii)) - { - ++ensemble_iterations[ii]; - all_converged = false; - } - else if (!(ET::coeff(testvector_[*p2], ii) <= ET::coeff(tolerance_, ii))) - { - // Throw an std::exception if the current residual norm is - // NaN. We know that it's NaN because it is not less than, - // equal to, or greater than the current tolerance. This is - // only possible if either the residual norm or the current - // tolerance is NaN; we assume the former. We also mark the - // test as failed, in case you want to catch the exception. - status_ = Failed; - TEUCHOS_TEST_FOR_EXCEPTION(true, StatusTestError, "StatusTestGenResSubNorm::checkStatus(): NaN has been detected."); - } - } - if (all_converged) - { - ind_[have] = *p2; - have++; - } - } - } - ind_.resize(have); - int need = (quorum_ == -1) ? curNumRHS_ : quorum_; - status_ = (have >= need) ? Passed : Failed; - // Return the current status - return status_; - } - - //! Return the result of the most recent CheckStatus call. - StatusType getStatus() const { return (status_); }; - //@} - - //! @name Reset methods - //@{ - - //! Resets the internal configuration to the initial state. - void reset() - { - status_ = Undefined; - curBlksz_ = 0; - curLSNum_ = 0; - curLSIdx_.resize(0); - numrhs_ = 0; - ind_.resize(0); - firstcallCheckStatus_ = true; - curSoln_ = Teuchos::null; - } - - //@} - - //! @name Print methods - //@{ - - //! Output formatted description of stopping test to output stream. - void print(std::ostream &os, int indent = 0) const - { - os.setf(std::ios_base::scientific); - for (int j = 0; j < indent; j++) - os << ' '; - printStatus(os, status_); - os << resFormStr(); - if (status_ == Undefined) - os << ", tol = " << tolerance_ << std::endl; - else - { - os << std::endl; - if (showMaxResNormOnly_ && curBlksz_ > 1) - { - const MagnitudeType maxRelRes = *std::max_element( - testvector_.begin() + curLSIdx_[0], testvector_.begin() + curLSIdx_[curBlksz_ - 1]); - for (int j = 0; j < indent + 13; j++) - os << ' '; - os << "max{residual[" << curLSIdx_[0] << "..." << curLSIdx_[curBlksz_ - 1] << "]} = " << maxRelRes - << (maxRelRes <= tolerance_ ? " <= " : " > ") << tolerance_ << std::endl; - } - else - { - for (int i = 0; i < numrhs_; i++) - { - for (int j = 0; j < indent + 13; j++) - os << ' '; - os << "residual [ " << i << " ] = " << testvector_[i]; - os << ((testvector_[i] < tolerance_) ? " < " : (testvector_[i] == tolerance_) ? " == " : (testvector_[i] > tolerance_) ? " > " : " ") << tolerance_ << std::endl; - } - } - } - os << std::endl; - } - - //! Print message for each status specific to this stopping test. - void printStatus(std::ostream &os, StatusType type) const - { - os << std::left << std::setw(13) << std::setfill('.'); - switch (type) - { - case Passed: - os << "Converged"; - break; - case Failed: - os << "Unconverged"; - break; - case Undefined: - default: - os << "**"; - break; - } - os << std::left << std::setfill(' '); - return; - } - //@} - - //! @name Methods to access data members. - //@{ - - //! Returns the current solution estimate that was computed for the most recent residual test. - Teuchos::RCP<MV> getSolution() { return curSoln_; } - - //! Returns the number of residuals that must pass the convergence test before Passed is returned. - //! \note If \c quorum=-1 then all residuals must pass the convergence test before Passed is returned. - int getQuorum() const { return quorum_; } - - //! Returns the index of the block row the norms are calculated for - size_t getSubIdx() const { return subIdx_; } - - //! Returns whether the only maximum residual norm is displayed when the print() method is called - bool getShowMaxResNormOnly() { return showMaxResNormOnly_; } - - //! Returns the std::vector containing the indices of the residuals that passed the test. - std::vector<int> convIndices() { return ind_; } - - //! Returns the value of the tolerance, \f$ \tau \f$, set in the constructor. - MagnitudeType getTolerance() const { return (tolerance_); }; - - //! Returns the test value, \f$ \frac{\|r\|}{\sigma} \f$, computed in most recent call to CheckStatus. - const std::vector<MagnitudeType> *getTestValue() const { return (&testvector_); }; - - //! Returns the residual norm value, \f$ \|r\| \f$, computed in most recent call to CheckStatus. - const std::vector<MagnitudeType> *getResNormValue() const { return (&resvector_); }; - - //! Returns the scaled norm value, \f$ \sigma \f$. - const std::vector<MagnitudeType> *getScaledNormValue() const { return (&scalevector_); }; - - //! Returns a boolean indicating a loss of accuracy has been detected in computing the residual. - //! \note This status test does not check for loss of accuracy, so this method will always return false. - bool getLOADetected() const { return false; } - - const std::vector<int> getEnsembleIterations() const { return ensemble_iterations; } - - //@} - - /** @name Misc. */ - //@{ - - /** \brief Call to setup initial scaling std::vector. - * - * After this function is called <tt>getScaledNormValue()</tt> can be called - * to get the scaling std::vector. - */ - StatusType firstCallCheckStatusSetup(Iteration<MagnitudeType, MV, OP> *iSolver) - { - int i; - MagnitudeType zero = Teuchos::ScalarTraits<MagnitudeType>::zero(); - MagnitudeType one = Teuchos::ScalarTraits<MagnitudeType>::one(); - const LinearProblem<MagnitudeType, MV, OP> &lp = iSolver->getProblem(); - // Compute scaling term (done once for each block that's being solved) - if (firstcallCheckStatus_) - { - // - // Get some current solver information. - // - firstcallCheckStatus_ = false; - - // try to access the underlying blocked operator - Teuchos::RCP<const OP> Op = lp.getOperator(); - Teuchos::RCP<const Belos::XpetraOp<ScalarType, LocalOrdinal, GlobalOrdinal, Node>> xOp = - Teuchos::rcp_dynamic_cast<const Belos::XpetraOp<ScalarType, LocalOrdinal, GlobalOrdinal, Node>>(Op); - TEUCHOS_TEST_FOR_EXCEPTION(xOp.is_null(), MueLu::Exceptions::BadCast, "Bad cast from \'const Belos::OperatorT\' to \'const Belos::XpetraOp\'. The origin type is " << typeid(const OP).name() << "."); - Teuchos::RCP<const Xpetra::Operator<ScalarType, LocalOrdinal, GlobalOrdinal, Node>> xIntOp = - xOp->getOperator(); - TEUCHOS_TEST_FOR_EXCEPTION(xIntOp.is_null(), MueLu::Exceptions::BadCast, "Cannot access Xpetra::Operator stored in Belos::XpetraOperator."); - Teuchos::RCP<const Xpetra::Matrix<ScalarType, LocalOrdinal, GlobalOrdinal, Node>> xMat = - Teuchos::rcp_dynamic_cast<const Xpetra::Matrix<ScalarType, LocalOrdinal, GlobalOrdinal, Node>>(xIntOp); - TEUCHOS_TEST_FOR_EXCEPTION(xMat.is_null(), MueLu::Exceptions::RuntimeError, "Cannot access Xpetra::Matrix stored in Belos::XpetraOp. Error."); - Teuchos::RCP<const Xpetra::BlockedCrsMatrix<ScalarType, LocalOrdinal, GlobalOrdinal, Node>> bMat = Teuchos::rcp_dynamic_cast<const Xpetra::BlockedCrsMatrix<ScalarType, LocalOrdinal, GlobalOrdinal, Node>>(xMat); - TEUCHOS_TEST_FOR_EXCEPTION(bMat.is_null(), MueLu::Exceptions::BadCast, "Bad cast from \'const Xpetra::Matrix\' to \'const Xpetra::BlockedCrsMatrix\'. The origin type is " << typeid(const Xpetra::Matrix<ScalarType, LocalOrdinal, GlobalOrdinal, Node>).name() << ". Note: you need a BlockedCrsMatrix object for the StatusTestGenResSubNorm to work!"); - mapExtractor_ = bMat->getRangeMapExtractor(); - TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor_.is_null(), MueLu::Exceptions::RuntimeError, "Could not extract map extractor from BlockedCrsMatrix. Error."); - TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor_->NumMaps() <= subIdx_, MueLu::Exceptions::RuntimeError, "The multivector is only split into " << mapExtractor_->NumMaps() << " sub parts. Cannot access sub-block " << subIdx_ << "."); - - // calculate initial norms - if (scaletype_ == NormOfRHS) - { - Teuchos::RCP<const MV> rhs = lp.getRHS(); - numrhs_ = MVT::GetNumberVecs(*rhs); - scalevector_.resize(numrhs_); - MvSubNorm(*rhs, subIdx_, scalevector_, scalenormtype_); - } - else if (scaletype_ == NormOfInitRes) - { - Teuchos::RCP<const MV> init_res = lp.getInitResVec(); - numrhs_ = MVT::GetNumberVecs(*init_res); - scalevector_.resize(numrhs_); - MvSubNorm(*init_res, subIdx_, scalevector_, scalenormtype_); - } - else if (scaletype_ == NormOfPrecInitRes) - { - Teuchos::RCP<const MV> init_res = lp.getInitPrecResVec(); - numrhs_ = MVT::GetNumberVecs(*init_res); - scalevector_.resize(numrhs_); - MvSubNorm(*init_res, subIdx_, scalevector_, scalenormtype_); - } - else if (scaletype_ == NormOfFullInitRes) - { - Teuchos::RCP<const MV> init_res = lp.getInitResVec(); - numrhs_ = MVT::GetNumberVecs(*init_res); - scalevector_.resize(numrhs_); - MVT::MvNorm(*init_res, scalevector_, scalenormtype_); - scalevalue_ = one; - } - else if (scaletype_ == NormOfFullPrecInitRes) - { - Teuchos::RCP<const MV> init_res = lp.getInitPrecResVec(); - numrhs_ = MVT::GetNumberVecs(*init_res); - scalevector_.resize(numrhs_); - MVT::MvNorm(*init_res, scalevector_, scalenormtype_); - scalevalue_ = one; - } - else if (scaletype_ == NormOfFullScaledInitRes) - { - Teuchos::RCP<const MV> init_res = lp.getInitResVec(); - numrhs_ = MVT::GetNumberVecs(*init_res); - scalevector_.resize(numrhs_); - MVT::MvNorm(*init_res, scalevector_, scalenormtype_); - MvScalingRatio(*init_res, subIdx_, scalevalue_); - } - else if (scaletype_ == NormOfFullScaledPrecInitRes) - { - Teuchos::RCP<const MV> init_res = lp.getInitPrecResVec(); - numrhs_ = MVT::GetNumberVecs(*init_res); - scalevector_.resize(numrhs_); - MVT::MvNorm(*init_res, scalevector_, scalenormtype_); - MvScalingRatio(*init_res, subIdx_, scalevalue_); - } - else - { - numrhs_ = MVT::GetNumberVecs(*(lp.getRHS())); - } - - resvector_.resize(numrhs_); - testvector_.resize(numrhs_); - - curLSNum_ = lp.getLSNumber(); - curLSIdx_ = lp.getLSIndex(); - curBlksz_ = (int)curLSIdx_.size(); - int validLS = 0; - for (i = 0; i < curBlksz_; ++i) - { - if (curLSIdx_[i] > -1 && curLSIdx_[i] < numrhs_) - validLS++; - } - curNumRHS_ = validLS; - // - // Initialize the testvector. - for (i = 0; i < numrhs_; i++) - { - testvector_[i] = one; - } - - // Return an error if the scaling is zero. - if (scalevalue_ == zero) - { - return Failed; - } - } - return Undefined; - } - //@} - - /** \name Overridden from Teuchos::Describable */ - //@{ - - /** \brief Method to return description of the maximum iteration status test */ - std::string description() const - { - std::ostringstream oss; - oss << "Belos::StatusTestGenResSubNorm<>: " << resFormStr(); - oss << ", tol = " << tolerance_; - return oss.str(); - } - //@} - -protected: -private: - //! @name Private methods. - //@{ - /** \brief Description of current residual form */ - std::string resFormStr() const - { - std::ostringstream oss; - oss << "("; - oss << ((resnormtype_ == OneNorm) ? "1-Norm" : (resnormtype_ == TwoNorm) ? "2-Norm" : "Inf-Norm"); - oss << " Exp"; - oss << " Res Vec [" << subIdx_ << "]) "; - - // If there is no residual scaling, return current string. - if (scaletype_ != None) - { - // Insert division sign. - oss << "/ "; - - // Determine output string for scaling, if there is any. - if (scaletype_ == UserProvided) - oss << " (User Scale)"; - else - { - oss << "("; - oss << ((scalenormtype_ == OneNorm) ? "1-Norm" : (resnormtype_ == TwoNorm) ? "2-Norm" : "Inf-Norm"); - if (scaletype_ == NormOfInitRes) - oss << " Res0 [" << subIdx_ << "]"; - else if (scaletype_ == NormOfPrecInitRes) - oss << " Prec Res0 [" << subIdx_ << "]"; - else if (scaletype_ == NormOfFullInitRes) - oss << " Full Res0 [" << subIdx_ << "]"; - else if (scaletype_ == NormOfFullPrecInitRes) - oss << " Full Prec Res0 [" << subIdx_ << "]"; - else if (scaletype_ == NormOfFullScaledInitRes) - oss << " scaled Full Res0 [" << subIdx_ << "]"; - else if (scaletype_ == NormOfFullScaledPrecInitRes) - oss << " scaled Full Prec Res0 [" << subIdx_ << "]"; - else - oss << " RHS [" << subIdx_ << "]"; - oss << ")"; - } - } - - // TODO add a tagging name - - return oss.str(); - } - - //@} - - //! @name Private helper functions - //@{ - - // calculate norm of partial multivector - void MvSubNorm(const MV &mv, size_t block, std::vector<MagnitudeType> &normVec, NormType type = TwoNorm) - { - - Teuchos::RCP<const MV> input = Teuchos::rcpFromRef(mv); - - Teuchos::RCP<const MV> SubVec = mapExtractor_->ExtractVector(input, block); - typedef MultiVecTraits<ScalarType, MV> MVT; - MVT::MvNorm(*SubVec, normVec, type); - } - - // calculate ration of sub-vector length to full vector length (for scalevalue_) - void MvScalingRatio(const MV &mv, size_t block, MagnitudeType &lengthRatio) - { - Teuchos::RCP<const MV> input = Teuchos::rcpFromRef(mv); - - Teuchos::RCP<const MV> SubVec = mapExtractor_->ExtractVector(input, block); - - lengthRatio = Teuchos::as<MagnitudeType>(SubVec->getGlobalLength()) / Teuchos::as<MagnitudeType>(input->getGlobalLength()); - } - //@} - - //! @name Private data members. - //@{ - - //! Tolerance used to determine convergence - MagnitudeType tolerance_; - - //! Index of block row in n x n block system of which we want to check the sub-residuals - size_t subIdx_; - - //! Number of residuals that must pass the convergence test before Passed is returned. - int quorum_; - - //! Determines if the entries for all of the residuals are shown or just the max. - bool showMaxResNormOnly_; - - //! Type of norm to use on residual (OneNorm, TwoNorm, or InfNorm). - NormType resnormtype_; - - //! Type of scaling to use (Norm of RHS, Norm of Initial Residual, None or User provided) - ScaleType scaletype_; - - //! Type of norm to use on the scaling (OneNorm, TwoNorm, or InfNorm) - NormType scalenormtype_; - - //! Scaling value. - MagnitudeType scalevalue_; - - //! Scaling std::vector. - std::vector<MagnitudeType> scalevector_; - - //! Residual norm std::vector. - std::vector<MagnitudeType> resvector_; - - //! Test std::vector = resvector_ / scalevector_ - std::vector<MagnitudeType> testvector_; - - //! Vector containing the indices for the vectors that passed the test. - std::vector<int> ind_; - - //! Most recent solution vector used by this status test. - Teuchos::RCP<MV> curSoln_; - - //! Status - StatusType status_; - - //! The current blocksize of the linear system being solved. - int curBlksz_; - - //! The current number of right-hand sides being solved for. - int curNumRHS_; - - //! The indices of the current number of right-hand sides being solved for. - std::vector<int> curLSIdx_; - - //! The current number of linear systems that have been loaded into the linear problem. - int curLSNum_; - - //! The total number of right-hand sides being solved for. - int numrhs_; - - //! Is this the first time CheckStatus is called? - bool firstcallCheckStatus_; - - //! Is this the first time DefineResForm is called? - bool firstcallDefineResForm_; - - //! Is this the first time DefineScaleForm is called? - bool firstcallDefineScaleForm_; - - //! MapExtractor for range space - Teuchos::RCP<const ME> mapExtractor_; - - //! The number of iterations at which point each ensemble component converges - std::vector<int> ensemble_iterations; - - //@} -}; - -} // namespace Belos - -#else - -#include "Xpetra_ConfigDefs.hpp" - -#include "Xpetra_BlockedCrsMatrix.hpp" - -#include "MueLu_Exceptions.hpp" - -#include <BelosConfigDefs.hpp> -#include <BelosTypes.hpp> -#include <BelosOperatorT.hpp> -#include <BelosXpetraAdapterOperator.hpp> -#include <BelosStatusTestGenResSubNorm.hpp> -#include "EnsembleTraits.h" - -namespace Belos -{ - -/*! \brief Template specialization of Belos::StatusTestGenResSubNorm class using the - * Xpetra::MultiVector and Belos::OperatorT MueLu adapter class. - */ -template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node> -class StatusTestGenResSubNorm<Scalar, Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>, Belos::OperatorT<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>> - : public StatusTestResNorm<Scalar, Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>, Belos::OperatorT<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>> -{ - -public: - // Convenience typedefs - typedef Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> MV; - typedef Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> BCRS; - typedef Xpetra::MapExtractor<Scalar, LocalOrdinal, GlobalOrdinal, Node> ME; - typedef Belos::OperatorT<MV> OP; - - typedef Teuchos::ScalarTraits<Scalar> SCT; - typedef typename SCT::magnitudeType MagnitudeType; - typedef MultiVecTraits<Scalar, MV> MVT; - typedef OperatorTraits<Scalar, MV, OP> OT; - - //! @name Constructors/destructors. - //@{ - //! Constructor - /*! The constructor takes a single argument specifying the tolerance (\f$\tau\f$). - If none of the form definition methods are called, we use \f$\|r\|/\|r^{(0)}\| \le \tau\f$ - as the stopping criterion, where \f$\|r\|\f$ always uses the true residual and - \f$\|r^{(0)}\|\f$ is the corresponding norm of the initial residual. - The used norm can be specified by defineResForm and defineScaleForm. - @param Tolerance: Specifies tolerance \f$\tau\f - @param subIdx: index of block row in the n x n block system we want to check the residual of - @param quorum: Number of residual (sub-)vectors which are needed to be within the tolerance before check is considered to be passed - @param showMaxResNormOnly: for output only - */ - StatusTestGenResSubNorm(MagnitudeType Tolerance, size_t subIdx, int quorum = -1, bool showMaxResNormOnly = false) - : tolerance_(Tolerance), - subIdx_(subIdx), - quorum_(quorum), - showMaxResNormOnly_(showMaxResNormOnly), - resnormtype_(TwoNorm), - scaletype_(NormOfInitRes), - scalenormtype_(TwoNorm), - scalevalue_(Teuchos::ScalarTraits<MagnitudeType>::one()), - status_(Undefined), - curBlksz_(0), - curNumRHS_(0), - curLSNum_(0), - numrhs_(0), - firstcallCheckStatus_(true), - firstcallDefineResForm_(true), - firstcallDefineScaleForm_(true), - mapExtractor_(Teuchos::null), - ensemble_iterations(EnsembleTraits<Scalar>::size, 0) {} - - //! Destructor - virtual ~StatusTestGenResSubNorm(){}; - //@} - - //! @name Form and parameter definition methods. - //@{ - - //! Define form of the residual, its norm and optional weighting std::vector. - /*! This method defines the form of \f$\|r\|\f$. We specify: - <ul> - <li> The norm to be used on the residual (this may be different than the norm used in - DefineScaleForm()). - </ul> - */ - int defineResForm(NormType TypeOfNorm) - { - TEUCHOS_TEST_FOR_EXCEPTION(firstcallDefineResForm_ == false, StatusTestError, - "StatusTestGenResSubNorm::defineResForm(): The residual form has already been defined."); - firstcallDefineResForm_ = false; - - resnormtype_ = TypeOfNorm; - - return (0); - } - - //! Define form of the scaling, its norm, its optional weighting std::vector, or, alternatively, define an explicit value. - /*! This method defines the form of how the residual is scaled (if at all). It operates in two modes: - <ol> - <li> User-provided scaling value: - <ul> - <li> Set argument TypeOfScaling to UserProvided. - <li> Set ScaleValue to a non-zero value that the residual norm will be divided by. - <li> TypeOfNorm argument will be ignored. - <li> Sample use: Define ScaleValue = \f$\|A\|_{\infty}\f$ where \f$ A \f$ is the matrix - of the linear problem. - </ul> - <li> Use a supported Scaling Form: - <ul> - <li> Define TypeOfScaling to be the norm of the right hand side, the initial residual std::vector, - or to none. - <li> Define norm to be used on the scaling std::vector (this may be different than the norm used - in DefineResForm()). - </ul> - </ol> - */ - int defineScaleForm(ScaleType TypeOfScaling, NormType TypeOfNorm, MagnitudeType ScaleValue = Teuchos::ScalarTraits<MagnitudeType>::one()) - { - TEUCHOS_TEST_FOR_EXCEPTION(firstcallDefineScaleForm_ == false, StatusTestError, - "StatusTestGenResSubNorm::defineScaleForm(): The scaling type has already been defined."); - firstcallDefineScaleForm_ = false; - - scaletype_ = TypeOfScaling; - scalenormtype_ = TypeOfNorm; - scalevalue_ = ScaleValue; - - return (0); - } - - //! Set the value of the tolerance - /*! We allow the tolerance to be reset for cases where, in the process of testing the residual, - we find that the initial tolerance was too tight or too lax. - */ - int setTolerance(MagnitudeType tolerance) - { - tolerance_ = tolerance; - return (0); - } - - //! Set the block index of which we want to check the norm of the sub-residuals - /*! It does not really make sense to change/reset the index during the solution process - */ - int setSubIdx(size_t subIdx) - { - subIdx_ = subIdx; - return (0); - } - - //! Sets the number of residuals that must pass the convergence test before Passed is returned. - //! \note If \c quorum=-1 then all residuals must pass the convergence test before Passed is returned. - int setQuorum(int quorum) - { - quorum_ = quorum; - return (0); - } - - //! Set whether the only maximum residual norm is displayed when the print() method is called - int setShowMaxResNormOnly(bool showMaxResNormOnly) - { - showMaxResNormOnly_ = showMaxResNormOnly; - return (0); - } - - //@} - - //! @name Status methods - //@{ - //! Check convergence status: Passed, Failed, or Undefined. - /*! This method checks to see if the convergence criteria are met. - Depending on how the residual test is constructed this method will return - the appropriate status type. - \return StatusType: Passed, Failed, or Undefined. - */ - StatusType checkStatus(Iteration<Scalar, MV, OP> *iSolver) - { - typedef EnsembleTraits<Scalar> ET; - const int ensemble_size = ET::size; - MagnitudeType zero = Teuchos::ScalarTraits<MagnitudeType>::zero(); - const LinearProblem<Scalar, MV, OP> &lp = iSolver->getProblem(); - // Compute scaling term (done once for each block that's being solved) - if (firstcallCheckStatus_) - { - StatusType status = firstCallCheckStatusSetup(iSolver); - if (status == Failed) - { - status_ = Failed; - return (status_); - } - } - - // - // This section computes the norm of the residual std::vector - // - if (curLSNum_ != lp.getLSNumber()) - { - // - // We have moved on to the next rhs block - // - curLSNum_ = lp.getLSNumber(); - curLSIdx_ = lp.getLSIndex(); - curBlksz_ = (int)curLSIdx_.size(); - int validLS = 0; - for (int i = 0; i < curBlksz_; ++i) - { - if (curLSIdx_[i] > -1 && curLSIdx_[i] < numrhs_) - validLS++; - } - curNumRHS_ = validLS; - curSoln_ = Teuchos::null; - // - } - else - { - // - // We are in the same rhs block, return if we are converged - // - if (status_ == Passed) - { - return status_; - } - } - - // - // Request the true residual for this block of right-hand sides. - // - Teuchos::RCP<MV> cur_update = iSolver->getCurrentUpdate(); - curSoln_ = lp.updateSolution(cur_update); - Teuchos::RCP<MV> cur_res = MVT::Clone(*curSoln_, MVT::GetNumberVecs(*curSoln_)); - lp.computeCurrResVec(&*cur_res, &*curSoln_); - std::vector<MagnitudeType> tmp_resvector(MVT::GetNumberVecs(*cur_res)); - MvSubNorm(*cur_res, subIdx_, tmp_resvector, resnormtype_); - - typename std::vector<int>::iterator p = curLSIdx_.begin(); - for (int i = 0; p < curLSIdx_.end(); ++p, ++i) - { - // Check if this index is valid - if (*p != -1) - resvector_[*p] = tmp_resvector[i]; - } - - // - // Compute the new linear system residuals for testing. - // (if any of them don't meet the tolerance or are NaN, then we exit with that status) - // - if (scalevector_.size() > 0) - { - typename std::vector<int>::iterator pp = curLSIdx_.begin(); - for (; pp < curLSIdx_.end(); ++pp) - { - // Check if this index is valid - if (*pp != -1) - { - // Scale the std::vector accordingly - if (scalevector_[*pp] != zero) - { - // Don't intentionally divide by zero. - testvector_[*pp] = resvector_[*pp] / scalevector_[*pp] / scalevalue_; - } - else - { - testvector_[*pp] = resvector_[*pp] / scalevalue_; - } - } - } - } - else - { - typename std::vector<int>::iterator pp = curLSIdx_.begin(); - for (; pp < curLSIdx_.end(); ++pp) - { - // Check if this index is valid - if (*pp != -1) - testvector_[*pp] = resvector_[*pp] / scalevalue_; - } - } - // Check status of new linear system residuals and see if we have the quorum. - int have = 0; - ind_.resize(curLSIdx_.size()); - typename std::vector<int>::iterator p2 = curLSIdx_.begin(); - for (; p2 < curLSIdx_.end(); ++p2) - { - // Check if this index is valid - if (*p2 != -1) - { - // Check if any of the residuals are larger than the tolerance. - bool all_converged = true; - for (int ii = 0; ii < ensemble_size; ++ii) - { - if (ET::coeff(testvector_[*p2], ii) > ET::coeff(tolerance_, ii)) - { - ++ensemble_iterations[ii]; - all_converged = false; - } - else if (!(ET::coeff(testvector_[*p2], ii) <= ET::coeff(tolerance_, ii))) - { - // Throw an std::exception if the current residual norm is - // NaN. We know that it's NaN because it is not less than, - // equal to, or greater than the current tolerance. This is - // only possible if either the residual norm or the current - // tolerance is NaN; we assume the former. We also mark the - // test as failed, in case you want to catch the exception. - status_ = Failed; - TEUCHOS_TEST_FOR_EXCEPTION(true, StatusTestError, "StatusTestGenResSubNorm::checkStatus(): NaN has been detected."); - } - } - if (all_converged) - { - ind_[have] = *p2; - have++; - } - } - } - ind_.resize(have); - int need = (quorum_ == -1) ? curNumRHS_ : quorum_; - status_ = (have >= need) ? Passed : Failed; - // Return the current status - return status_; - } - - //! Return the result of the most recent CheckStatus call. - StatusType getStatus() const { return (status_); }; - //@} - - //! @name Reset methods - //@{ - - //! Resets the internal configuration to the initial state. - void reset() - { - status_ = Undefined; - curBlksz_ = 0; - curLSNum_ = 0; - curLSIdx_.resize(0); - numrhs_ = 0; - ind_.resize(0); - firstcallCheckStatus_ = true; - curSoln_ = Teuchos::null; - } - - //@} - - //! @name Print methods - //@{ - - //! Output formatted description of stopping test to output stream. - void print(std::ostream &os, int indent = 0) const - { - os.setf(std::ios_base::scientific); - for (int j = 0; j < indent; j++) - os << ' '; - printStatus(os, status_); - os << resFormStr(); - if (status_ == Undefined) - os << ", tol = " << tolerance_ << std::endl; - else - { - os << std::endl; - if (showMaxResNormOnly_ && curBlksz_ > 1) - { - const MagnitudeType maxRelRes = *std::max_element( - testvector_.begin() + curLSIdx_[0], testvector_.begin() + curLSIdx_[curBlksz_ - 1]); - for (int j = 0; j < indent + 13; j++) - os << ' '; - os << "max{residual[" << curLSIdx_[0] << "..." << curLSIdx_[curBlksz_ - 1] << "]} = " << maxRelRes - << (maxRelRes <= tolerance_ ? " <= " : " > ") << tolerance_ << std::endl; - } - else - { - for (int i = 0; i < numrhs_; i++) - { - for (int j = 0; j < indent + 13; j++) - os << ' '; - os << "residual [ " << i << " ] = " << testvector_[i]; - os << ((testvector_[i] < tolerance_) ? " < " : (testvector_[i] == tolerance_) ? " == " : (testvector_[i] > tolerance_) ? " > " : " ") << tolerance_ << std::endl; - } - } - } - os << std::endl; - } - - //! Print message for each status specific to this stopping test. - void printStatus(std::ostream &os, StatusType type) const - { - os << std::left << std::setw(13) << std::setfill('.'); - switch (type) - { - case Passed: - os << "Converged"; - break; - case Failed: - os << "Unconverged"; - break; - case Undefined: - default: - os << "**"; - break; - } - os << std::left << std::setfill(' '); - return; - } - //@} - - //! @name Methods to access data members. - //@{ - - //! Returns the current solution estimate that was computed for the most recent residual test. - Teuchos::RCP<MV> getSolution() { return curSoln_; } - - //! Returns the number of residuals that must pass the convergence test before Passed is returned. - //! \note If \c quorum=-1 then all residuals must pass the convergence test before Passed is returned. - int getQuorum() const { return quorum_; } - - //! Returns the index of the block row the norms are calculated for - size_t getSubIdx() const { return subIdx_; } - - //! Returns whether the only maximum residual norm is displayed when the print() method is called - bool getShowMaxResNormOnly() { return showMaxResNormOnly_; } - - //! Returns the std::vector containing the indices of the residuals that passed the test. - std::vector<int> convIndices() { return ind_; } - - //! Returns the value of the tolerance, \f$ \tau \f$, set in the constructor. - MagnitudeType getTolerance() const { return (tolerance_); }; - - //! Returns the test value, \f$ \frac{\|r\|}{\sigma} \f$, computed in most recent call to CheckStatus. - const std::vector<MagnitudeType> *getTestValue() const { return (&testvector_); }; - - //! Returns the residual norm value, \f$ \|r\| \f$, computed in most recent call to CheckStatus. - const std::vector<MagnitudeType> *getResNormValue() const { return (&resvector_); }; - - //! Returns the scaled norm value, \f$ \sigma \f$. - const std::vector<MagnitudeType> *getScaledNormValue() const { return (&scalevector_); }; - - //! Returns a boolean indicating a loss of accuracy has been detected in computing the residual. - //! \note This status test does not check for loss of accuracy, so this method will always return false. - bool getLOADetected() const { return false; } - - const std::vector<int> getEnsembleIterations() const { return ensemble_iterations; } - - //@} - - /** @name Misc. */ - //@{ - - /** \brief Call to setup initial scaling std::vector. - * - * After this function is called <tt>getScaledNormValue()</tt> can be called - * to get the scaling std::vector. - */ - StatusType firstCallCheckStatusSetup(Iteration<Scalar, MV, OP> *iSolver) - { - int i; - MagnitudeType zero = Teuchos::ScalarTraits<MagnitudeType>::zero(); - MagnitudeType one = Teuchos::ScalarTraits<MagnitudeType>::one(); - const LinearProblem<Scalar, MV, OP> &lp = iSolver->getProblem(); - // Compute scaling term (done once for each block that's being solved) - if (firstcallCheckStatus_) - { - // - // Get some current solver information. - // - firstcallCheckStatus_ = false; - - // try to access the underlying blocked operator - Teuchos::RCP<const OP> Op = lp.getOperator(); - Teuchos::RCP<const Belos::XpetraOp<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xOp = - Teuchos::rcp_dynamic_cast<const Belos::XpetraOp<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(Op); - TEUCHOS_TEST_FOR_EXCEPTION(xOp.is_null(), MueLu::Exceptions::BadCast, "Bad cast from \'const Belos::OperatorT\' to \'const Belos::XpetraOp\'. The origin type is " << typeid(const OP).name() << "."); - Teuchos::RCP<const Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xIntOp = - xOp->getOperator(); - TEUCHOS_TEST_FOR_EXCEPTION(xIntOp.is_null(), MueLu::Exceptions::BadCast, "Cannot access Xpetra::Operator stored in Belos::XpetraOperator."); - Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xMat = - Teuchos::rcp_dynamic_cast<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xIntOp); - TEUCHOS_TEST_FOR_EXCEPTION(xMat.is_null(), MueLu::Exceptions::RuntimeError, "Cannot access Xpetra::Matrix stored in Belos::XpetraOp. Error."); - Teuchos::RCP<const Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> bMat = Teuchos::rcp_dynamic_cast<const Xpetra::BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xMat); - TEUCHOS_TEST_FOR_EXCEPTION(bMat.is_null(), MueLu::Exceptions::BadCast, "Bad cast from \'const Xpetra::Matrix\' to \'const Xpetra::BlockedCrsMatrix\'. The origin type is " << typeid(const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>).name() << ". Note: you need a BlockedCrsMatrix object for the StatusTestGenResSubNorm to work!"); - mapExtractor_ = bMat->getRangeMapExtractor(); - TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor_.is_null(), MueLu::Exceptions::RuntimeError, "Could not extract map extractor from BlockedCrsMatrix. Error."); - TEUCHOS_TEST_FOR_EXCEPTION(mapExtractor_->NumMaps() <= subIdx_, MueLu::Exceptions::RuntimeError, "The multivector is only split into " << mapExtractor_->NumMaps() << " sub parts. Cannot access sub-block " << subIdx_ << "."); - - // calculate initial norms - if (scaletype_ == NormOfRHS) - { - Teuchos::RCP<const MV> rhs = lp.getRHS(); - numrhs_ = MVT::GetNumberVecs(*rhs); - scalevector_.resize(numrhs_); - MvSubNorm(*rhs, subIdx_, scalevector_, scalenormtype_); - } - else if (scaletype_ == NormOfInitRes) - { - Teuchos::RCP<const MV> init_res = lp.getInitResVec(); - numrhs_ = MVT::GetNumberVecs(*init_res); - scalevector_.resize(numrhs_); - MvSubNorm(*init_res, subIdx_, scalevector_, scalenormtype_); - } - else if (scaletype_ == NormOfPrecInitRes) - { - Teuchos::RCP<const MV> init_res = lp.getInitPrecResVec(); - numrhs_ = MVT::GetNumberVecs(*init_res); - scalevector_.resize(numrhs_); - MvSubNorm(*init_res, subIdx_, scalevector_, scalenormtype_); - } - else if (scaletype_ == NormOfFullInitRes) - { - Teuchos::RCP<const MV> init_res = lp.getInitResVec(); - numrhs_ = MVT::GetNumberVecs(*init_res); - scalevector_.resize(numrhs_); - MVT::MvNorm(*init_res, scalevector_, scalenormtype_); - scalevalue_ = one; - } - else if (scaletype_ == NormOfFullPrecInitRes) - { - Teuchos::RCP<const MV> init_res = lp.getInitPrecResVec(); - numrhs_ = MVT::GetNumberVecs(*init_res); - scalevector_.resize(numrhs_); - MVT::MvNorm(*init_res, scalevector_, scalenormtype_); - scalevalue_ = one; - } - else if (scaletype_ == NormOfFullScaledInitRes) - { - Teuchos::RCP<const MV> init_res = lp.getInitResVec(); - numrhs_ = MVT::GetNumberVecs(*init_res); - scalevector_.resize(numrhs_); - MVT::MvNorm(*init_res, scalevector_, scalenormtype_); - MvScalingRatio(*init_res, subIdx_, scalevalue_); - } - else if (scaletype_ == NormOfFullScaledPrecInitRes) - { - Teuchos::RCP<const MV> init_res = lp.getInitPrecResVec(); - numrhs_ = MVT::GetNumberVecs(*init_res); - scalevector_.resize(numrhs_); - MVT::MvNorm(*init_res, scalevector_, scalenormtype_); - MvScalingRatio(*init_res, subIdx_, scalevalue_); - } - else - { - numrhs_ = MVT::GetNumberVecs(*(lp.getRHS())); - } - - resvector_.resize(numrhs_); - testvector_.resize(numrhs_); - - curLSNum_ = lp.getLSNumber(); - curLSIdx_ = lp.getLSIndex(); - curBlksz_ = (int)curLSIdx_.size(); - int validLS = 0; - for (i = 0; i < curBlksz_; ++i) - { - if (curLSIdx_[i] > -1 && curLSIdx_[i] < numrhs_) - validLS++; - } - curNumRHS_ = validLS; - // - // Initialize the testvector. - for (i = 0; i < numrhs_; i++) - { - testvector_[i] = one; - } - - // Return an error if the scaling is zero. - if (scalevalue_ == zero) - { - return Failed; - } - } - return Undefined; - } - //@} - - /** \name Overridden from Teuchos::Describable */ - //@{ - - /** \brief Method to return description of the maximum iteration status test */ - std::string description() const - { - std::ostringstream oss; - oss << "Belos::StatusTestGenResSubNorm<>: " << resFormStr(); - oss << ", tol = " << tolerance_; - return oss.str(); - } - //@} - -protected: -private: - //! @name Private methods. - //@{ - /** \brief Description of current residual form */ - std::string resFormStr() const - { - std::ostringstream oss; - oss << "("; - oss << ((resnormtype_ == OneNorm) ? "1-Norm" : (resnormtype_ == TwoNorm) ? "2-Norm" : "Inf-Norm"); - oss << " Exp"; - oss << " Res Vec [" << subIdx_ << "]) "; - - // If there is no residual scaling, return current string. - if (scaletype_ != None) - { - // Insert division sign. - oss << "/ "; - - // Determine output string for scaling, if there is any. - if (scaletype_ == UserProvided) - oss << " (User Scale)"; - else - { - oss << "("; - oss << ((scalenormtype_ == OneNorm) ? "1-Norm" : (resnormtype_ == TwoNorm) ? "2-Norm" : "Inf-Norm"); - if (scaletype_ == NormOfInitRes) - oss << " Res0 [" << subIdx_ << "]"; - else if (scaletype_ == NormOfPrecInitRes) - oss << " Prec Res0 [" << subIdx_ << "]"; - else if (scaletype_ == NormOfFullInitRes) - oss << " Full Res0 [" << subIdx_ << "]"; - else if (scaletype_ == NormOfFullPrecInitRes) - oss << " Full Prec Res0 [" << subIdx_ << "]"; - else if (scaletype_ == NormOfFullScaledInitRes) - oss << " scaled Full Res0 [" << subIdx_ << "]"; - else if (scaletype_ == NormOfFullScaledPrecInitRes) - oss << " scaled Full Prec Res0 [" << subIdx_ << "]"; - else - oss << " RHS [" << subIdx_ << "]"; - oss << ")"; - } - } - - // TODO add a tagging name - - return oss.str(); - } - - //@} - - //! @name Private helper functions - //@{ - - // calculate norm of partial multivector - void MvSubNorm(const MV &mv, size_t block, std::vector<typename Teuchos::ScalarTraits<Scalar>::magnitudeType> &normVec, NormType type = TwoNorm) - { - - Teuchos::RCP<const MV> input = Teuchos::rcpFromRef(mv); - - Teuchos::RCP<const MV> SubVec = mapExtractor_->ExtractVector(input, block); - typedef MultiVecTraits<Scalar, MV> MVT; - MVT::MvNorm(*SubVec, normVec, type); - } - - // calculate ration of sub-vector length to full vector length (for scalevalue_) - void MvScalingRatio(const MV &mv, size_t block, MagnitudeType &lengthRatio) - { - Teuchos::RCP<const MV> input = Teuchos::rcpFromRef(mv); - - Teuchos::RCP<const MV> SubVec = mapExtractor_->ExtractVector(input, block); - - lengthRatio = Teuchos::as<MagnitudeType>(SubVec->getGlobalLength()) / Teuchos::as<MagnitudeType>(input->getGlobalLength()); - } - //@} - - //! @name Private data members. - //@{ - - //! Tolerance used to determine convergence - MagnitudeType tolerance_; - - //! Index of block row in n x n block system of which we want to check the sub-residuals - size_t subIdx_; - - //! Number of residuals that must pass the convergence test before Passed is returned. - int quorum_; - - //! Determines if the entries for all of the residuals are shown or just the max. - bool showMaxResNormOnly_; - - //! Type of norm to use on residual (OneNorm, TwoNorm, or InfNorm). - NormType resnormtype_; - - //! Type of scaling to use (Norm of RHS, Norm of Initial Residual, None or User provided) - ScaleType scaletype_; - - //! Type of norm to use on the scaling (OneNorm, TwoNorm, or InfNorm) - NormType scalenormtype_; - - //! Scaling value. - MagnitudeType scalevalue_; - - //! Scaling std::vector. - std::vector<MagnitudeType> scalevector_; - - //! Residual norm std::vector. - std::vector<MagnitudeType> resvector_; - - //! Test std::vector = resvector_ / scalevector_ - std::vector<MagnitudeType> testvector_; - - //! Vector containing the indices for the vectors that passed the test. - std::vector<int> ind_; - - //! Most recent solution vector used by this status test. - Teuchos::RCP<MV> curSoln_; - - //! Status - StatusType status_; - - //! The current blocksize of the linear system being solved. - int curBlksz_; - - //! The current number of right-hand sides being solved for. - int curNumRHS_; - - //! The indices of the current number of right-hand sides being solved for. - std::vector<int> curLSIdx_; - - //! The current number of linear systems that have been loaded into the linear problem. - int curLSNum_; - - //! The total number of right-hand sides being solved for. - int numrhs_; - - //! Is this the first time CheckStatus is called? - bool firstcallCheckStatus_; - - //! Is this the first time DefineResForm is called? - bool firstcallDefineResForm_; - - //! Is this the first time DefineScaleForm is called? - bool firstcallDefineScaleForm_; - - //! MapExtractor for range space - Teuchos::RCP<const ME> mapExtractor_; - - //! The number of iterations at which point each ensemble component converges - std::vector<int> ensemble_iterations; - - //@} -}; - -} // namespace Belos - -#endif - -#endif /* BELOS_XPETRA_STATUS_TEST_GEN_RES_SUB_NORM_HPP */ diff --git a/katoptron/src/CMakeLists.txt b/katoptron/src/CMakeLists.txt deleted file mode 100644 index 5c97361a..00000000 --- a/katoptron/src/CMakeLists.txt +++ /dev/null @@ -1,97 +0,0 @@ -# CMake input file of katoptron.so - -FILE(GLOB SRCS *.h *.cpp *.inl *.hpp) - -#ADD_EXECUTABLE(katoptron2 main.cpp) - -ADD_LIBRARY(katoptron SHARED ${SRCS}) -MACRO_DebugPostfix(katoptron) -TARGET_INCLUDE_DIRECTORIES(katoptron PUBLIC ${PROJECT_SOURCE_DIR}/katoptron/src) - -target_compile_definitions(katoptron PUBLIC WAVES_USE_TBOXVTK) - -# -- Search for Trilinos -FIND_PACKAGE(Trilinos REQUIRED) - -set (_VERB 0) # set to 1 for debugging -IF(_VERB) - MESSAGE("\nFound Trilinos! Here are the details: ") - MESSAGE(" Trilinos_DIR = ${Trilinos_DIR}") - MESSAGE(" Trilinos_VERSION = ${Trilinos_VERSION}") - MESSAGE(" Trilinos_PACKAGE_LIST = ${Trilinos_PACKAGE_LIST}") - MESSAGE(" Trilinos_LIBRARIES = ${Trilinos_LIBRARIES}") - MESSAGE(" Trilinos_INCLUDE_DIRS = ${Trilinos_INCLUDE_DIRS}") - MESSAGE(" Trilinos_LIBRARY_DIRS = ${Trilinos_LIBRARY_DIRS}") - MESSAGE(" Trilinos_TPL_LIST = ${Trilinos_TPL_LIST}") - MESSAGE(" Trilinos_TPL_INCLUDE_DIRS = ${Trilinos_TPL_INCLUDE_DIRS}") - MESSAGE(" Trilinos_TPL_LIBRARIES = ${Trilinos_TPL_LIBRARIES}") - MESSAGE(" Trilinos_TPL_LIBRARY_DIRS = ${Trilinos_TPL_LIBRARY_DIRS}") - MESSAGE(" Trilinos_BUILD_SHARED_LIBS = ${Trilinos_BUILD_SHARED_LIBS}") - MESSAGE(" Trilinos_CXX_COMPILER_FLAGS = ${Trilinos_CXX_COMPILER_FLAGS}") - MESSAGE("End of Trilinos details\n") -ENDIF() - -# MPI check -LIST(FIND Trilinos_TPL_LIST MPI MPI_List_ID) -IF (MPI_List_ID GREATER -1) - MESSAGE("-- Checking if MPI is enabled in Trilinos: MPI ENABLED") - SET(MYAPP_MPI TRUE) - ADD_DEFINITIONS(-DMYAPP_MPI) -ELSE() - MESSAGE("-- Checking if MPI is enabled in Trilinos: MPI NOT ENABLED") - SET(MYAPP_MPI FALSE) -ENDIF() - -# Set optional dependency in MyApp on Epetra package: -# this toggles code within #ifdef MYAPP_EPETRA -LIST(FIND Trilinos_PACKAGE_LIST Epetra Epetra_List_ID) -IF (Epetra_List_ID GREATER -1) - ADD_DEFINITIONS(-DMYAPP_EPETRA) - MESSAGE("-- Looking for Epetra: -- found, compiling with -DMYAPP_EPETRA") - SET(MYAPP_EPETRA TRUE) -ELSE() - MESSAGE("-- Looking for Epetra: -- not found.") - SET(MYAPP_EPETRA FALSE) -ENDIF() - -# -------------------------------------------------------------- -# Finds MPI (including MSMPI) -# -------------------------------------------------------------- -if(WIN32) - FIND_PATH(MPI_INCLUDE_PATH NAMES mpi.h HINTS "$ENV{MSMPI_INC}") - if("${CMAKE_SIZEOF_VOID_P}" EQUAL 8) - set(MS_MPI_ARCH_DIR x64) - find_library(MPI_LIBRARIES msmpi PATHS "$ENV{MSMPI_LIB64}") - else() - set(MS_MPI_ARCH_DIR x86) - find_library(MPI_LIBRARIES msmpi PATHS "$ENV{MSMPI_LIB32}") - endif() -else() - find_package(MPI REQUIRED) - # intel mpi (mpi.h doit etre inclus avant stdio.h) - # ou definir ces 2 macros - ADD_DEFINITIONS(-DMPICH_IGNORE_CXX_SEEK -DMPICH_SKIP_MPICXX) -endif() -# -------------------------------------------------------------- - -IF(_VERB) -MESSAGE(" Trilinos_LIBRARIES = ${Trilinos_LIBRARIES}") -ENDIF() - -list(REMOVE_ITEM Trilinos_LIBRARIES pytrilinos) - -IF(_VERB) -MESSAGE(" Trilinos_LIBRARIES = ${Trilinos_LIBRARIES}") -ENDIF() - -INCLUDE_DIRECTORIES ( ${PROJECT_SOURCE_DIR}/ext/amfe/tbox/src - ${PROJECT_SOURCE_DIR}/ext/amfe/fwk/src - ${Trilinos_INCLUDE_DIRS} - ${Trilinos_TPL_INCLUDE_DIRS} - ${MPI_INCLUDE_PATH}) - -LINK_DIRECTORIES (${Trilinos_LIBRARY_DIRS} ${Trilinos_TPL_LIBRARY_DIRS}) - -TARGET_LINK_LIBRARIES(katoptron tbox tboxVtk fwk ${Trilinos_LIBRARIES} ${Trilinos_TPL_LIBRARIES} ${MPI_LIBRARIES}) - -INSTALL(TARGETS katoptron DESTINATION ${CMAKE_INSTALL_PREFIX}) diff --git a/katoptron/src/ContactsList.cpp b/katoptron/src/ContactsList.cpp deleted file mode 100644 index ed239f19..00000000 --- a/katoptron/src/ContactsList.cpp +++ /dev/null @@ -1,284 +0,0 @@ -#include "ContactsList.h" - -#include "NodesList.h" - -#include "wProblem.h" -#include "wTag.h" -#include "wMshData.h" -#include "wElement.h" -#include "wNode.h" -#include "wMedium.h" -#include "wDirichlet.h" -#include "wContact.h" - -using namespace katoptron; -using namespace tbox; - -/** - * @brief ContactsList constructor - * - * This constructor allocates 11 Kokkos::View which store all the required information related to each contact interface, including: - * <ul> - * <li> all the slaves and master nodes and elements IDs, - * <li> all the normal of the surfaces, - * <li> type of Lagrange multiplier shape functions, - * <li> type of the interface (contact, Signorini, sticking contact, mesh tying), - * <li> initial status of the Lagrange multipliers and whether they should be updated. - * </ul> - * - * To do so, we need the information regarding the contact interfaces (stored into the katoptron::Problem object), the information on the - * distribution of the nodes (stored into the katoptron::Map object), and the information on the nodes and elements (stored into the - * katoptron::NodesList and katoptron::ElementList objects). - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> map: an RCP to a Map object, - * <li> elementsList: an RCP to an ElementList object, - * <li> nodesList: an RCP to a NodesList object. - * </ul> - */ -ContactsList::ContactsList(Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList, Teuchos::RCP<NodesList> nodesList) -{ - typedef Map::local_ordinal_type local_ordinal_type; - typedef Map::global_ordinal_type global_ordinal_type; - - contacts_number = pbl.Contacts.size(); - local_ordinal_type maxNumSlaveNodesPerContactFace = 0; - local_ordinal_type maxNumMasterNodesPerContactFace = 0; - local_ordinal_type maxNumSlaveElemsPerContactFace = 0; - local_ordinal_type maxNumMasterElemsPerContactFace = 0; - local_ordinal_type maxNumSlaveDirichletNodesPerContactFace = 0; - - for (auto i = 0; i < contacts_number; ++i) - { - std::vector<global_ordinal_type> myContactSlaveNodes; - std::vector<global_ordinal_type> myContactSlaveElems; - for (auto j = 0; j < pbl.Contacts[i]->slave_elems.size(); ++j) - { - local_ordinal_type e = map->mapElems->getLocalElement(pbl.Contacts[i]->slave_elems[j]->no - 1); - if (elementsList->getElementType(e) == static_cast<int>(ElType::QUAD4)) - ; - else if (elementsList->getElementType(e) == static_cast<int>(ElType::TRI3)) - ; - else - continue; - myContactSlaveElems.push_back(e); - for (auto n1 = 0; n1 < elementsList->getElementSize(e); ++n1) - { - global_ordinal_type i_global = map->mapNodesWO->getGlobalElement(elementsList->getElementNode(e, n1)); - - if (std::find(myContactSlaveNodes.begin(), myContactSlaveNodes.end(), i_global) == myContactSlaveNodes.end()) - myContactSlaveNodes.push_back(i_global); - } - } - - int myNumContactSlaveNodes = myContactSlaveNodes.size(); - int myNumContactSlaveElems = myContactSlaveElems.size(); - - int myNumContactSlaveDirichletNodes = pbl.Contacts[i]->slave_dirichlet_nodes.size(); - - std::vector<global_ordinal_type> myContactMasterNodes; - std::vector<global_ordinal_type> myContactMasterElems; - for (auto j = 0; j < pbl.Contacts[i]->master_elems.size(); ++j) - { - local_ordinal_type e = map->mapElems->getLocalElement(pbl.Contacts[i]->master_elems[j]->no - 1); - if (elementsList->getElementType(e) == static_cast<int>(ElType::QUAD4)) - ; - else if (elementsList->getElementType(e) == static_cast<int>(ElType::TRI3)) - ; - else if (elementsList->getElementType(e) == static_cast<int>(ElType::LINE2)) - ; - else - continue; - myContactMasterElems.push_back(e); - for (auto n1 = 0; n1 < elementsList->getElementSize(e); ++n1) - { - global_ordinal_type i_global = map->mapNodesWO->getGlobalElement(elementsList->getElementNode(e, n1)); - if (std::find(myContactMasterNodes.begin(), myContactMasterNodes.end(), i_global) == myContactMasterNodes.end()) - myContactMasterNodes.push_back(i_global); - } - } - - int myNumContactMasterNodes = myContactMasterNodes.size(); - int myNumContactMasterElems = myContactMasterElems.size(); - - if (maxNumSlaveNodesPerContactFace < myNumContactSlaveNodes) - maxNumSlaveNodesPerContactFace = myNumContactSlaveNodes; - if (maxNumSlaveElemsPerContactFace < myNumContactSlaveElems) - maxNumSlaveElemsPerContactFace = myNumContactSlaveElems; - - if (maxNumSlaveDirichletNodesPerContactFace < myNumContactSlaveDirichletNodes) - maxNumSlaveDirichletNodesPerContactFace = myNumContactSlaveDirichletNodes; - - if (maxNumMasterNodesPerContactFace < myNumContactMasterNodes) - maxNumMasterNodesPerContactFace = myNumContactMasterNodes; - if (maxNumMasterElemsPerContactFace < myNumContactMasterElems) - maxNumMasterElemsPerContactFace = myNumContactMasterElems; - } - - contacts_slave_nodes_size = 0; - contacts_slave_elems_size = 1; - contacts_master_nodes_size = 2; - contacts_master_elems_size = 3; - contacts_slave_normal = 4; - contacts_master_normal = 7; - contacts_slave_nodes = 10; - contacts_slave_elems = contacts_slave_nodes + maxNumSlaveNodesPerContactFace; - contacts_master_nodes = contacts_slave_elems + maxNumSlaveElemsPerContactFace; - contacts_master_elems = contacts_master_nodes + maxNumMasterNodesPerContactFace; - - size_t numMaxDirichletSlaveNode = 1; - for (auto i = 0; i < contacts_number; ++i) - if (numMaxDirichletSlaveNode < pbl.Contacts[i]->slave_dirichlet_nodes.size()) - numMaxDirichletSlaveNode = pbl.Contacts[i]->slave_dirichlet_nodes.size(); - - size_t numMaxClosedNode = 1; - for (auto i = 0; i < contacts_number; ++i) - if (numMaxClosedNode < pbl.Contacts[i]->initially_closed_nodes.size()) - numMaxClosedNode = pbl.Contacts[i]->initially_closed_nodes.size(); - - Kokkos::resize(contacts, contacts_number, contacts_master_elems + maxNumMasterElemsPerContactFace); - Kokkos::resize(contacts_normal, contacts_number, 6); - Kokkos::resize(shape_function, contacts_number); - Kokkos::resize(signorini, contacts_number); - Kokkos::resize(initially_open, contacts_number); - Kokkos::resize(no_update, contacts_number); - Kokkos::resize(sticking, contacts_number); - Kokkos::resize(mesh_tying, contacts_number); - Kokkos::resize(contacts_scale, contacts_number); - Kokkos::resize(contacts_dirichlet, contacts_number, numMaxDirichletSlaveNode + 1); - Kokkos::resize(initially_closed_nodes, contacts_number, numMaxClosedNode + 1); - - for (auto i = 0; i < contacts_number; ++i) - { - contacts_dirichlet(i, 0) = pbl.Contacts[i]->slave_dirichlet_nodes.size(); - for (auto j = 0; j < contacts_dirichlet(i, 0); ++j) - contacts_dirichlet(i, j + 1) = pbl.Contacts[i]->slave_dirichlet_nodes[j]; - } - - for (auto i = 0; i < contacts_number; ++i) - { - initially_closed_nodes(i, 0) = pbl.Contacts[i]->initially_closed_nodes.size(); - for (auto j = 0; j < initially_closed_nodes(i, 0); ++j) - initially_closed_nodes(i, j + 1) = pbl.Contacts[i]->initially_closed_nodes[j]; - } - - for (auto i = 0; i < contacts_number; ++i) - { - int myContactSlaveNodes_id = 0; - int myContactSlaveElems_id = 0; - - std::vector<global_ordinal_type> myContactSlaveNodes; - - for (auto j = 0; j < pbl.Contacts[i]->slave_elems.size(); ++j) - { - local_ordinal_type e = map->mapElems->getLocalElement(pbl.Contacts[i]->slave_elems[j]->no - 1); - if (elementsList->getElementType(e) == static_cast<int>(ElType::QUAD4)) - ; - else if (elementsList->getElementType(e) == static_cast<int>(ElType::TRI3)) - ; - else - continue; - contacts(i, contacts_slave_elems + myContactSlaveElems_id) = e; - ++myContactSlaveElems_id; - for (auto n1 = 0; n1 < elementsList->getElementSize(e); ++n1) - { - global_ordinal_type i_global = map->mapNodesWO->getGlobalElement(elementsList->getElementNode(e, n1)); - if (std::find(myContactSlaveNodes.begin(), myContactSlaveNodes.end(), i_global) == myContactSlaveNodes.end()) - { - myContactSlaveNodes.push_back(i_global); - ++myContactSlaveNodes_id; - } - } - } - for (auto j = 0; j < myContactSlaveNodes.size(); ++j) - contacts(i, contacts_slave_nodes + j) = myContactSlaveNodes[j]; - - contacts(i, contacts_slave_nodes_size) = myContactSlaveNodes_id; - contacts(i, contacts_slave_elems_size) = myContactSlaveElems_id; - - int myContactMasterNodes_id = 0; - int myContactMasterElems_id = 0; - - std::vector<global_ordinal_type> myContactMasterNodes; - - for (auto j = 0; j < pbl.Contacts[i]->master_elems.size(); ++j) - { - local_ordinal_type e = map->mapElems->getLocalElement(pbl.Contacts[i]->master_elems[j]->no - 1); - if (elementsList->getElementType(e) == static_cast<int>(ElType::QUAD4)) - ; - else if (elementsList->getElementType(e) == static_cast<int>(ElType::TRI3)) - ; - else if (elementsList->getElementType(e) == static_cast<int>(ElType::LINE2)) - ; - else - continue; - contacts(i, contacts_master_elems + myContactMasterElems_id) = e; - ++myContactMasterElems_id; - for (auto n1 = 0; n1 < elementsList->getElementSize(e); ++n1) - { - global_ordinal_type i_global = map->mapNodesWO->getGlobalElement(elementsList->getElementNode(e, n1)); - if (std::find(myContactMasterNodes.begin(), myContactMasterNodes.end(), i_global) == myContactMasterNodes.end()) - { - myContactMasterNodes.push_back(i_global); - ++myContactMasterNodes_id; - } - } - } - - for (auto j = 0; j < myContactMasterNodes.size(); ++j) - contacts(i, contacts_master_nodes + j) = myContactMasterNodes[j]; - - contacts(i, contacts_master_nodes_size) = myContactMasterNodes_id; - contacts(i, contacts_master_elems_size) = myContactMasterElems_id; - } - - for (auto i = 0; i < contacts_number; ++i) - { - - for (auto j = 0; j < 3; ++j) - { - contacts(i, contacts_slave_normal + j) = pbl.Contacts[i]->slave_normal(j); - contacts(i, contacts_master_normal + j) = pbl.Contacts[i]->master_normal(j); - - contacts_normal(i, j) = pbl.Contacts[i]->slave_normal(j); - contacts_normal(i, j + 3) = pbl.Contacts[i]->master_normal(j); - } - - if (pbl.Contacts[i]->standard_shape_functions) - shape_function(i) = 1; - else - shape_function(i) = 0; - - if (pbl.Contacts[i]->is_Signorini) - signorini(i) = 1; - else - signorini(i) = 0; - - if (pbl.Contacts[i]->mesh_tying) - mesh_tying(i) = 1; - else - mesh_tying(i) = 0; - - if (pbl.Contacts[i]->no_Update) - no_update(i) = 1; - else - no_update(i) = 0; - - if (pbl.Contacts[i]->sticking) - { - sticking(i) = true; - at_least_one_sticking = true; - } - else - sticking(i) = false; - - if (pbl.Contacts[i]->initial_closed) - initially_open(i) = 0; - else - initially_open(i) = 1; - - contacts_scale(i) = pbl.Contacts[i]->scale; - } -} diff --git a/katoptron/src/ContactsList.h b/katoptron/src/ContactsList.h deleted file mode 100644 index 4f6bf1f2..00000000 --- a/katoptron/src/ContactsList.h +++ /dev/null @@ -1,500 +0,0 @@ -#ifndef KATOPTRON_CONTACTSLIST_H -#define KATOPTRON_CONTACTSLIST_H - -#include "katoptron.h" - -#include "Map.h" -#include "NodesList.h" -#include "ElementsList.h" - -#include <Tpetra_Map.hpp> -#include <Tpetra_Vector.hpp> -#include <Teuchos_RCP.hpp> -#include <Kokkos_ViewFactory.hpp> - -namespace katoptron -{ - -/** - * @brief Class which is used to store the list of the contact interfaces. - */ -class ContactsList -{ -private: - bool at_least_one_sticking = false; - - typedef typename Map::local_ordinal_type local_ordinal_type; - typedef typename Map::global_ordinal_type global_ordinal_type; - - Kokkos::View<global_ordinal_type **, Kokkos::LayoutRight> contacts; - Kokkos::View<global_ordinal_type **, Kokkos::LayoutRight> contacts_dirichlet; - - Kokkos::View<local_ordinal_type *, Kokkos::LayoutRight> shape_function; - - Kokkos::View<local_ordinal_type *, Kokkos::LayoutRight> signorini; - - Kokkos::View<local_ordinal_type *, Kokkos::LayoutRight> initially_open; - - Kokkos::View<local_ordinal_type *, Kokkos::LayoutRight> no_update; - Kokkos::View<local_ordinal_type *, Kokkos::LayoutRight> sticking; - Kokkos::View<local_ordinal_type *, Kokkos::LayoutRight> mesh_tying; - - Kokkos::View<double *, Kokkos::LayoutRight> contacts_scale; - - Kokkos::View<local_ordinal_type **, Kokkos::LayoutRight> initially_closed_nodes; - - Kokkos::View<double **, Kokkos::LayoutRight> contacts_normal; - - local_ordinal_type contacts_number; - local_ordinal_type contacts_slave_nodes_size; - local_ordinal_type contacts_slave_elems_size; - local_ordinal_type contacts_master_nodes_size; - local_ordinal_type contacts_master_elems_size; - local_ordinal_type contacts_slave_normal; - local_ordinal_type contacts_master_normal; - local_ordinal_type contacts_slave_nodes; - local_ordinal_type contacts_slave_elems; - local_ordinal_type contacts_master_nodes; - local_ordinal_type contacts_master_elems; - -public: - ContactsList(Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList, - Teuchos::RCP<NodesList> nodesList); - - ~ContactsList() - { - Kokkos::resize(contacts, 0, 0); - Kokkos::resize(contacts_normal, 0, 0); - Kokkos::resize(shape_function, 0); - Kokkos::resize(signorini, 0); - Kokkos::resize(initially_open, 0); - Kokkos::resize(no_update, 0); - Kokkos::resize(sticking, 0); - Kokkos::resize(mesh_tying, 0); - Kokkos::resize(contacts_scale, 0); - Kokkos::resize(contacts_dirichlet, 0, 0); - Kokkos::resize(initially_closed_nodes, 0, 0); - } - - /** - * @brief Return the number of contact interfaces. - * - */ - inline local_ordinal_type getContactNumber() { return contacts_number; } - - /** - * @brief Return the number of slave nodes for a - * given interface. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline local_ordinal_type getSlaveNodesSize(local_ordinal_type i) - { - return contacts(i, contacts_slave_nodes_size); - } - - /** - * @brief Return the number of slave elements for a - * given interface. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline local_ordinal_type getSlaveElementsSize(local_ordinal_type i) - { - return contacts(i, contacts_slave_elems_size); - } - - /** - * @brief Return the number of master nodes for a - * given interface. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline local_ordinal_type getMasterNodesSize(local_ordinal_type i) - { - return contacts(i, contacts_master_nodes_size); - } - - /** - * @brief Return the number of master elements for a - * given interface. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline local_ordinal_type getMasterElementsSize(local_ordinal_type i) - { - return contacts(i, contacts_master_elems_size); - } - - /** - * @brief Return the global ID of the slave node n1 of - * a given interface. - * - * Arguments: - * <ul> - * <li> i: the interface ID, - * <li> n1: the ID of the node on the current interface. - * </ul> - */ - inline global_ordinal_type getSlaveNode(local_ordinal_type i, local_ordinal_type n1) - { - return contacts(i, contacts_slave_nodes + n1); - } - - /** - * @brief Return the local ID of the slave element e1 of - * a given interface. - * - * Arguments: - * <ul> - * <li> i: the interface ID, - * <li> e1: the ID of the element on the current interface. - * </ul> - */ - inline local_ordinal_type getSlaveElement(local_ordinal_type i, local_ordinal_type e1) - { - return contacts(i, contacts_slave_elems + e1); - } - - /** - * @brief Return the global ID of the master node n1 of - * a given interface. - * - * Argument: - * <ul> - * <li> i: the interface ID, - * <li> n1: the ID of the node on the current interface. - * </ul> - */ - inline global_ordinal_type getMasterNode(local_ordinal_type i, local_ordinal_type n1) - { - return contacts(i, contacts_master_nodes + n1); - } - - /** - * @brief Return the local ID of the master element e1 of - * a given interface. - * - * Arguments: - * <ul> - * <li> i: the interface ID, - * <li> e1: the ID of the element on the current interface. - * </ul> - */ - inline local_ordinal_type getMasterElement(local_ordinal_type i, local_ordinal_type e1) - { - return contacts(i, contacts_master_elems + e1); - } - - /** - * @brief Return the jth component of the normal vector to the slave - * side of a given interface. - * - * Arguments: - * <ul> - * <li> i: the interface ID, - * <li> j: the index of the component of the normal vector. - * </ul> - */ - inline double getSlaveNormal(local_ordinal_type i, local_ordinal_type j) - { - return contacts_normal(i, j); - } - - /** - * @brief Return the jth component of the normal vector to the master - * side of a given interface. - * - * Arguments: - * <ul> - * <li> i: the interface ID, - * <li> j: the index of the component of the normal vector. - * </ul> - */ - inline double getMasterNormal(local_ordinal_type i, local_ordinal_type j) - { - return contacts_normal(i, j + 3); - } - - /** - * @brief Return true if the shape functions of the Lagrange - * multipliers are the standard shape function for a given interface. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline bool isStandardShapeFunction(local_ordinal_type i) - { - return shape_function(i) == 1; - } - - /** - * @brief Return true if contact of the given interface is - * initially open. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline bool isInitiallyOpen(local_ordinal_type i) - { - return initially_open(i) == 1; - } - - /** - * @brief Return true if contact of the given interface is - * initially close. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline bool isInitiallyClose(local_ordinal_type i) - { - return initially_open(i) == 0; - } - - /** - * @brief Return true if the contact status of the given interface - * should be checked and potentially updated. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline bool isUpdated(local_ordinal_type i) - { - return no_update(i) == 0; - } - - /** - * @brief Return true if the contact status of the given interface - * should not be checked. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline bool isNotUpdated(local_ordinal_type i) - { - return no_update(i) == 1; - } - - /** - * @brief Return true if the given interface is a sticking contact - * interface. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline bool isSticking(local_ordinal_type i) - { - return sticking(i); - } - - /** - * @brief Return true if the given interface is a mesh tying - * interface. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline bool isTying(local_ordinal_type i) - { - return mesh_tying(i); - } - - /** - * @brief Return true if at least one contact interface is sticking. - */ - inline bool hasAtLeastOneSticking(void) - { - return at_least_one_sticking; - } - - /** - * @brief Return true if the given interface is a Signorini - * contact interface. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline bool isSignorini(local_ordinal_type i) - { - return signorini(i) == 1; - } - - /** - * @brief Return true if the given interface is not a Signorini - * contact interface. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline bool isNotSignorini(local_ordinal_type i) - { - return signorini(i) == 0; - } - - /** - * @brief Return true if at least one contact interface is a - * Signorini contact interface. - */ - inline bool isSignorini() - { - for (local_ordinal_type i = 0; i < contacts_number; ++i) - if (isSignorini(i)) - return true; - return false; - } - - /** - * @brief Return true if all the contact interfaces are not - * Signorini contact interfaces. - */ - inline bool isNotSignorini() - { - for (local_ordinal_type i = 0; i < contacts_number; ++i) - if (isSignorini(i)) - return false; - return true; - } - - /** - * @brief Return the number of Dirichlet nodes on the slave - * side for a given interface. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline local_ordinal_type slaveDirichletSize(local_ordinal_type i) - { - return contacts_dirichlet(i, 0); - } - - /** - * @brief Return the multiplicative scale used to multiply - * the normals of a given interface. - * - * Argument: - * <ul> - * <li> i: the interface ID. - * </ul> - */ - inline double getMortarScale(local_ordinal_type i) - { - return contacts_scale(i); - } - - /** - * @brief Return true if the node of global ID j is - * a slave node of the interface i. - * - * Arguments: - * <ul> - * <li> i: the interface ID, - * <li> j: the global ID of the tested node. - * </ul> - */ - bool isASlaveNode(local_ordinal_type i, global_ordinal_type j) - { - local_ordinal_type size = getSlaveNodesSize(i); - if (size == 0) - return false; - for (auto j2 = 0; j2 < size; ++j2) - if (j == getSlaveNode(i, j2)) - return true; - return false; - } - - /** - * @brief Return the interface ID associated to a slave node - * of global ID j. - * - * Argument: - * <ul> - * <li> j: the global ID of the node. - * </ul> - */ - local_ordinal_type getInterfaceOfSlaveNode(local_ordinal_type j) - { - for (local_ordinal_type i = 0; i < contacts_number; ++i) - if (isASlaveNode(i, j)) - return i; - return 0; - } - - /** - * @brief Return true if the slave node of global ID j - * is a Dirichlet node on the interface i. - * - * Arguments: - * <ul> - * <li> i: the interface ID, - * <li> j: the global ID of the node. - * </ul> - */ - bool isASlaveDirichletNode(local_ordinal_type i, local_ordinal_type j) - { - local_ordinal_type size = slaveDirichletSize(i); - if (size == 0) - return false; - for (auto j2 = 0; j2 < size; ++j2) - if (j == contacts_dirichlet(i, j2 + 1)) - return true; - return false; - } - - /** - * @brief Return true if the Lagrange multiplier associated to the - * slave node of global ID j on the interface i is initially active (closed contact). - * - * Arguments: - * <ul> - * <li> i: the interface ID, - * <li> j: the global ID of the node. - * </ul> - */ - bool isNodeInitiallyClosed(local_ordinal_type i, local_ordinal_type j) - { - local_ordinal_type size = initially_closed_nodes(i, 0); - if (size == 0) - return false; - for (auto j2 = 0; j2 < size; ++j2) - if (j == initially_closed_nodes(i, j2 + 1)) - return true; - return false; - } -}; - -}; // namespace katoptron - -#endif //KATOPTRON_CONTACTSLIST_H diff --git a/katoptron/src/DirichletList.h b/katoptron/src/DirichletList.h deleted file mode 100644 index 8f5627e9..00000000 --- a/katoptron/src/DirichletList.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef KATOPTRON_DIRICHLETLIST_H -#define KATOPTRON_DIRICHLETLIST_H - -#include "katoptron.h" - -#include "Map.h" -#include "wDirichlet.h" -#include "wProblem.h" -#include "wTag.h" -#include "wNode.h" - -#include "ElementsList.h" - -#include <Tpetra_Map.hpp> -#include <Tpetra_Vector.hpp> -#include <Teuchos_RCP.hpp> -#include <Kokkos_ViewFactory.hpp> - -#include "EnsembleTraits.h" - -namespace katoptron -{ - -/** - * @brief Class which is used to store the list of the Dirichlet boundary conditions (BC). - */ -template <typename scalar> -class DirichletList -{ - typedef Map::local_ordinal_type local_ordinal_type; - typedef Map::global_ordinal_type global_ordinal_type; - -private: - Kokkos::View<global_ordinal_type **, Kokkos::LayoutRight> dirichlet_nodesList; - Kokkos::View<scalar ***, Kokkos::LayoutRight> dirichlet_values_list; - - local_ordinal_type dirichlet_number; - local_ordinal_type dirichlet_size; - local_ordinal_type dirichlet_nodes; - - local_ordinal_type dirichlet_time; - local_ordinal_type dirichlet_dofs; - local_ordinal_type dirichlet_values; - -public: - DirichletList(Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList); - - /** - * @brief Return the number of Dirichlet BC. - */ - inline local_ordinal_type getDirichletNumber() { return dirichlet_number; } - - /** - * @brief Return the number of nodes for a - * given Dirichlet BC. - * - * Argument: - * <ul> - * <li> i: the BC ID. - * </ul> - */ - inline local_ordinal_type getDirichletSize(local_ordinal_type i) - { - return dirichlet_nodesList(i, dirichlet_size); - } - - /** - * @brief Return the global ID of the node n1 of - * a given BC. - * - * Arguments: - * <ul> - * <li> i: the BC ID, - * <li> n1: the ID of the node on the current BC. - * </ul> - */ - inline global_ordinal_type getDirichletNode(local_ordinal_type i, local_ordinal_type n1) - { - return dirichlet_nodesList(i, dirichlet_nodes + n1); - } - - /** - * @brief Return whether the DOF j is fixed for a given BC. - * - * Arguments: - * <ul> - * <li> i: the BC ID, - * <li> j: the index of the DOF (0-3 if thermomechanical problems). - * </ul> - */ - inline scalar getDirichletDof(local_ordinal_type i, local_ordinal_type j) - { - return dirichlet_values_list(i, 0, dirichlet_dofs + j); - } - - /** - * @brief Return the value of the fixed DOF for a given BC. - * - * Arguments: - * <ul> - * <li> i: the BC ID, - * <li> j: the index of the DOF (0-3 if thermomechanical problems). - * </ul> - */ - inline scalar getDirichletValue(local_ordinal_type i, local_ordinal_type j) - { - return dirichlet_values_list(i, 0, dirichlet_values + j); - } -}; -}; // namespace katoptron - -#endif //KATOPTRON_DIRICHLETLIST_H diff --git a/katoptron/src/DirichletList.hpp b/katoptron/src/DirichletList.hpp deleted file mode 100644 index c26eabc8..00000000 --- a/katoptron/src/DirichletList.hpp +++ /dev/null @@ -1,93 +0,0 @@ -namespace katoptron -{ - -/** - * @brief DirichletList constructor - * - * This constructor allocates 2 Kokkos::View which store all the required information related to each Dirichlet BC, including: - * <ul> - * <li> all the Dirichlet nodes, - * <li> all the values of the Dirichlet BC. - * </ul> - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> map: an RCP to a Map object, - * <li> elementsList: an RCP to an ElementList object. - * </ul> - */ -template <typename scalar> -DirichletList<scalar>::DirichletList(Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList) -{ - typedef Map::local_ordinal_type local_ordinal_type; - typedef Map::global_ordinal_type global_ordinal_type; - - typedef EnsembleTraits<scalar> ET; - const int ensemble_size = ET::size; - - local_ordinal_type numDPN = map->numPrimalDPN; - dirichlet_number = pbl.duBCs.size(); - local_ordinal_type maxNumNodesPerBC = 0; - - std::vector<std::vector<global_ordinal_type>> bcNodes = {}; - - for (auto i = 0; i < dirichlet_number; ++i) - { - std::vector<global_ordinal_type> tmpMyBcNodes = {}; - std::vector<global_ordinal_type> myBcNodes = {}; - - for (auto j = 0; j < pbl.duBCs[i]->nodes.size(); ++j) - tmpMyBcNodes.push_back(pbl.duBCs[i]->nodes[j]->row); - - std::sort(tmpMyBcNodes.begin(), tmpMyBcNodes.end()); - - if (tmpMyBcNodes.size() >= 1) - myBcNodes.push_back(tmpMyBcNodes[0]); - - for (auto ii = 1; ii < tmpMyBcNodes.size(); ++ii) - if (tmpMyBcNodes[ii] != tmpMyBcNodes[ii - 1]) - myBcNodes.push_back(tmpMyBcNodes[ii]); - - bcNodes.push_back(myBcNodes); - if (maxNumNodesPerBC < myBcNodes.size()) - maxNumNodesPerBC = myBcNodes.size(); - } - - dirichlet_size = 0; - dirichlet_nodes = 1; - dirichlet_nodesList = Kokkos::View<int **, Kokkos::LayoutRight>("R", dirichlet_number, dirichlet_nodes + maxNumNodesPerBC); - - for (auto i = 0; i < dirichlet_number; ++i) - { - dirichlet_nodesList(i, dirichlet_size) = bcNodes[i].size(); - for (auto j = 0; j < bcNodes[i].size(); ++j) - { - dirichlet_nodesList(i, dirichlet_nodes + j) = bcNodes[i][j]; - } - } - - dirichlet_time = 0; - dirichlet_dofs = 1; - dirichlet_values = 1 + numDPN; - dirichlet_values_list = Kokkos::View<scalar ***, Kokkos::LayoutRight>("R", dirichlet_number, 1, 1 + 2 * numDPN); - for (auto i = 0; i < dirichlet_number; ++i) - { - dirichlet_values_list(i, 0, dirichlet_time) = 0.; //to change latter - for (auto j = 0; j < numDPN; ++j) - if (pbl.duBCs[i]->which_dof[j]) - dirichlet_values_list(i, 0, dirichlet_dofs + j) = 1; - else - dirichlet_values_list(i, 0, dirichlet_dofs + j) = 0; - - for (int j = 0; j < ensemble_size; ++j) - { - ET::coeff(dirichlet_values_list(i, 0, dirichlet_values + 0), j) = pbl.duBCs[i]->x_values[j]; - ET::coeff(dirichlet_values_list(i, 0, dirichlet_values + 1), j) = pbl.duBCs[i]->y_values[j]; - ET::coeff(dirichlet_values_list(i, 0, dirichlet_values + 2), j) = pbl.duBCs[i]->z_values[j]; - if (numDPN == 4) - ET::coeff(dirichlet_values_list(i, 0, dirichlet_values + 3), j) = pbl.duBCs[i]->T_values[j]; - } - } -} -}; // namespace katoptron diff --git a/katoptron/src/DirichletListETI.cpp b/katoptron/src/DirichletListETI.cpp deleted file mode 100644 index ea0ea71e..00000000 --- a/katoptron/src/DirichletListETI.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "DirichletList.h" -#include "DirichletList.hpp" - -using namespace katoptron; - -template class DirichletList<double>; -template class DirichletList<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>>>; -template class DirichletList<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>>>; -template class DirichletList<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>>>; -template class DirichletList<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>>>; \ No newline at end of file diff --git a/katoptron/src/DiscreteProblem.h b/katoptron/src/DiscreteProblem.h deleted file mode 100644 index 54a9c7d4..00000000 --- a/katoptron/src/DiscreteProblem.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef KATOPTRON_DISCRETEPROBLEM_H -#define KATOPTRON_DISCRETEPROBLEM_H - -#include "katoptron.h" -#include "Map.h" -#include "Domain.h" -#include "Loads.h" -#include "Algebraic.h" -#include "ElementMatrices.h" -#include "ElementVectors.h" - -#include <Xpetra_Map.hpp> -#include <Xpetra_TpetraMap.hpp> -#include <Xpetra_BlockedMap.hpp> -#include <Xpetra_BlockedCrsMatrix.hpp> -#include <Xpetra_BlockedMultiVector.hpp> -#include <Xpetra_TpetraCrsMatrix.hpp> -#include <Xpetra_TpetraMultiVector.hpp> -#include <Xpetra_CrsMatrixWrap.hpp> -//#include <Xpetra_UseShortNames.hpp> - -#include "LinearSolver.h" - -#include "Mortar.h" - -#include <mpi.h> - -namespace katoptron -{ - -/** - * @brief Class which is used to store all the information related to the discretized problem: - * <ul> - * <li> the information related to the activity of the Lagrange multipliers, - * <li> the discretized domain, - * <li> the algebraic information. - * </ul> - */ -template <typename scalar> -class DiscreteProblem -{ -private: - Kokkos::View<scalar *, Kokkos::LayoutRight> old_old_activity; - Kokkos::View<scalar *, Kokkos::LayoutRight> old_activity; - -public: - // - // Convenience typedefs - // - typedef Map::local_ordinal_type local_ordinal_type; - typedef Map::global_ordinal_type global_ordinal_type; - typedef Map::node_type node_type; - typedef Tpetra::Export<local_ordinal_type, global_ordinal_type> export_type; - - typedef Map::tpetra_map_type tpetra_map_type; - typedef Map::xpetra_map_type xpetra_map_type; - typedef Map::xpetra_tmap_type xpetra_tmap_type; - typedef Map::xpetra_bmap_type xpetra_bmap_type; - - typedef typename Vectors<scalar>::tpetra_vector_type tpetra_vector_type; - typedef typename Vectors<scalar>::tpetra_mvector_type tpetra_mvector_type; - typedef typename Vectors<scalar>::xpetra_bmvector_type xpetra_bmvector_type; - typedef typename Vectors<scalar>::xpetra_mvector_type xpetra_mvector_type; - typedef typename Vectors<scalar>::xpetra_tmvector_type xpetra_tmvector_type; - - typedef typename Matrices<scalar>::tpetra_crs_type tpetra_crs_type; - typedef typename Matrices<scalar>::xpetra_crs_type xpetra_crs_type; - typedef typename Matrices<scalar>::xpetra_wcrs_type xpetra_wcrs_type; - typedef typename Matrices<scalar>::xpetra_bcrs_type xpetra_bcrs_type; - typedef typename Matrices<scalar>::xpetra_tcrs_type xpetra_tcrs_type; -#ifndef SWIG - Teuchos::RCP<Domain<scalar>> domain; - Teuchos::RCP<Loads<scalar>> loads; - Teuchos::RCP<Algebraic<scalar>> algebraic; -#endif - size_t numPrimalDPN; - - DiscreteProblem(Problem &pbl, size_t _numPrimalDPN, - Teuchos::RCP<Teuchos::ParameterList> randomParams, - Kokkos::View<scalar *, Kokkos::LayoutLeft> m_rv_values); - - ~DiscreteProblem() - { - std::cout << "~DiscreteProblem()\n"; - } - -#ifndef SWIG - void createBlockMatrix(scalar gamma, bool write, bool merge); - void createBlockMVector(bool write); - void computeMatrices(void); - void computeContactMatrices(MPI_Comm comm); - void computeLoads(bool scaled = false); - Mask<scalar> updateActivity(int active_set_iteration); - -#endif -}; -}; // namespace katoptron - -#endif //KATOPTRON_DISCRETEPROBLEM_H diff --git a/katoptron/src/DiscreteProblem.hpp b/katoptron/src/DiscreteProblem.hpp deleted file mode 100644 index 3a0332c0..00000000 --- a/katoptron/src/DiscreteProblem.hpp +++ /dev/null @@ -1,1424 +0,0 @@ -#include <Xpetra_MatrixFactory.hpp> -#include <Xpetra_Matrix.hpp> -#include <Xpetra_MatrixMatrix.hpp> -#include <Xpetra_CrsMatrixWrap.hpp> -#include <Xpetra_BlockedCrsMatrix.hpp> -#include <Xpetra_CrsMatrix.hpp> -#include <MueLu_Utilities_decl.hpp> - -namespace katoptron -{ - -/** - * @brief DiscreteProblem constructor - * - * This constructor constructs a katoptron::Map, a katoptron::Domain, a katoptron::Loads, and a katoptron::Algebraic. - * The last three objects are stored as member data of the katoptron::DiscreteProblem object and include all - * the information related to the problem to solve. See the documentation of the member data for more information on - * the purpose of each class. - * - * Arguments: - * <ul> - * <li> A problem object, - * <li> An RCP to a ParameterList object which describes the random fields, - * <li> A Kokkos View of the values used in the discretization of the random fields. - * </ul> - */ -template <typename scalar> -DiscreteProblem<scalar>::DiscreteProblem(Problem &pbl, size_t _numPrimalDPN, - Teuchos::RCP<Teuchos::ParameterList> randomParams, - Kokkos::View<scalar *, Kokkos::LayoutLeft> m_rv_values) -{ - numPrimalDPN = _numPrimalDPN; - - LinearSolver::getTimers()["map"].start(); - Teuchos::RCP<Map> map = Teuchos::rcp(new Map(pbl, numPrimalDPN)); - LinearSolver::getTimers()["map"].stop(); - LinearSolver::getTimers()["domain"].start(); - domain = Teuchos::rcp(new Domain<scalar>(pbl, map, randomParams, m_rv_values)); - LinearSolver::getTimers()["domain"].stop(); - LinearSolver::getTimers()["loads"].start(); - loads = Teuchos::rcp(new Loads<scalar>(pbl, map, domain)); - LinearSolver::getTimers()["loads"].stop(); - algebraic = Teuchos::rcp(new Algebraic<scalar>(map, domain)); -} - -/** - * @brief Update the activity of the Lagrange multipliers - * and return a Mask which stores true for the converged samples. - * - * Argument: - * <ul> - * <li> active_set_iteration: ID of the current active set iteration. - * </ul> - */ -template <typename scalar> -Mask<scalar> DiscreteProblem<scalar>::updateActivity(int active_set_iteration) -{ - using Teuchos::Array; - using Teuchos::RCP; - using Teuchos::rcp; - - const size_t myRank = algebraic->map->mapDofs->getComm()->getRank(); - - // First, get the displacement solution, - - RCP<tpetra_mvector_type> mx = - (Teuchos::rcp_dynamic_cast<xpetra_tmvector_type>(algebraic->vectors->solutionMultiVector))->getTpetra_MultiVector(); - RCP<tpetra_vector_type> xl = mx->getVectorNonConst(0); - - RCP<tpetra_vector_type> x = rcp(new tpetra_vector_type(algebraic->map->mapDofs, false)); - - RCP<xpetra_bmvector_type> blockedSol = - rcp(new xpetra_bmvector_type(algebraic->map->blockedMap, algebraic->vectors->solutionMultiVector)); - - RCP<tpetra_vector_type> l = - (Teuchos::rcp_dynamic_cast<xpetra_tmvector_type>(blockedSol->getMultiVector(1, true)))->getTpetra_MultiVector()->getVectorNonConst(0); - - RCP<tpetra_vector_type> gap = rcp(new tpetra_vector_type(*algebraic->vectors->initialGap, Teuchos::Copy)); - - RCP<export_type> exportx = rcp(new export_type(algebraic->map->fullmap, algebraic->map->mapDofs)); - - x->doExport(*xl, *exportx, Tpetra::INSERT); - - // Multiply it with B_G and remove initial gap - - // gap = 1 * B_G * x - 1 * gap - - algebraic->matrices->B_G->apply(*x, *gap, Teuchos::NO_TRANS, ((scalar)1.), ((scalar)-1.)); - - // sum lambda + c * the previously computed vector - double c = 1.; - l->update((scalar)c, *gap, (scalar)1.); // l = l + c*gap - - // loop on the local lagrange and create the new activity - - l->template sync<Kokkos::HostSpace>(); - auto l_2d = l->template getLocalView<Kokkos::HostSpace>(); - - Mask<scalar> hasConverged; - const size_t ensemble_size = hasConverged.getSize(); - - for (size_t l = 0; l < ensemble_size; ++l) - hasConverged.set(l, true); - - bool hasConverged_old = false; - if (active_set_iteration > 1) - hasConverged_old = true; - - algebraic->matrices->B_2->resumeFill(); - algebraic->matrices->C->resumeFill(); - algebraic->matrices->Cb->resumeFill(); - - const size_t numDPN = algebraic->map->numPrimalDPN; - - size_t numLMPN; - if (domain->contactsList->hasAtLeastOneSticking() && numDPN == 4) - numLMPN = 4; - else if (domain->contactsList->hasAtLeastOneSticking()) - numLMPN = 3; - else if (numDPN == 4) - numLMPN = 2; - else - numLMPN = 1; - - const int numMyLagrangeNum = algebraic->map->mapLagrangeDofs->getNodeNumElements(); - - const int numMyMechLagrangeNum = numMyLagrangeNum / numLMPN; - - for (auto local_index = 0; local_index < numMyMechLagrangeNum; ++local_index) - { - global_ordinal_type lagrange_id = algebraic->map->mapLagrangeDofs->getGlobalElement(local_index); - global_ordinal_type node_id = algebraic->map->lm_to_dof[lagrange_id]; - lagrange_id = lagrange_id * numLMPN; - local_ordinal_type interface_id = domain->contactsList->getInterfaceOfSlaveNode(node_id); - - if (domain->contactsList->isNotUpdated(interface_id)) - continue; - - scalar old_mask = old_activity(local_index); - scalar old_old_mask = old_old_activity(local_index); - Mask<scalar> current_mask = (l_2d(local_index * numLMPN, 0) >= 0.); - - scalar oneMask, oneNotMask; - mask_assign<scalar>(current_mask, oneMask) = {1., 0.}; - mask_assign<scalar>(current_mask, oneNotMask) = {0., 1.}; - - if (active_set_iteration > 1) - if (!MaskLogic::AND(oneMask == old_old_mask)) - hasConverged_old = false; - - hasConverged = hasConverged && (oneMask == old_mask); - - if (!MaskLogic::AND(oneMask == old_mask)) - { - global_ordinal_type lagrange_id = algebraic->map->mapLagrangeDofs->getGlobalElement(local_index); - - lagrange_id = lagrange_id * numLMPN; - - // If the current Lagrange multiplier is active for every sample of the current ensemble, - // we can do the update without using the mask entries. - if (MaskLogic::AND(current_mask)) - { - Teuchos::ArrayView<const local_ordinal_type> local_indices; - Teuchos::ArrayView<const scalar> values; - - if (domain->contactsList->isSticking(interface_id)) - { - for (size_t j = 0; j < numLMPN; ++j) - { - algebraic->matrices->B->getLocalRowView(local_index * numLMPN + j, local_indices, values); - - for (auto k = 0; k < local_indices.size(); ++k) - { - global_ordinal_type column_index = algebraic->matrices->B->getColMap()->getGlobalElement(local_indices[k]); - - algebraic->matrices->B_2->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(column_index), - Teuchos::tuple<scalar>(values[k])); - } - - algebraic->matrices->C->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(lagrange_id + j), - Teuchos::tuple<scalar>((scalar)0.)); - - algebraic->matrices->Cb->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(lagrange_id + j), - Teuchos::tuple<scalar>((scalar)1.)); - } - } - else - { - algebraic->matrices->B->getLocalRowView(local_index * numLMPN, local_indices, values); - - for (auto k = 0; k < local_indices.size(); ++k) - { - global_ordinal_type column_index = algebraic->matrices->B->getColMap()->getGlobalElement(local_indices[k]); - - algebraic->matrices->B_2->replaceGlobalValues(lagrange_id, - Teuchos::tuple<global_ordinal_type>(column_index), - Teuchos::tuple<scalar>(values[k])); - } - - algebraic->matrices->C->replaceGlobalValues(lagrange_id, - Teuchos::tuple<global_ordinal_type>(lagrange_id), - Teuchos::tuple<scalar>((scalar)0.)); - - algebraic->matrices->Cb->replaceGlobalValues(lagrange_id, - Teuchos::tuple<global_ordinal_type>(lagrange_id), - Teuchos::tuple<scalar>((scalar)1.)); - - if (numLMPN == 2 || numLMPN == 4) - { - algebraic->matrices->B->getLocalRowView(local_index * numLMPN + numLMPN - 1, local_indices, values); - - for (auto k = 0; k < local_indices.size(); ++k) - { - global_ordinal_type column_index = algebraic->matrices->B->getColMap()->getGlobalElement(local_indices[k]); - - algebraic->matrices->B_2->replaceGlobalValues(lagrange_id + numLMPN - 1, - Teuchos::tuple<global_ordinal_type>(column_index), - Teuchos::tuple<scalar>(values[k])); - } - - algebraic->matrices->C->replaceGlobalValues(lagrange_id + numLMPN - 1, - Teuchos::tuple<global_ordinal_type>(lagrange_id + numLMPN - 1), - Teuchos::tuple<scalar>((scalar)0.)); - - algebraic->matrices->Cb->replaceGlobalValues(lagrange_id + numLMPN - 1, - Teuchos::tuple<global_ordinal_type>(lagrange_id + numLMPN - 1), - Teuchos::tuple<scalar>((scalar)1.)); - } - } - } - // If the current Lagrange multiplier is inactive for every sample of the current ensemble, - // we can do the update without using the mask entries. - else if (!MaskLogic::AND(current_mask)) - { - Teuchos::ArrayView<const local_ordinal_type> local_indices; - Teuchos::ArrayView<const scalar> values; - - if (domain->contactsList->isSticking(interface_id)) - { - for (size_t j = 0; j < numLMPN; ++j) - { - algebraic->matrices->B->getLocalRowView(local_index * numLMPN + j, local_indices, values); - - for (auto k = 0; k < local_indices.size(); ++k) - { - global_ordinal_type column_index = algebraic->matrices->B->getColMap()->getGlobalElement(local_indices[k]); - - algebraic->matrices->B_2->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(column_index), - Teuchos::tuple<scalar>((scalar)0.)); - } - - algebraic->matrices->C->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(lagrange_id + j), - Teuchos::tuple<scalar>((scalar)1.)); - - algebraic->matrices->Cb->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(lagrange_id + j), - Teuchos::tuple<scalar>((scalar)0.)); - } - } - else - { - algebraic->matrices->B->getLocalRowView(local_index * numLMPN, local_indices, values); - - for (auto k = 0; k < local_indices.size(); ++k) - { - global_ordinal_type column_index = algebraic->matrices->B->getColMap()->getGlobalElement(local_indices[k]); - - algebraic->matrices->B_2->replaceGlobalValues(lagrange_id, - Teuchos::tuple<global_ordinal_type>(column_index), - Teuchos::tuple<scalar>((scalar)0.)); - } - - algebraic->matrices->C->replaceGlobalValues(lagrange_id, - Teuchos::tuple<global_ordinal_type>(lagrange_id), - Teuchos::tuple<scalar>((scalar)1.)); - - algebraic->matrices->Cb->replaceGlobalValues(lagrange_id, - Teuchos::tuple<global_ordinal_type>(lagrange_id), - Teuchos::tuple<scalar>((scalar)0.)); - - if (numLMPN == 2 || numLMPN == 4) - { - algebraic->matrices->B->getLocalRowView(local_index * numLMPN + numLMPN - 1, local_indices, values); - - for (auto k = 0; k < local_indices.size(); ++k) - { - global_ordinal_type column_index = algebraic->matrices->B->getColMap()->getGlobalElement(local_indices[k]); - - algebraic->matrices->B_2->replaceGlobalValues(lagrange_id + numLMPN - 1, - Teuchos::tuple<global_ordinal_type>(column_index), - Teuchos::tuple<scalar>((scalar)0.)); - } - - algebraic->matrices->C->replaceGlobalValues(lagrange_id + numLMPN - 1, - Teuchos::tuple<global_ordinal_type>(lagrange_id + numLMPN - 1), - Teuchos::tuple<scalar>((scalar)1.)); - - algebraic->matrices->Cb->replaceGlobalValues(lagrange_id + numLMPN - 1, - Teuchos::tuple<global_ordinal_type>(lagrange_id + numLMPN - 1), - Teuchos::tuple<scalar>((scalar)0.)); - } - } - } - // Else, if the activity of the current Lagrange multiplier depends on the samples, we use the mask to do the update. - else - { - - Teuchos::ArrayView<const local_ordinal_type> local_indices; - Teuchos::ArrayView<const scalar> values; - - if (domain->contactsList->isSticking(interface_id)) - { - for (size_t j = 0; j < numLMPN; ++j) - { - algebraic->matrices->B->getLocalRowView(local_index * numLMPN + j, local_indices, values); - - for (auto k = 0; k < local_indices.size(); ++k) - { - global_ordinal_type column_index = algebraic->matrices->B->getColMap()->getGlobalElement(local_indices[k]); - - algebraic->matrices->B_2->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(column_index), - Teuchos::tuple<scalar>(oneMask * values[k])); - } - - algebraic->matrices->C->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(lagrange_id + j), - Teuchos::tuple<scalar>(oneNotMask)); - - algebraic->matrices->Cb->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(lagrange_id + j), - Teuchos::tuple<scalar>(oneMask)); - } - } - else - { - algebraic->matrices->B->getLocalRowView(local_index * numLMPN, local_indices, values); - - for (auto k = 0; k < local_indices.size(); ++k) - { - global_ordinal_type column_index = algebraic->matrices->B->getColMap()->getGlobalElement(local_indices[k]); - - algebraic->matrices->B_2->replaceGlobalValues(lagrange_id, - Teuchos::tuple<global_ordinal_type>(column_index), - Teuchos::tuple<scalar>(oneMask * values[k])); - } - - algebraic->matrices->C->replaceGlobalValues(lagrange_id, - Teuchos::tuple<global_ordinal_type>(lagrange_id), - Teuchos::tuple<scalar>(oneNotMask)); - - algebraic->matrices->Cb->replaceGlobalValues(lagrange_id, - Teuchos::tuple<global_ordinal_type>(lagrange_id), - Teuchos::tuple<scalar>(oneMask)); - - if (numLMPN == 2 || numLMPN == 4) - { - algebraic->matrices->B->getLocalRowView(local_index * numLMPN + numLMPN - 1, local_indices, values); - - for (auto k = 0; k < local_indices.size(); ++k) - { - global_ordinal_type column_index = algebraic->matrices->B->getColMap()->getGlobalElement(local_indices[k]); - - algebraic->matrices->B_2->replaceGlobalValues(lagrange_id + numLMPN - 1, - Teuchos::tuple<global_ordinal_type>(column_index), - Teuchos::tuple<scalar>(oneMask * values[k])); - } - - algebraic->matrices->C->replaceGlobalValues(lagrange_id + numLMPN - 1, - Teuchos::tuple<global_ordinal_type>(lagrange_id + numLMPN - 1), - Teuchos::tuple<scalar>(oneNotMask)); - - algebraic->matrices->Cb->replaceGlobalValues(lagrange_id + numLMPN - 1, - Teuchos::tuple<global_ordinal_type>(lagrange_id + numLMPN - 1), - Teuchos::tuple<scalar>(oneMask)); - } - } - } - } - - old_old_activity(local_index) = old_activity(local_index); - old_activity(local_index) = oneMask; - } - - algebraic->matrices->B_2->fillComplete(algebraic->map->mapDofs, algebraic->map->mapLagrangeDofs); - algebraic->matrices->C->fillComplete(); - algebraic->matrices->Cb->fillComplete(); - - RCP<tpetra_vector_type> initialActiveGap(new tpetra_vector_type(algebraic->map->mapLagrangeDofs, true)); - algebraic->matrices->Cb->apply(*algebraic->vectors->initialGap, *initialActiveGap); - - RCP<xpetra_mvector_type> xg = - rcp(new xpetra_tmvector_type(initialActiveGap)); - algebraic->vectors->rhsBlockedMultiVector->setMultiVector(1, xg, true); - algebraic->vectors->rhsMultiVector = algebraic->vectors->rhsBlockedMultiVector->Merge(); - - size_t numtasks = algebraic->map->mapDofs->getComm()->getSize(); - - double tmp; - - if (myRank == 0) - { - Mask<scalar> globalHasConverged = hasConverged; - bool globalHasConverged_old = hasConverged_old; - - for (size_t i = 1; i < numtasks; ++i) - { - for (size_t l = 0; l < ensemble_size; ++l) - { - MPI_Recv(&tmp, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - if (tmp < 0.) - globalHasConverged.set(l, false); - } - MPI_Recv(&tmp, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - if (tmp < 0.) - globalHasConverged_old = false; - } - hasConverged = globalHasConverged; - hasConverged_old = globalHasConverged_old; - - for (size_t i = 1; i < numtasks; ++i) - { - for (size_t l = 0; l < ensemble_size; ++l) - { - tmp = hasConverged.get(l) ? 1. : -1.; - MPI_Send(&tmp, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); - } - tmp = hasConverged_old ? 1. : -1.; - MPI_Send(&tmp, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); - } - } - else - { - for (size_t l = 0; l < ensemble_size; ++l) - { - tmp = hasConverged.get(l) ? 1. : -1.; - MPI_Send(&tmp, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD); - } - tmp = hasConverged_old ? 1. : -1.; - MPI_Send(&tmp, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD); - for (size_t l = 0; l < ensemble_size; ++l) - { - MPI_Recv(&tmp, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - hasConverged.set(l, tmp > 0.); - } - MPI_Recv(&tmp, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); - hasConverged_old = (tmp > 0.); - } - - if (hasConverged_old) - { - if (myRank == 0) - { - std::cout << "-----------------------" << std::endl; - std::cout << "---Has not converged---" << std::endl; - std::cout << "-----------------------" << std::endl; - } - return true; - } - - return hasConverged; -} - -/** - * @brief Create the block matrix. - * - * Arguments: - * <ul> - * <li> gamma: the value used for the Augmented Lagrangian formulation, - * <li> write: a boolean which is used to write matrices on disk or not. - * </ul> - */ -template <typename scalar> -void DiscreteProblem<scalar>::createBlockMatrix(scalar gamma, bool write, bool merge) -{ - using Teuchos::Array; - using Teuchos::RCP; - using Teuchos::rcp; - - const std::vector<RCP<const tpetra_map_type>> maps = {algebraic->map->mapDofs, algebraic->map->mapLagrangeDofs}; - - const size_t numDofs = algebraic->map->mapDofs->getGlobalNumElements(); - const size_t numMyDofs = algebraic->map->mapDofs->getNodeNumElements(); - const size_t numMyDofsWO = algebraic->map->mapDofsWO->getNodeNumElements(); - Teuchos::ArrayView<const global_ordinal_type> myDofs = algebraic->map->mapDofs->getNodeElementList(); - Teuchos::ArrayView<const global_ordinal_type> myDofsWO = algebraic->map->mapDofsWO->getNodeElementList(); - - const size_t numLagrangeDofs = algebraic->map->mapLagrangeDofs->getGlobalNumElements(); - const size_t numMyLagrangeDofs = algebraic->map->mapLagrangeDofs->getNodeNumElements(); - Teuchos::ArrayView<const global_ordinal_type> myLagrangeDofs = algebraic->map->mapLagrangeDofs->getNodeElementList(); - - Array<global_ordinal_type> myFullDofs(numMyDofs + numMyLagrangeDofs); - for (auto i = 0; i < numMyDofs; ++i) - myFullDofs[i] = myDofs[i]; - for (auto i = 0; i < numMyLagrangeDofs; ++i) - myFullDofs[numMyDofs + i] = numDofs + myLagrangeDofs[i]; - - Array<global_ordinal_type> myFullDofsWO(numMyDofsWO + numMyLagrangeDofs); - for (auto i = 0; i < numMyDofsWO; ++i) - myFullDofsWO[i] = myDofsWO[i]; - for (auto i = 0; i < numMyLagrangeDofs; ++i) - myFullDofsWO[numMyDofsWO + i] = numDofs + myLagrangeDofs[i]; - - algebraic->map->fullmap = - rcp(new tpetra_map_type(numDofs + numLagrangeDofs, - myFullDofs, - algebraic->map->mapDofs->getIndexBase(), - algebraic->map->mapDofs->getComm())); - algebraic->map->fullmapWO = - rcp(new tpetra_map_type(numDofs + numLagrangeDofs, - myFullDofsWO, - algebraic->map->mapDofs->getIndexBase(), - algebraic->map->mapDofs->getComm())); - - RCP<xpetra_map_type> xfullmap = rcp(new xpetra_tmap_type(algebraic->map->fullmap)); - - const size_t myRank = algebraic->map->mapDofs->getComm()->getRank(); - const size_t numLclIndices = (myRank == 0) ? numDofs + numLagrangeDofs : 0; - - algebraic->map->fullmapOutput = - rcp(new tpetra_map_type(numDofs + numLagrangeDofs, - numLclIndices, - algebraic->map->mapDofs->getIndexBase(), - algebraic->map->mapDofs->getComm())); - - std::vector<RCP<const xpetra_map_type>> xsubmaps = {rcp(new xpetra_tmap_type(algebraic->map->mapDofs)), //algebraic->map->thermomecBlockedMap, - rcp(new xpetra_tmap_type(algebraic->map->mapLagrangeDofs))}; - - algebraic->map->blockedMap = - rcp(new xpetra_bmap_type(xfullmap, xsubmaps, true)); - - algebraic->matrices->blockedMatrix = - rcp(new xpetra_bcrs_type(algebraic->map->blockedMap, algebraic->map->blockedMap, 8)); - - //Update B based on the initial activity - - algebraic->matrices->B_2->resumeFill(); - algebraic->matrices->C->resumeFill(); - algebraic->matrices->Cb->resumeFill(); - - const size_t numDPN = algebraic->map->numPrimalDPN; - - size_t numLMPN; - if (domain->contactsList->hasAtLeastOneSticking() && numDPN == 4) - numLMPN = 4; - else if (domain->contactsList->hasAtLeastOneSticking()) - numLMPN = 3; - else if (numDPN == 4) - numLMPN = 2; - else - numLMPN = 1; - - const int numMyLagrangeNum = algebraic->map->mapLagrangeDofs->getNodeNumElements(); - - const int numMyMechLagrangeNum = numMyLagrangeNum / numLMPN; - - old_activity = Kokkos::View<scalar *, Kokkos::LayoutRight>("R", numMyMechLagrangeNum); - old_old_activity = Kokkos::View<scalar *, Kokkos::LayoutRight>("R", numMyMechLagrangeNum); - - for (auto local_index = 0; local_index < numMyMechLagrangeNum; ++local_index) - { - global_ordinal_type lagrange_id = algebraic->map->mapLagrangeDofs->getGlobalElement(local_index); - global_ordinal_type node_id = algebraic->map->lm_to_dof[lagrange_id]; - lagrange_id = lagrange_id * numLMPN; - local_ordinal_type interface_id = domain->contactsList->getInterfaceOfSlaveNode(node_id); - if (domain->contactsList->isInitiallyOpen(interface_id)) - { - if (domain->contactsList->isNodeInitiallyClosed(interface_id, node_id)) - { - old_activity(local_index) = (scalar)1.; - continue; - } - old_activity(local_index) = (scalar)0.; - - Teuchos::ArrayView<const local_ordinal_type> local_indices; - Teuchos::ArrayView<const scalar> values; - - for (size_t j = 0; j < numLMPN; ++j) - { - algebraic->matrices->B_2->getLocalRowView(local_index * numLMPN + j, local_indices, values); - - for (auto k = 0; k < local_indices.size(); ++k) - { - global_ordinal_type column_index = algebraic->matrices->B->getColMap()->getGlobalElement(local_indices[k]); - - algebraic->matrices->B_2->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(column_index), - Teuchos::tuple<scalar>((scalar)0.)); - } - - algebraic->matrices->C->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(lagrange_id + j), - Teuchos::tuple<scalar>((scalar)1.)); - - algebraic->matrices->Cb->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(lagrange_id + j), - Teuchos::tuple<scalar>((scalar)0.)); - } - } - else - { - old_activity(local_index) = (scalar)1.; - if (domain->contactsList->isSticking(interface_id) == false && domain->contactsList->hasAtLeastOneSticking() == true) - { - Teuchos::ArrayView<const local_ordinal_type> local_indices; - Teuchos::ArrayView<const scalar> values; - - for (size_t j = 1; j < numLMPN; ++j) - { - algebraic->matrices->B_2->getLocalRowView(local_index * numLMPN + j, local_indices, values); - - for (auto k = 0; k < local_indices.size(); ++k) - { - global_ordinal_type column_index = algebraic->matrices->B->getColMap()->getGlobalElement(local_indices[k]); - - algebraic->matrices->B_2->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(column_index), - Teuchos::tuple<scalar>((scalar)0.)); - } - - algebraic->matrices->C->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(lagrange_id + j), - Teuchos::tuple<scalar>((scalar)1.)); - - algebraic->matrices->Cb->replaceGlobalValues(lagrange_id + j, - Teuchos::tuple<global_ordinal_type>(lagrange_id + j), - Teuchos::tuple<scalar>((scalar)0.)); - } - } - } - } - algebraic->matrices->B_2->fillComplete(algebraic->map->mapDofs, algebraic->map->mapLagrangeDofs); - algebraic->matrices->C->fillComplete(); - algebraic->matrices->Cb->fillComplete(); - - algebraic->matrices->xB = rcp(new xpetra_tcrs_type(algebraic->matrices->B_2)); - algebraic->matrices->xB_T = rcp(new xpetra_tcrs_type(algebraic->matrices->B_T)); - algebraic->matrices->xC = rcp(new xpetra_tcrs_type(algebraic->matrices->C)); - - algebraic->matrices->xwB = rcp(new xpetra_wcrs_type(algebraic->matrices->xB)); - algebraic->matrices->xwB_T = rcp(new xpetra_wcrs_type(algebraic->matrices->xB_T)); - algebraic->matrices->xwC = rcp(new xpetra_wcrs_type(algebraic->matrices->xC)); - - RCP<Xpetra::Matrix<scalar, local_ordinal_type, global_ordinal_type, node_type>> CTC = Teuchos::null; - RCP<Xpetra::Matrix<scalar, local_ordinal_type, global_ordinal_type, node_type>> ApCTC = Teuchos::null; - std::string MatrixMatrix_output_file = "MatrixMatrix_out.txt"; - std::ofstream MatrixMatrix_ofstream(MatrixMatrix_output_file); - RCP<Teuchos::FancyOStream> verbOut = Teuchos::getFancyOStream(Teuchos::rcpFromRef(MatrixMatrix_ofstream)); - CTC = - Xpetra::MatrixMatrix<scalar, local_ordinal_type, global_ordinal_type, node_type>::Multiply(*(algebraic->matrices->xwB_T), - false, - *(algebraic->matrices->xwB), - false, - *verbOut); - RCP<xpetra_bcrs_type> bA = Teuchos::rcp_dynamic_cast<xpetra_bcrs_type>(algebraic->matrices->A); - - if (gamma > 0.) - { - if (bA != Teuchos::null && merge) - Xpetra::MatrixMatrix<scalar, local_ordinal_type, global_ordinal_type, node_type>::TwoMatrixAdd(*CTC, - false, - gamma, - *(bA->Merge()), - false, - (scalar)1., - ApCTC, - *verbOut); - else - Xpetra::MatrixMatrix<scalar, local_ordinal_type, global_ordinal_type, node_type>::TwoMatrixAdd(*CTC, - false, - gamma, - *(algebraic->matrices->A), - false, - (scalar)1., - ApCTC, - *verbOut); - } - else - { - if (bA != Teuchos::null && merge) - ApCTC = bA->Merge(); - else - ApCTC = algebraic->matrices->A; - } - - algebraic->matrices->blockedMatrix->setMatrix(0, 0, ApCTC); - algebraic->matrices->blockedMatrix->setMatrix(0, 1, algebraic->matrices->xwB_T); - algebraic->matrices->blockedMatrix->setMatrix(1, 0, algebraic->matrices->xwB); - algebraic->matrices->blockedMatrix->setMatrix(1, 1, algebraic->matrices->xwC); - - algebraic->matrices->blockedMatrix->fillComplete(); - RCP<const xpetra_wcrs_type> tmpOp = Teuchos::rcp_dynamic_cast<const xpetra_wcrs_type>(ApCTC); - const RCP<const xpetra_tcrs_type> &tmp_ECrsMtx = Teuchos::rcp_dynamic_cast<const xpetra_tcrs_type>(tmpOp->getCrsMatrix()); - RCP<const tpetra_crs_type> tpetra_ApCTC = tmp_ECrsMtx->getTpetra_CrsMatrix(); - - if (write) - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeSparseFile(std::string("ApCTC_mm.txt"), tpetra_ApCTC); -} - -/** - * @brief Create the block vectors. - * - * Argument: - * <ul> - * <li> write: a boolean which is used to write vectors on disk or not. - * </ul> - */ -template <typename scalar> -void DiscreteProblem<scalar>::createBlockMVector(bool write) -{ - using Teuchos::Array; - using Teuchos::RCP; - using Teuchos::rcp; - - RCP<tpetra_vector_type> intialContactPosition(new tpetra_vector_type(algebraic->map->mapDofs, true)); - algebraic->vectors->initialGap = rcp(new tpetra_vector_type(algebraic->map->mapLagrangeDofs, true)); - RCP<tpetra_vector_type> initialActiveGap(new tpetra_vector_type(algebraic->map->mapLagrangeDofs, true)); - - algebraic->vectors->lagrange = rcp(new tpetra_vector_type(algebraic->map->mapLagrangeDofs, true)); - - { - size_t numMyContacts = domain->contactsList->getContactNumber(); - size_t numPrimalDPN = algebraic->map->numPrimalDPN; - size_t numMPrimalDPN = 3; - size_t offSet = 0; - if (numPrimalDPN == 4) - offSet = algebraic->map->mapNodes->getGlobalNumElements(); - - for (auto i = 0; i < numMyContacts; ++i) - { - size_t numMySlaveNodes = domain->contactsList->getSlaveNodesSize(i); - for (auto j = 0; j < numMySlaveNodes; ++j) - { - // get unique node id - auto global_nodeid = domain->contactsList->getSlaveNode(i, j); - if (algebraic->map->mapNodes->isNodeGlobalElement(global_nodeid)) - { - auto local_nodeid = algebraic->map->mapNodesWO->getLocalElement(global_nodeid); - for (auto k = 0; k < 3; ++k) - { - scalar tmp = domain->nodesList->nodes(local_nodeid, k) + - domain->contactsList->getSlaveNormal(i, k) * - loads->preloadList->getPreloadValue(i); - intialContactPosition->replaceGlobalValue(offSet + global_nodeid * numMPrimalDPN + k, tmp); - } - } - } - - size_t numMyMasterNodes = domain->contactsList->getMasterNodesSize(i); - for (auto j = 0; j < numMyMasterNodes; ++j) - { - // get unique node id - auto global_nodeid = domain->contactsList->getMasterNode(i, j); - if (algebraic->map->mapNodes->isNodeGlobalElement(global_nodeid)) - { - auto local_nodeid = algebraic->map->mapNodesWO->getLocalElement(global_nodeid); - for (auto k = 0; k < 3; ++k) - intialContactPosition->replaceGlobalValue(offSet + global_nodeid * numMPrimalDPN + k, - ((scalar)domain->nodesList->nodes(local_nodeid, k))); - } - } - } - } - - algebraic->matrices->B_G->apply(*intialContactPosition, *algebraic->vectors->initialGap, Teuchos::NO_TRANS, ((scalar)-1.)); - - algebraic->matrices->Cb->apply(*algebraic->vectors->initialGap, *initialActiveGap); - - // TODO: fix me when there is mesh tying and contact together! - if (domain->contactsList->isTying(0)) - initialActiveGap->scale((scalar)0.); - - if (write) - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeDenseFile(std::string("initialActiveGap_mm.txt"), initialActiveGap); - - RCP<xpetra_mvector_type> xb = - rcp(new xpetra_tmvector_type(algebraic->vectors->b)); - - RCP<xpetra_mvector_type> xg = - rcp(new xpetra_tmvector_type(initialActiveGap)); - - RCP<xpetra_mvector_type> xx = - rcp(new xpetra_tmvector_type(algebraic->vectors->x)); - - RCP<xpetra_mvector_type> xlagrange = - rcp(new xpetra_tmvector_type(algebraic->vectors->lagrange)); - - algebraic->vectors->rhsBlockedMultiVector = - rcp(new xpetra_bmvector_type(algebraic->map->blockedMap, 1, true)); - - algebraic->vectors->solutionBlockedMultiVector = - rcp(new xpetra_bmvector_type(algebraic->map->blockedMap, 1, true)); - - algebraic->vectors->rhsBlockedMultiVector->setMultiVector(0, xb, true); - algebraic->vectors->rhsBlockedMultiVector->setMultiVector(1, xg, true); - - algebraic->vectors->solutionBlockedMultiVector->setMultiVector(0, xx, true); - algebraic->vectors->solutionBlockedMultiVector->setMultiVector(1, xlagrange, true); - - algebraic->vectors->rhsMultiVector = algebraic->vectors->rhsBlockedMultiVector->Merge(); - algebraic->vectors->solutionMultiVector = algebraic->vectors->solutionBlockedMultiVector->Merge(); -} - -/** - * @brief Compute the contacts matrices. - * - * Argument: - * <ul> - * <li> comm: the used MPI communicator. - * </ul> - */ -template <typename scalar> -void DiscreteProblem<scalar>::computeContactMatrices(MPI_Comm comm) -{ - compute_B<scalar>(algebraic->matrices, - domain->elementsList, - domain->nodesList, - domain->contactsList, - algebraic->map, comm); -} - -/** - * @brief Compute the primal matrix. - */ -template <typename scalar> -void DiscreteProblem<scalar>::computeMatrices(void) -{ - using Teuchos::RCP; - using Teuchos::rcp; - - typedef KokkosSparse::CrsMatrix<scalar, local_ordinal_type, typename tpetra_crs_type::execution_space> local_matrix_type; - - typedef Kokkos::View<scalar ***, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace> elem_matrix_view_type; - - local_matrix_type local_L, local_K, local_S; - - if (numPrimalDPN == 4 || numPrimalDPN == 1) - { - algebraic->matrices->L->resumeFill(); - algebraic->matrices->L->setAllToScalar((scalar)0.0); - - local_L = algebraic->matrices->L->getLocalMatrix(); - } - if (numPrimalDPN == 4 || numPrimalDPN == 3) - { - algebraic->matrices->K->resumeFill(); - algebraic->matrices->K->setAllToScalar((scalar)0.0); - - local_K = algebraic->matrices->K->getLocalMatrix(); - } - if (numPrimalDPN == 4) - { - algebraic->matrices->S->resumeFill(); - algebraic->matrices->S->setAllToScalar((scalar)0.0); - - local_S = algebraic->matrices->S->getLocalMatrix(); - } - - auto numMyElems = domain->elementsList->getElementNumber(); - - elem_matrix_view_type K, L, S; - -#ifdef KOKKOS_ENABLE_DEPRECATED_CODE - int pool_size = Kokkos::DefaultExecutionSpace::thread_pool_size(); -#else - int pool_size = Kokkos::DefaultExecutionSpace::impl_thread_pool_size(); -#endif - int max_element_size = 1; - - for (int i_elem = 0; i_elem < numMyElems; ++i_elem) - { - if (domain->elementsList->getElementType(i_elem) == static_cast<int>(tbox::ElType::HEX8)) - { - max_element_size = 8; - break; - } - if (domain->elementsList->getElementType(i_elem) == static_cast<int>(tbox::ElType::TETRA4)) - { - max_element_size = 4; - break; - } - } - - K = Kokkos::View<scalar ***, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace>("A", - pool_size, - 3 * max_element_size, - 3 * max_element_size); - L = Kokkos::View<scalar ***, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace>("A", - pool_size, - max_element_size, - max_element_size); - S = Kokkos::View<scalar ***, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace>("A", - pool_size, - 3 * max_element_size, - max_element_size); - - ElementMatrices<scalar, static_cast<int>(tbox::ElType::HEX8), 8> *elementMatrices_HEX8 = - new ElementMatrices<scalar, static_cast<int>(tbox::ElType::HEX8), 8>(domain, numPrimalDPN, pool_size); - ElementMatrices<scalar, static_cast<int>(tbox::ElType::TETRA4), 4> *elementMatrices_TETRA4 = - new ElementMatrices<scalar, static_cast<int>(tbox::ElType::TETRA4), 4>(domain, numPrimalDPN, pool_size); - - Kokkos::parallel_for( - numMyElems, KOKKOS_LAMBDA(const int i_elem) { - bool bContinue = true; - -#ifdef KOKKOS_ENABLE_DEPRECATED_CODE - int i_thread = Kokkos::DefaultExecutionSpace::thread_pool_rank(); -#else - int i_thread = Kokkos::DefaultExecutionSpace::impl_thread_pool_rank(); -#endif - const int e_size = domain->elementsList->getElementSize(i_elem); - - auto K_e = subview(K, i_thread, make_pair(0, 3 * e_size), make_pair(0, 3 * e_size)); - auto L_e = subview(L, i_thread, make_pair(0, e_size), make_pair(0, e_size)); - auto S_e = subview(S, i_thread, make_pair(0, 3 * e_size), make_pair(0, e_size)); - - if (domain->elementsList->getElementType(i_elem) == static_cast<int>(tbox::ElType::HEX8)) - { - elementMatrices_HEX8->compute(i_elem, i_thread); - Kokkos::deep_copy(K_e, elementMatrices_HEX8->getK(i_thread)); - Kokkos::deep_copy(L_e, elementMatrices_HEX8->getL(i_thread)); - Kokkos::deep_copy(S_e, elementMatrices_HEX8->getS(i_thread)); - } - - else if (domain->elementsList->getElementType(i_elem) == static_cast<int>(tbox::ElType::TETRA4)) - { - elementMatrices_TETRA4->compute(i_elem, i_thread); - Kokkos::deep_copy(K_e, elementMatrices_TETRA4->getK(i_thread)); - Kokkos::deep_copy(L_e, elementMatrices_TETRA4->getL(i_thread)); - Kokkos::deep_copy(S_e, elementMatrices_TETRA4->getS(i_thread)); - } - else - bContinue = false; - - if (bContinue) - for (auto i = 0; i < e_size; ++i) - { - local_ordinal_type node_i = domain->elementsList->getElementNode(i_elem, i); - global_ordinal_type global_node_id_i = algebraic->map->mapNodesWO->getGlobalElement(node_i); - // Test if mapNodes ownes global_node_id_i - if (algebraic->map->mapNodes->isNodeGlobalElement(global_node_id_i)) - { - local_ordinal_type local_node_id_i = algebraic->map->mapNodes->getLocalElement(global_node_id_i); - for (auto j = 0; j < e_size; ++j) - { - local_ordinal_type node_j = domain->elementsList->getElementNode(i_elem, j); - - if (numPrimalDPN == 4 || numPrimalDPN == 1) - { - local_ordinal_type cols = node_j; - scalar vals = L_e(i, j); - - local_L.sumIntoValues(local_node_id_i, &cols, 1, &vals, false, true); - } - if (numPrimalDPN == 4 || numPrimalDPN == 3) - { - for (auto k = 0; k < 3; ++k) - for (auto l = 0; l < 3; ++l) - { - local_ordinal_type cols = 3 * node_j + l; - scalar vals = K_e(3 * i + k, 3 * j + l); - local_K.sumIntoValues(3 * local_node_id_i + k, &cols, 1, &vals, false, true); - } - } - if (numPrimalDPN == 4) - { - for (auto k = 0; k < 3; ++k) - { - local_ordinal_type cols = node_j; - scalar vals = S_e(3 * i + k, j); - local_S.sumIntoValues(3 * local_node_id_i + k, &cols, 1, &vals, false, true); - } - } - } - } - } - }); - - if (numPrimalDPN == 4 || numPrimalDPN == 1) - { - algebraic->matrices->L->fillComplete(); - } - if (numPrimalDPN == 4 || numPrimalDPN == 3) - { - algebraic->matrices->K->fillComplete(); - } - if (numPrimalDPN == 4) - { - algebraic->matrices->S->fillComplete(); - } - - delete elementMatrices_HEX8; - delete elementMatrices_TETRA4; - - if (numPrimalDPN == 4) - { - RCP<xpetra_bcrs_type> bA = rcp(new xpetra_bcrs_type(algebraic->map->thermomecBlockedMap, algebraic->map->thermomecBlockedMap, 8)); - - RCP<xpetra_crs_type> xL = rcp(new xpetra_tcrs_type(algebraic->matrices->L)); - RCP<xpetra_crs_type> xK = rcp(new xpetra_tcrs_type(algebraic->matrices->K)); - RCP<xpetra_crs_type> xS = rcp(new xpetra_tcrs_type(algebraic->matrices->S)); - - RCP<xpetra_wcrs_type> xwL = rcp(new xpetra_wcrs_type(xL)); - RCP<xpetra_wcrs_type> xwK = rcp(new xpetra_wcrs_type(xK)); - RCP<xpetra_wcrs_type> xwS = rcp(new xpetra_wcrs_type(xS)); - - bA->setMatrix(0, 0, xwL); - bA->setMatrix(1, 0, xwS); - bA->setMatrix(1, 1, xwK); - - bA->fillComplete(); - - algebraic->matrices->A = bA; - } - else if (numPrimalDPN == 3) - { - RCP<xpetra_crs_type> xK = rcp(new xpetra_tcrs_type(algebraic->matrices->K)); - algebraic->matrices->A = rcp(new xpetra_wcrs_type(xK)); - } - else - { - RCP<xpetra_crs_type> xL = rcp(new xpetra_tcrs_type(algebraic->matrices->L)); - algebraic->matrices->A = rcp(new xpetra_wcrs_type(xL)); - } -} - -/** - * @brief Compute the rhs. - * - * Argument: - * <ul> - * <li> scaled: a boolean which describes whether the system is scaled or not. - * </ul> - */ -template <typename scalar> -void DiscreteProblem<scalar>::computeLoads(bool scaled) -{ - - using Teuchos::RCP; - using Teuchos::rcp; - using Teuchos::tuple; - - typedef Kokkos::View<scalar ***, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace> elem_matrix_view_type; - - elem_matrix_view_type N, N_S; - - auto numMyElems = domain->elementsList->getElementNumber(); - -#ifdef KOKKOS_ENABLE_DEPRECATED_CODE - int pool_size = Kokkos::DefaultExecutionSpace::thread_pool_size(); -#else - int pool_size = Kokkos::DefaultExecutionSpace::impl_thread_pool_size(); -#endif - int max_element_size = 1; - int max_element_size_S = 1; - - for (int i_elem = 0; i_elem < numMyElems; ++i_elem) - { - if (domain->elementsList->getElementType(i_elem) == static_cast<int>(tbox::ElType::HEX8)) - { - max_element_size = 8; - max_element_size_S = 4; - break; - } - if (domain->elementsList->getElementType(i_elem) == static_cast<int>(tbox::ElType::TETRA4)) - { - max_element_size = 4; - max_element_size_S = 3; - break; - } - } - N = elem_matrix_view_type("A", pool_size, max_element_size, max_element_size); - N_S = elem_matrix_view_type("A", pool_size, max_element_size_S, max_element_size_S); - - ElementVectors<scalar, static_cast<int>(tbox::ElType::TRI3), 3> *elementVectors_TRI3 = - new ElementVectors<scalar, static_cast<int>(tbox::ElType::TRI3), 3>(domain, numPrimalDPN, pool_size); - ElementVectors<scalar, static_cast<int>(tbox::ElType::QUAD4), 4> *elementVectors_QUAD4 = - new ElementVectors<scalar, static_cast<int>(tbox::ElType::QUAD4), 4>(domain, numPrimalDPN, pool_size); - ElementVectors<scalar, static_cast<int>(tbox::ElType::TETRA4), 4> *elementVectors_TETRA4 = - new ElementVectors<scalar, static_cast<int>(tbox::ElType::TETRA4), 4>(domain, numPrimalDPN, pool_size); - ElementVectors<scalar, static_cast<int>(tbox::ElType::HEX8), 8> *elementVectors_HEX8 = - new ElementVectors<scalar, static_cast<int>(tbox::ElType::HEX8), 8>(domain, numPrimalDPN, pool_size); - - RCP<tpetra_vector_type> bWO = rcp(new tpetra_vector_type(algebraic->map->mapDofsWO, true)); - - auto bWO_view = bWO->getLocalViewHost(); - - // ------------------------------------------ - // - // volumetric heat sources - // - // ------------------------------------------ - - auto numMySources = loads->sourcesList->getSourceNumber(); - - for (auto i = 0; i < numMySources; ++i) - { - auto currentSourceSize = loads->sourcesList->getSourceSize(i); - Kokkos::parallel_for( - currentSourceSize, KOKKOS_LAMBDA(const int e1) { - local_ordinal_type i_elem = loads->sourcesList->getSourceElement(i, e1); -#ifdef KOKKOS_ENABLE_DEPRECATED_CODE - int i_thread = Kokkos::DefaultExecutionSpace::thread_pool_rank(); -#else - int i_thread = Kokkos::DefaultExecutionSpace::impl_thread_pool_rank(); -#endif - const int e_size = domain->elementsList->getElementSize(i_elem); - - auto N_e = subview(N, i_thread, make_pair(0, e_size), make_pair(0, e_size)); - - bool bContinue = true; - - if (domain->elementsList->getElementType(i_elem) == static_cast<int>(tbox::ElType::HEX8)) - { - elementVectors_HEX8->compute(i_elem, i_thread); - Kokkos::deep_copy(N_e, elementVectors_HEX8->getN(i_thread)); - } - else if (domain->elementsList->getElementType(i_elem) == static_cast<int>(tbox::ElType::TETRA4)) - { - elementVectors_TETRA4->compute(i_elem, i_thread); - Kokkos::deep_copy(N_e, elementVectors_TETRA4->getN(i_thread)); - } - else - bContinue = false; - - if (bContinue) - { - for (auto ii = 0; ii < e_size; ++ii) - { - local_ordinal_type local_i = domain->elementsList->getElementNode(i_elem, ii); - global_ordinal_type global_i = algebraic->map->mapNodesWO->getGlobalElement(local_i); - - // Test if mapDofs ownes global_i - if (algebraic->map->mapNodes->isNodeGlobalElement(global_i)) - { - scalar tmp = 0.; - - for (auto jj = 0; jj < e_size; ++jj) - tmp += N_e(ii, jj); - - tmp *= loads->sourcesList->getSourceValue(i); - - Kokkos::atomic_fetch_add(&bWO_view(local_i, 0), tmp); - } - } - } - }); - } - - // ------------------------------------------ - // - // von Neumann boundary conditions - // - // ------------------------------------------ - - auto numMynBCs = loads->neumannList->getNeumannNumber(); - - const size_t numNodes = algebraic->map->mapNodes->getGlobalNumElements(); - //const size_t numMyNodes = algebraic->map->mapNodes->getNodeNumElements(); - const size_t numMyNodesWO = algebraic->map->mapNodesWO->getNodeNumElements(); - - for (auto i = 0; i < numMynBCs; ++i) - { - auto currentBCSize = loads->neumannList->getNeumannSize(i); - Kokkos::parallel_for( - currentBCSize, KOKKOS_LAMBDA(const int e1) { - local_ordinal_type i_elem = loads->neumannList->getNeumannElement(i, e1); - -#ifdef KOKKOS_ENABLE_DEPRECATED_CODE - int i_thread = Kokkos::DefaultExecutionSpace::thread_pool_rank(); -#else - int i_thread = Kokkos::DefaultExecutionSpace::impl_thread_pool_rank(); -#endif - const int e_size = domain->elementsList->getElementSize(i_elem); - - auto N_e = subview(N_S, i_thread, make_pair(0, e_size), make_pair(0, e_size)); - - bool bContinue = true; - - if (domain->elementsList->getElementType(i_elem) == static_cast<int>(tbox::ElType::TRI3)) - { - elementVectors_TRI3->compute(i_elem, i_thread); - Kokkos::deep_copy(N_e, elementVectors_TRI3->getN(i_thread)); - } - else if (domain->elementsList->getElementType(i_elem) == static_cast<int>(tbox::ElType::QUAD4)) - { - elementVectors_QUAD4->compute(i_elem, i_thread); - Kokkos::deep_copy(N_e, elementVectors_QUAD4->getN(i_thread)); - } - else - bContinue = false; - - if (bContinue) - { - for (auto j = 0; j < numPrimalDPN; ++j) - { - scalar which_dof = loads->neumannList->getNeumannDof(i, j); - scalar value = loads->neumannList->getNeumannValue(i, j); - if (which_dof == (scalar)1) - { - for (auto ii = 0; ii < e_size; ++ii) - { - local_ordinal_type local_i; - if (j == 3) - local_i = domain->elementsList->getElementNode(i_elem, ii); - else - { - if (numPrimalDPN == 4) - local_i = numMyNodesWO + 3 * domain->elementsList->getElementNode(i_elem, ii) + j; - else - local_i = 3 * domain->elementsList->getElementNode(i_elem, ii) + j; - } - - scalar tmp = 0.; - - for (auto jj = 0; jj < e_size; ++jj) - tmp += N_e(ii, jj); - - tmp *= value; - - Kokkos::atomic_fetch_add(&bWO_view(local_i, 0), tmp); - } - } - } - } - }); - } - - // ------------------------------------------ - // - // Dirichlet boundary conditions - // - // ------------------------------------------ - - Tpetra::Export<> exportBWO(algebraic->map->mapDofsWO, algebraic->map->mapDofs); - algebraic->vectors->b->doExport(*bWO, exportBWO, Tpetra::ADD); - - if (numPrimalDPN == 4 || numPrimalDPN == 3) - algebraic->matrices->K->resumeFill(); - if (numPrimalDPN == 4 || numPrimalDPN == 1) - algebraic->matrices->L->resumeFill(); - if (numPrimalDPN == 4) - algebraic->matrices->S->resumeFill(); - - auto numMyBCs = loads->dirichletList->getDirichletNumber(); - for (auto i = 0; i < numMyBCs; ++i) - { - auto currentBCSize = loads->dirichletList->getDirichletSize(i); - for (int i_node = 0; i_node < currentBCSize; ++i_node) - { - global_ordinal_type n1 = loads->dirichletList->getDirichletNode(i, i_node); - - if (algebraic->map->mapNodes->isNodeGlobalElement(n1)) - for (auto j = 0; j < numPrimalDPN; ++j) - { - scalar which_dof = loads->dirichletList->getDirichletDof(i, j); - - if (which_dof == (scalar)1) - { - global_ordinal_type global_index, global_index_0, global_index_r0; - - bool thermo = false; - - if (j == 3) - { - global_index_0 = 0; - global_index_r0 = n1; - - thermo = true; - } - else - { - if (numPrimalDPN == 4) - global_index_0 = numNodes; - else - global_index_0 = 0; - global_index_r0 = 3 * n1 + j; - } - - global_index = global_index_0 + global_index_r0; - - Teuchos::Array<global_ordinal_type> global_indices; - - if (thermo) - { - size_t numColInds = algebraic->graph->L->getNumEntriesInGlobalRow(global_index); - global_indices.resize(numColInds); - algebraic->graph->L->getGlobalRowCopy(global_index, global_indices(), numColInds); - - // Replace the initialized elements by zero - for (auto k = 0; k < numColInds; ++k) - algebraic->matrices->L->replaceGlobalValues(global_index, - tuple<global_ordinal_type>(global_indices[k]), - tuple<scalar>(scalar(0.0))); - - // Put one on the diagonal element - algebraic->matrices->L->replaceGlobalValues(global_index, - tuple<global_ordinal_type>(global_index), - tuple<scalar>(scalar(1.0))); - } - else - { - size_t numColInds = algebraic->graph->K->getNumEntriesInGlobalRow(global_index_r0); - global_indices.resize(numColInds); - algebraic->graph->K->getGlobalRowCopy(global_index_r0, global_indices(), numColInds); - - // Replace the initialized elements by zero - for (auto k = 0; k < numColInds; ++k) - algebraic->matrices->K->replaceGlobalValues(global_index_r0, - tuple<global_ordinal_type>(global_indices[k]), - tuple<scalar>(scalar(0.0))); - - // Put one on the diagonal element - algebraic->matrices->K->replaceGlobalValues(global_index_r0, - tuple<global_ordinal_type>(global_index_r0), - tuple<scalar>(scalar(1.0))); - - if (numPrimalDPN == 4) - { - size_t numColInds = algebraic->graph->S->getNumEntriesInGlobalRow(global_index_r0); - global_indices.resize(numColInds); - algebraic->graph->S->getGlobalRowCopy(global_index_r0, global_indices(), numColInds); - - // Replace the initialized elements by zero - for (auto k = 0; k < numColInds; ++k) - algebraic->matrices->S->replaceGlobalValues(global_index_r0, - tuple<global_ordinal_type>(global_indices[k]), - tuple<scalar>(scalar(0.0))); - } - } - - // Put the corresponding value in the right hand side - algebraic->vectors->b->replaceGlobalValue(global_index, - (scalar(loads->dirichletList->getDirichletValue(i, j)))); - algebraic->vectors->x->replaceGlobalValue(global_index, - (scalar(loads->dirichletList->getDirichletValue(i, j)))); - } - } - } - } - if (numPrimalDPN == 4 || numPrimalDPN == 3) - algebraic->matrices->K->fillComplete(); - if (numPrimalDPN == 4 || numPrimalDPN == 1) - algebraic->matrices->L->fillComplete(); - if (numPrimalDPN == 4) - algebraic->matrices->S->fillComplete(); - - /* - if (scaled) - { - tpetra_vector_type diag(algebraic->matrices->A->getRowMap()); - algebraic->matrices->A->getLocalDiagCopy(diag); - - Teuchos::ArrayRCP<scalar> diag_entries; - diag_entries = diag.getDataNonConst(); - for (size_t i = 0; i < diag_entries.size(); ++i) - diag_entries[i] = 1. / diag_entries[i]; - - Teuchos::ArrayRCP<scalar> rhs_entries; - rhs_entries = algebraic->vectors->b->getDataNonConst(); - for (size_t i = 0; i < rhs_entries.size(); ++i) - rhs_entries[i] = rhs_entries[i] * diag_entries[i]; - - algebraic->matrices->A->leftScale(diag); - - if (domain->contactsList->getContactNumber() >= 1) - algebraic->matrices->B_T->leftScale(diag); - } - */ - // ------------------------------------------ - // - // weights computation - // - // ------------------------------------------ - - auto numMyWeightRegions = loads->weightsList->getWeightRegionsNumber(); - - for (auto i = 0; i < numMyWeightRegions; ++i) - { - auto currentWeightRegionSize = loads->weightsList->getWeightRegionSize(i); - Kokkos::parallel_for( - currentWeightRegionSize, KOKKOS_LAMBDA(const int i_node) { - global_ordinal_type n1 = loads->weightsList->getNode(i, i_node); - - if (algebraic->map->mapNodes->isNodeGlobalElement(n1)) - { - for (auto j = 0; j < numPrimalDPN; ++j) - { - if (loads->weightsList->getWeightDof(i, j)) - { - global_ordinal_type global_index; - - if (j == 3) - { - global_index = n1; - } - else - { - if (numPrimalDPN == 4) - global_index = numNodes + 3 * n1 + j; - else - global_index = 3 * n1 + j; - } - - algebraic->vectors->weights->sumIntoGlobalValue(global_index, - (scalar(loads->weightsList->getWeightValue(i, j))), - true); - } - } - } - }); - } - - delete elementVectors_TRI3; - delete elementVectors_QUAD4; - delete elementVectors_TETRA4; - delete elementVectors_HEX8; -} -}; // namespace katoptron diff --git a/katoptron/src/DiscreteProblemETI.cpp b/katoptron/src/DiscreteProblemETI.cpp deleted file mode 100644 index 9cb91180..00000000 --- a/katoptron/src/DiscreteProblemETI.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "DiscreteProblem.h" -#include "DiscreteProblem.hpp" - -using namespace katoptron; - -template class DiscreteProblem<double>; -template class DiscreteProblem<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>>>; -template class DiscreteProblem<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>>>; -template class DiscreteProblem<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>>>; -template class DiscreteProblem<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>>>; \ No newline at end of file diff --git a/katoptron/src/Domain.h b/katoptron/src/Domain.h deleted file mode 100644 index 43fdf2f8..00000000 --- a/katoptron/src/Domain.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef KATOPTRON_DOMAIN_H -#define KATOPTRON_DOMAIN_H - -#include "katoptron.h" -#include "Map.h" -#include "ElementsList.h" -#include "NodesList.h" -#include "MaterialsList.h" -#include "ContactsList.h" -#include "wRandomField.h" - -namespace katoptron -{ - -/** - * @brief Class which is used to store all the information related to the discretized domain: - * <ul> - * <li> the list of the local elements, - * <li> the list of the nodes, - * <li> the list of the materials, - * <li> the list of the contact interfaces, - * <li> the list of the random fields. - * </ul> - */ -template <typename scalar> -class Domain -{ -public: - Teuchos::RCP<ElementsList> elementsList; - Teuchos::RCP<NodesList> nodesList; - Teuchos::RCP<MaterialsList<scalar>> materialsList; - Teuchos::RCP<ContactsList> contactsList; - Teuchos::RCP<RandomField<scalar, Kokkos::DefaultExecutionSpace>> random_field; - - Domain(Problem &pbl, - Teuchos::RCP<Map> map, - Teuchos::RCP<Teuchos::ParameterList> randomParams, - Kokkos::View<scalar *, Kokkos::LayoutLeft> m_rv_values); - - ~Domain() - { - std::cout << "~Domain()\n"; - } -}; - -/** - * @brief Domain constructor - * - * This constructor initializes the lists of elements, nodes, materials, contact interfaces, and random fields. - * - * Arguments: - * <ul> - * <li> A problem object, - * <li> An RCP to a Map object, - * <li> An RCP to a ParameterList object which describes the random fields, - * <li> A Kokkos View of the values used in the discretization of the random fields. - * </ul> - */ -template <typename scalar> -Domain<scalar>::Domain(Problem &pbl, - Teuchos::RCP<Map> map, - Teuchos::RCP<Teuchos::ParameterList> randomParams, - Kokkos::View<scalar *, Kokkos::LayoutLeft> m_rv_values) -{ - elementsList = Teuchos::rcp(new ElementsList(pbl, map)); - nodesList = Teuchos::rcp(new NodesList(pbl, map)); - materialsList = Teuchos::rcp(new MaterialsList<scalar>(pbl, map)); - contactsList = Teuchos::rcp(new ContactsList(pbl, map, elementsList, nodesList)); - random_field = Teuchos::rcp(new RandomField<scalar, Kokkos::DefaultExecutionSpace>(randomParams, m_rv_values)); -} - -}; // namespace katoptron - -#endif //KATOPTRON_DOMAIN_H diff --git a/katoptron/src/ElementComputation.cpp b/katoptron/src/ElementComputation.cpp deleted file mode 100644 index 5ffb9b91..00000000 --- a/katoptron/src/ElementComputation.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "ElementComputation.h" -#include "ElementComputation.hpp" -using namespace tbox; - -template class ElementComputation<double, 2>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>>, 2>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>>, 2>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>>, 2>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>>, 2>; - -template class ElementComputation<double, 3>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>>, 3>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>>, 3>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>>, 3>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>>, 3>; - -template class ElementComputation<double, 4>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>>, 4>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>>, 4>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>>, 4>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>>, 4>; - -template class ElementComputation<double, 5>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>>, 5>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>>, 5>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>>, 5>; -template class ElementComputation<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>>, 5>; \ No newline at end of file diff --git a/katoptron/src/ElementComputation.h b/katoptron/src/ElementComputation.h deleted file mode 100644 index 1e069a2b..00000000 --- a/katoptron/src/ElementComputation.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef KATOPTRON_ELEMENTCOMPUTATION_H -#define KATOPTRON_ELEMENTCOMPUTATION_H - -#include "Stokhos_Sacado_Kokkos_MP_Vector.hpp" - -#include <Kokkos_Core.hpp> -#include "Kokkos_ViewFactory.hpp" -#include "wCacheHex8.h" -#include "wCacheQuad4.h" -#include "wCacheTetra4.h" -#include "wCacheTri3.h" -#include "tMatrix.h" -#include "Sacado.hpp" -#include "Domain.h" - -#include "MaterialsList.h" -#include "Material.h" - -#include "Map.h" - -#include "wElement.h" - -#include "wLazy.h" -#include "tMatrix.h" - -/** - * @brief Base class for the element computations - */ -template <typename scalar, int element_type> -class ElementComputation -{ - typedef katoptron::Map::local_ordinal_type local_ordinal_type; - -protected: - tbox::CacheHex8 &trilinosHex8GetCache(); - tbox::CacheTetra4 &trilinosTetra4GetCache(); - tbox::CacheTri3 &trilinosTri3GetCache(); - tbox::CacheQuad4 &trilinosQuad4GetCache(); - - double buildJ(int k, tMatrix<double, 3, 3> &J, - local_ordinal_type e, - const katoptron::ElementsList &elementsList, - const katoptron::NodesList &nodesList); -}; - -#endif //KATOPTRON_ELEMENTCOMPUTATION_H diff --git a/katoptron/src/ElementComputation.hpp b/katoptron/src/ElementComputation.hpp deleted file mode 100644 index e1062eb1..00000000 --- a/katoptron/src/ElementComputation.hpp +++ /dev/null @@ -1,142 +0,0 @@ - -/** - * @brief Compute the Jacobian matrix \f$\boldsymbol{J}\f$ of an element. - */ -template <typename scalar, int element_type> -double ElementComputation<scalar, element_type>::buildJ(int k, - tMatrix<double, 3, 3> &J, local_ordinal_type e, - const katoptron::ElementsList &elementsList, - const katoptron::NodesList &nodesList) -{ - tbox::Cache *cache; - size_t element_size; - - if (element_type == static_cast<int>(tbox::ElType::HEX8)) - { - tbox::CacheHex8 &cachehex8 = trilinosHex8GetCache(); - cache = &cachehex8; - element_size = 8; - } - else if (element_type == static_cast<int>(tbox::ElType::TETRA4)) - { - tbox::CacheTetra4 &cachetetra4 = trilinosTetra4GetCache(); - cache = &cachetetra4; - element_size = 4; - } - else if (element_type == static_cast<int>(tbox::ElType::TRI3)) - { - tbox::CacheTri3 &cachetri3 = trilinosTri3GetCache(); - cache = &cachetri3; - element_size = 3; - - tVector<double, 3> tg1, tg2, n; - - int i = 0; - for (auto n1 = 0; n1 < element_size; ++n1, ++i) - { - for (auto j = 0; j < 3; ++j) - { - tg1(j) += (static_cast<tbox::CacheTri3 *>(cache)->getDsf(k))(0, i) * - nodesList.nodes(elementsList.getElementNode(e, n1), j); - tg2(j) += (static_cast<tbox::CacheTri3 *>(cache)->getDsf(k))(1, i) * - nodesList.nodes(elementsList.getElementNode(e, n1), j); - } - } - - n(0) = tg1(1) * tg2(2) - tg1(2) * tg2(1); - n(1) = tg1(2) * tg2(0) - tg1(0) * tg2(2); - n(2) = tg1(0) * tg2(1) - tg1(1) * tg2(0); - double detJ = sqrt(pow(n(0), 2) + pow(n(1), 2) + pow(n(2), 2)); - return detJ; - } - else if (element_type == static_cast<int>(tbox::ElType::QUAD4)) - { - tbox::CacheQuad4 &cachequad4 = trilinosQuad4GetCache(); - cache = &cachequad4; - element_size = 4; - - tVector<double, 3> tg1, tg2, n; - - int i = 0; - for (auto n1 = 0; n1 < element_size; ++n1, ++i) - { - for (auto j = 0; j < 3; ++j) - { - tg1(j) += (static_cast<tbox::CacheQuad4 *>(cache)->getDsf(k))(0, i) * - nodesList.nodes(elementsList.getElementNode(e, n1), j); - tg2(j) += (static_cast<tbox::CacheQuad4 *>(cache)->getDsf(k))(1, i) * - nodesList.nodes(elementsList.getElementNode(e, n1), j); - } - } - - n(0) = tg1(1) * tg2(2) - tg1(2) * tg2(1); - n(1) = tg1(2) * tg2(0) - tg1(0) * tg2(2); - n(2) = tg1(0) * tg2(1) - tg1(1) * tg2(0); - double detJ = sqrt(pow(n(0), 2) + pow(n(1), 2) + pow(n(2), 2)); - return detJ; - } - - tMatrix<double, 3, 3> Jn; - J.clean(); - - tVector<double, 3> tmp, tmp2; - - int i = 0; - for (auto n1 = 0; n1 < elementsList.getElementSize(e); ++n1, ++i) - { - for (auto j = 0; j < 3; ++j) - { - tmp(j) = nodesList.nodes(elementsList.getElementNode(e, n1), j); - if (element_type == static_cast<int>(tbox::ElType::HEX8)) - tmp2(j) = (static_cast<tbox::CacheHex8 *>(cache)->getDsf(k))(j, i); - else if (element_type == static_cast<int>(tbox::ElType::TETRA4)) - tmp2(j) = (static_cast<tbox::CacheTetra4 *>(cache)->getDsf(k))(j, i); - } - - Jn = tmp2.ddotproduct(tmp); - J += Jn; - } - - double detJ = J.det(); - return detJ; -} - -/** - * @brief Return the tbox cache of the hexahedron elements. - */ -template <typename scalar, int element_type> -tbox::CacheHex8 &ElementComputation<scalar, element_type>::trilinosHex8GetCache() -{ - static tbox::Lazy<tbox::CacheHex8> cache(2); - return cache.get(); -} - -/** - * @brief Return the tbox cache of the tetrahedron elements. - */ -template <typename scalar, int element_type> -tbox::CacheTetra4 &ElementComputation<scalar, element_type>::trilinosTetra4GetCache() -{ - static tbox::Lazy<tbox::CacheTetra4> cache(2); - return cache.get(); -} - -/** - * @brief Return the tbox cache of the triangular elements. - */ -template <typename scalar, int element_type> -tbox::CacheTri3 &ElementComputation<scalar, element_type>::trilinosTri3GetCache() -{ - static tbox::Lazy<tbox::CacheTri3> cache(2); - return cache.get(); -} - -/** - * @brief Return the tbox cache of the quadrangular elements. - */ -template <typename scalar, int element_type> -tbox::CacheQuad4 &ElementComputation<scalar, element_type>::trilinosQuad4GetCache() -{ - static tbox::Lazy<tbox::CacheQuad4> cache(2); - return cache.get(); -} diff --git a/katoptron/src/ElementMatrices.h b/katoptron/src/ElementMatrices.h deleted file mode 100644 index ad7b227b..00000000 --- a/katoptron/src/ElementMatrices.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef KATOPTRON_ELEMENTMATRICES_H -#define KATOPTRON_ELEMENTMATRICES_H - -#include "Stokhos_Sacado_Kokkos_MP_Vector.hpp" -#include "EnsembleTraits.h" - -/* -#include "Stokhos_Tpetra_MP_Vector.hpp" -#include "Stokhos_Tpetra_Utilities_MP_Vector.hpp" -#include "Stokhos_Sacado_Kokkos_MP_Vector.hpp" -*/ - -#include <Kokkos_Core.hpp> -#include "Kokkos_ViewFactory.hpp" -#include "wCacheHex8.h" -#include "wCacheQuad4.h" -#include "wCacheTetra4.h" -#include "wCacheTri3.h" -#include "tMatrix.h" - -//#include "Sacado_Fad_MP_Vector.hpp" -//#include "Sacado.hpp" -#include "Domain.h" - -#include "MaterialsList.h" -#include "Material.h" - -#include "wLazy.h" -#include "tMatrix.h" - -#include "ElementComputation.h" - -#include "EnsembleTraits.h" - -#include <iostream> - -/** - * @brief Class used to compute the element matrices: - * <ul> - * <li> The element stifness matrix \f$\boldsymbol{K}\f$, - * <li> The thermal element matrix \f$\boldsymbol{L}\f$, - * <li> The coupling element matrix \f$\boldsymbol{S}\f$. - * </ul> - */ -template <typename scalar, int element_type, int element_size> -class ElementMatrices : public ElementComputation<scalar, element_type> -{ -public: - typedef Kokkos::View<scalar ***, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace> view_type_3D; - typedef Kokkos::View<scalar **, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace> view_type_2D; - - view_type_3D K, L, S; - - view_type_2D material; - - Teuchos::RCP<katoptron::Domain<scalar>> domain; - - size_t numPrimalDPN; - - ElementMatrices(Teuchos::RCP<katoptron::Domain<scalar>> domain, size_t numPrimalDPN, size_t pool_size); - ~ElementMatrices(){}; - - void compute(int e, int i_thread); - view_type_2D getK(size_t i_thread) const; - view_type_2D getL(size_t i_thread) const; - view_type_2D getS(size_t i_thread) const; -}; - -#endif //KATOPTRON_ELEMENTMATRICES_H diff --git a/katoptron/src/ElementMatrices.hpp b/katoptron/src/ElementMatrices.hpp deleted file mode 100644 index 208932cc..00000000 --- a/katoptron/src/ElementMatrices.hpp +++ /dev/null @@ -1,300 +0,0 @@ -//#define ElementMatrices_DEBUG - -/** - * @brief ElementMatrices constructor - * - * Arguments: - * <ul> - * <li> domain: an RCP to a Domain object, - * <li> numPrimalDPN: the number of degrees of freedom per node (without taking into account the Lagrange multipliers), - * <li> pool_size: the number of threads that will be used to compute the element matrices. - * </ul> - * - * The number of used threads is specify to allocate distinct memory for each thread to ensure that the threads - * do not use the same memory addresses. - */ -template <typename scalar, int element_type, int element_size> -ElementMatrices<scalar, element_type, element_size>::ElementMatrices(Teuchos::RCP<katoptron::Domain<scalar>> _domain, - size_t _numPrimalDPN, - size_t pool_size) : domain(_domain), numPrimalDPN(_numPrimalDPN) -{ - - K = Kokkos::View<scalar ***, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace>("A", pool_size, 3 * element_size, 3 * element_size); - L = Kokkos::View<scalar ***, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace>("A", pool_size, element_size, element_size); - S = Kokkos::View<scalar ***, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace>("A", pool_size, 3 * element_size, element_size); - - material = Kokkos::View<scalar **, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace>("A", pool_size, 3 * element_size); -} - -/** - * @brief Compute all the matrices and store them as member data. - * This function must be called before getK, getL, or getS. - * - * The computations have been gathered into one function to reuse reusable data such as Jacobian - * computations. - * - * Arguments: - * <ul> - * <li> e: the local ID of the element for which the matrices have to be computed, - * <li> i_thread: the ID of the thread used to compute the element matrices. - * </ul> - */ -template <typename scalar, int element_type, int element_size> -void ElementMatrices<scalar, element_type, element_size>::compute(int e, int i_thread) -{ - - tbox::Cache *cache; - - /* @todo could probably be refactored into cache = element->getVCache(); */ - if (element_type == static_cast<int>(tbox::ElType::HEX8)) - { - tbox::CacheHex8 &cachehex8 = this->trilinosHex8GetCache(); - cache = &cachehex8; - } - else if (element_type == static_cast<int>(tbox::ElType::TETRA4)) - { - tbox::CacheTetra4 &cachetetra4 = this->trilinosTetra4GetCache(); - cache = &cachetetra4; - } - - std::vector<Eigen::Vector3d> gauss_p; - std::vector<double> gauss_w; - for (size_t a = 0; a < cache->getVGauss().getN(); ++a) - { - gauss_p.push_back(cache->getVGauss().getP(a)); - gauss_w.push_back(cache->getVGauss().getW(a)); - } - - tVector<scalar, element_size * 4> tValues; - - auto K_current = subview(K, i_thread, Kokkos::ALL(), Kokkos::ALL()); - auto L_current = subview(L, i_thread, Kokkos::ALL(), Kokkos::ALL()); - auto S_current = subview(S, i_thread, Kokkos::ALL(), Kokkos::ALL()); - - Kokkos::deep_copy(K_current, 0); - Kokkos::deep_copy(L_current, 0); - Kokkos::deep_copy(S_current, 0); - - auto element_material = domain->elementsList->getElementMaterial(e); - - tVector<double, 3> factor1, factor2, dffi, dffj; - tVector<scalar, 3> factor3; - tMatrix<double, 3, 3> J, Jinv; - tMatrix<scalar, 3, 3> TMP1; - tMatrix<scalar, 9, 9> H; - tVector<double, element_size> ff; - scalar E, nu, lambda, G, conductivity, beta; - tMatrix<scalar, 3, 3> K_conductivity; - tMatrix<scalar, 3, 3> D; - - katoptron::Material<scalar> material = domain->materialsList->getMaterial(element_material, i_thread); - if (domain->random_field->isRandom) - { - double x = 0., y = 0., z = 0.; - for (auto j = 0; j < element_size; ++j) - { - x += domain->nodesList->nodes(domain->elementsList->getElementNode(e, j), 0) / element_size; - y += domain->nodesList->nodes(domain->elementsList->getElementNode(e, j), 1) / element_size; - z += domain->nodesList->nodes(domain->elementsList->getElementNode(e, j), 2) / element_size; - } - - G = domain->random_field->operator()(x, y, z); -#ifdef ElementMatrices_DEBUG - printf("G_0 = %f\n", EnsembleTraits<scalar>::coeff(G, 0)); -#endif - - //E = material.getE(); - nu = material.getNu(); - lambda = 2. * G * nu / (1. - 2. * nu); - //lambda = (nu*E)/((1+nu)*(1-2*nu)); - } - else - { - E = material.getE(); - nu = material.getNu(); - lambda = (nu * E) / ((1 + nu) * (1 - 2 * nu)); - G = E / (2 * (1 + nu)); - } - - // Machine epsilon - - double epsilon = 2e-16; - // Looping on gauss points - for (auto a = 0; a < gauss_p.size(); ++a) - { - for (auto j = 0; j < element_size; ++j) - if (element_size == 8) - ff(j) = (static_cast<tbox::CacheHex8 *>(cache)->getSf(a))(j); - else if (element_size == 4) - ff(j) = (static_cast<tbox::CacheTetra4 *>(cache)->getSf(a))(j); - - // H matrix - H.clean(); - - for (auto i = 0; i < 3; ++i) - for (auto j = 0; j < 3; ++j) - for (auto k = 0; k < 3; ++k) - for (auto l = 0; l < 3; ++l) - { - if (i == j && k == l) - H(i * 3 + j, k * 3 + l) = lambda; - if (i == k && j == l) - H(i * 3 + j, k * 3 + l) = H(i * 3 + j, k * 3 + l) + G; - if (i == l && j == k) - H(i * 3 + j, k * 3 + l) = H(i * 3 + j, k * 3 + l) + G; - } - - conductivity = material.getK(); - K_conductivity.clean(); - for (auto i = 0; i < 3; ++i) - K_conductivity(i, i) = conductivity; - - beta = material.getBeta(); - D.clean(); - for (auto i = 0; i < 3; ++i) - D(i, i) = -3 * (lambda + (2. / 3.) * G) * beta; - - double detJ = this->buildJ(a, J, e, *(domain->elementsList), *(domain->nodesList)); - -#ifdef ElementMatrices_DEBUG - printf("detJ = %f\n", detJ); -#endif - - Jinv = J.inv(); - - for (auto i = 0; i < element_size; ++i) - { - - for (auto k = 0; k < 3; ++k) - if (element_size == 8) - dffi(k) = (static_cast<tbox::CacheHex8 *>(cache)->getDsf(a))(k, i); - else if (element_size == 4) - dffi(k) = (static_cast<tbox::CacheTetra4 *>(cache)->getDsf(a))(k, i); - factor1 = Jinv * dffi; -#ifdef ElementMatrices_DEBUG - printf("dffi = [%f, %f, %f]\n", dffi(0), dffi(1), dffi(2)); - printf("factor1 = [%f, %f, %f]\n", factor1(0), factor1(1), factor1(2)); -#endif - // K - for (auto j = i; j < element_size; ++j) - { - for (auto k = 0; k < 3; ++k) - if (element_size == 8) - dffj(k) = (static_cast<tbox::CacheHex8 *>(cache)->getDsf(a))(k, j); - else if (element_size == 4) - dffj(k) = (static_cast<tbox::CacheTetra4 *>(cache)->getDsf(a))(k, j); - factor2 = Jinv * dffj; - - TMP1.clean(); - for (auto k = 0; k < 3; ++k) - for (auto m = 0; m < 3; ++m) - { - for (auto l = 0; l < 3; ++l) - for (auto n = 0; n < 3; ++n) - TMP1(l, n) = H(k * 3 + l, m * 3 + n); - - factor3 = TMP1 * factor2; - - scalar dotProduct = factor1.dotproduct(factor3); -#ifdef ElementMatrices_DEBUG - printf("dotProduct_0 = %f\n", EnsembleTraits<scalar>::coeff(dotProduct, 0)); -#endif - K_current(i * 3 + k, j * 3 + m) += dotProduct * gauss_w[a] * detJ; - } - } - - // L - factor3 = K_conductivity * factor1; - for (auto j = i; j < element_size; ++j) - { - for (auto k = 0; k < 3; ++k) - if (element_size == 8) - dffj(k) = (static_cast<tbox::CacheHex8 *>(cache)->getDsf(a))(k, j); - else if (element_size == 4) - dffj(k) = (static_cast<tbox::CacheTetra4 *>(cache)->getDsf(a))(k, j); - - factor2 = Jinv * dffj; - scalar dotProduct = factor3.dotproduct(factor2); - L_current(i, j) += dotProduct * gauss_w[a] * detJ; - } - - // S - factor3 = D * factor1; - - for (auto j = 0; j < element_size; ++j) - for (auto k = 0; k < 3; ++k) - S_current(i * 3 + k, j) += factor3(k) * ff(j) * gauss_w[a] * detJ; - } - } - - for (auto i = 0; i < 3 * element_size; ++i) - for (auto j = i; j < 3 * element_size; ++j) - { - if (fabs(K_current(i, j)) < epsilon) - K_current(i, j) = 0; - if (i != j) - K_current(j, i) = K_current(i, j); - } - - for (auto i = 0; i < element_size; ++i) - for (auto j = i; j < element_size; ++j) - { - if (fabs(L_current(i, j)) < epsilon) - L_current(i, j) = 0; - if (i != j) - L_current(j, i) = L_current(i, j); - } - - for (auto i = 0; i < 3 * element_size; ++i) - for (auto j = 0; j < element_size; ++j) - if (fabs(S_current(i, j)) < epsilon) - S_current(i, j) = 0; -} - -/** - * @brief Return the element stifness matrix \f$\boldsymbol{K}\f$ computed - * by the thread i_thread. - * - * Argument: - * <ul> - * <li> i_thread: the ID of the thread used to compute the element matrices. - * </ul> - */ -template <typename scalar, int element_type, int element_size> -Kokkos::View<scalar **, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace> ElementMatrices<scalar, element_type, element_size>::getK(size_t i_thread) const -{ - Kokkos::View<scalar **, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace> K_current = subview(K, i_thread, Kokkos::ALL(), Kokkos::ALL()); - return K_current; -} - -/** - * @brief Return the thermal element matrix \f$\boldsymbol{L}\f$ computed - * by the thread i_thread. - * - * Argument: - * <ul> - * <li> i_thread: the ID of the thread used to compute the element matrices. - * </ul> - */ -template <typename scalar, int element_type, int element_size> -Kokkos::View<scalar **, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace> ElementMatrices<scalar, element_type, element_size>::getL(size_t i_thread) const -{ - Kokkos::View<scalar **, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace> L_current = subview(L, i_thread, Kokkos::ALL(), Kokkos::ALL()); - return L_current; -} - -/** - * @brief Return the coupling element matrix \f$\boldsymbol{S}\f$ computed - * by the thread i_thread. - * - * Argument: - * <ul> - * <li> i_thread: the ID of the thread used to compute the element matrices. - * </ul> - */ -template <typename scalar, int element_type, int element_size> -Kokkos::View<scalar **, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace> ElementMatrices<scalar, element_type, element_size>::getS(size_t i_thread) const -{ - Kokkos::View<scalar **, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace> S_current = subview(S, i_thread, Kokkos::ALL(), Kokkos::ALL()); - return S_current; -} \ No newline at end of file diff --git a/katoptron/src/ElementMatricesETI.cpp b/katoptron/src/ElementMatricesETI.cpp deleted file mode 100644 index 0df65d21..00000000 --- a/katoptron/src/ElementMatricesETI.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "ElementMatrices.h" -#include "ElementMatrices.hpp" - -template class ElementMatrices<double, 4, 4>; -template class ElementMatrices<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>>, 4, 4>; -template class ElementMatrices<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>>, 4, 4>; -template class ElementMatrices<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>>, 4, 4>; -template class ElementMatrices<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>>, 4, 4>; - -template class ElementMatrices<double, 5, 8>; -template class ElementMatrices<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>>, 5, 8>; -template class ElementMatrices<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>>, 5, 8>; -template class ElementMatrices<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>>, 5, 8>; -template class ElementMatrices<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>>, 5, 8>; diff --git a/katoptron/src/ElementVectors.h b/katoptron/src/ElementVectors.h deleted file mode 100644 index 3c7474ff..00000000 --- a/katoptron/src/ElementVectors.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef KATOPTRON_ELEMENTVECTORS_H -#define KATOPTRON_ELEMENTVECTORS_H - -#include <Kokkos_Core.hpp> -#include "Kokkos_ViewFactory.hpp" -#include "wCacheHex8.h" -#include "wCacheQuad4.h" -#include "wCacheTetra4.h" -#include "wCacheTri3.h" -#include "tMatrix.h" -#include "Domain.h" -#include "Loads.h" - -#include "ElementComputation.h" - -#include "MaterialsList.h" -#include "Material.h" - -#include "wLazy.h" -#include "tMatrix.h" - -/** - * @brief Class used to compute the matrix associated to the - * integration of load on surface \f$\boldsymbol{N}\f$. - */ -template <typename scalar, int element_type, int element_size> -class ElementVectors : public ElementComputation<scalar, element_type> -{ -public: - Kokkos::View<scalar ***, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace> N; - - Teuchos::RCP<katoptron::Domain<scalar>> domain; - - size_t numPrimalDPN; - - ElementVectors(Teuchos::RCP<katoptron::Domain<scalar>> domain, size_t numPrimalDPN, size_t pool_size); - - void compute(int e, int i_thread); - Kokkos::View<scalar **, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace> getN(size_t i_thread) const; -}; - -#endif //KATOPTRON_ELEMENTVECTORS_H diff --git a/katoptron/src/ElementVectors.hpp b/katoptron/src/ElementVectors.hpp deleted file mode 100644 index f89101de..00000000 --- a/katoptron/src/ElementVectors.hpp +++ /dev/null @@ -1,108 +0,0 @@ -/** - * @brief ElementVectors constructor - * - * Arguments: - * <ul> - * <li> domain: an RCP to a Domain object, - * <li> numPrimalDPN: the number of degrees of freedom per node (without taking into account the Lagrange multipliers), - * <li> pool_size: the number of threads that will be used to compute \f$\boldsymbol{N}\f$. - * </ul> - * - * The number of used threads is specify to allocate distinct memory for each thread to ensure that the threads - * do not use the same memory addresses. - */ -template <typename scalar, int element_type, int element_size> -ElementVectors<scalar, element_type, element_size>::ElementVectors(Teuchos::RCP<katoptron::Domain<scalar>> _domain, - size_t _numPrimalDPN, - size_t pool_size) : domain(_domain), numPrimalDPN(_numPrimalDPN) -{ - N = Kokkos::View<scalar ***, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace>("A", pool_size, element_size, element_size); -} - -/** - * @brief Compute the \f$\boldsymbol{N}\f$ matrix. - * Arguments: - * <ul> - * <li> e: the local ID of the element for which \f$\boldsymbol{N}\f$ has to be computed, - * <li> i_thread: the ID of the thread used to compute \f$\boldsymbol{N}\f$. - * </ul> - */ -template <typename scalar, int element_type, int element_size> -void ElementVectors<scalar, element_type, element_size>::compute(int e, int i_thread) -{ - tbox::Cache *cache; - - std::vector<Eigen::Vector3d> gauss_p; - std::vector<double> gauss_w; - - /* @todo could probably be refactored into cache = element->getVCache(); */ - if (element_type == static_cast<int>(tbox::ElType::HEX8)) - { - tbox::CacheHex8 &cachehex8 = this->trilinosHex8GetCache(); - cache = &cachehex8; - } - else if (element_type == static_cast<int>(tbox::ElType::TETRA4)) - { - tbox::CacheTetra4 &cachetetra4 = this->trilinosTetra4GetCache(); - cache = &cachetetra4; - } - else if (element_type == static_cast<int>(tbox::ElType::TRI3)) - { - tbox::CacheTri3 &cachetri3 = this->trilinosTri3GetCache(); - cache = &cachetri3; - } - else if (element_type == static_cast<int>(tbox::ElType::QUAD4)) - { - tbox::CacheQuad4 &cachequad4 = this->trilinosQuad4GetCache(); - cache = &cachequad4; - } - - for (size_t a = 0; a < cache->getVGauss().getN(); ++a) - { - gauss_p.push_back(cache->getVGauss().getP(a)); - gauss_w.push_back(cache->getVGauss().getW(a)); - } - - tVector<double, element_size> ff; - tMatrix<double, 3, 3> J; - - auto N_current = subview(N, i_thread, Kokkos::ALL(), Kokkos::ALL()); - - Kokkos::deep_copy(N_current, 0); - - // Looping on gauss points - for (auto a = 0; a < gauss_p.size(); ++a) - { - for (auto j = 0; j < element_size; ++j) - if (element_type == static_cast<int>(tbox::ElType::HEX8)) - ff(j) = (static_cast<tbox::CacheHex8 *>(cache)->getSf(a))(j); - else if (element_type == static_cast<int>(tbox::ElType::TETRA4)) - ff(j) = (static_cast<tbox::CacheTetra4 *>(cache)->getSf(a))(j); - else if (element_type == static_cast<int>(tbox::ElType::TRI3)) - ff(j) = (static_cast<tbox::CacheTri3 *>(cache)->getSf(a))(j); - else if (element_type == static_cast<int>(tbox::ElType::QUAD4)) - ff(j) = (static_cast<tbox::CacheQuad4 *>(cache)->getSf(a))(j); - - double detJ = this->buildJ(a, J, e, *(domain->elementsList), *(domain->nodesList)); - - for (auto i = 0; i < element_size; ++i) - for (auto j = 0; j < element_size; ++j) - N_current(i, j) += ff(i) * ff(j) * gauss_w[a] * detJ; - } -} - -/** - * @brief Return the \f$\boldsymbol{N}\f$. - * - * Argument: - * <ul> - * <li> i_thread: the ID of the thread used to compute \f$\boldsymbol{N}\f$. - * </ul> - */ -template <typename scalar, int element_type, int element_size> -Kokkos::View<scalar **, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace> ElementVectors<scalar, element_type, element_size>::getN(size_t i_thread) const -{ - Kokkos::View<scalar **, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace> N_current = - subview(N, i_thread, Kokkos::ALL(), Kokkos::ALL()); - return N_current; -} \ No newline at end of file diff --git a/katoptron/src/ElementVectorsETI.cpp b/katoptron/src/ElementVectorsETI.cpp deleted file mode 100644 index 445a934b..00000000 --- a/katoptron/src/ElementVectorsETI.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include "ElementVectors.h" -#include "ElementVectors.hpp" -using namespace tbox; - -template class ElementVectors<double, static_cast<int>(ElType::TRI3), 3>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>>, - static_cast<int>(ElType::TRI3), 3>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>>, - static_cast<int>(ElType::TRI3), 3>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>>, - static_cast<int>(ElType::TRI3), 3>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>>, - static_cast<int>(ElType::TRI3), 3>; - -template class ElementVectors<double, static_cast<int>(ElType::QUAD4), 4>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>>, - static_cast<int>(ElType::QUAD4), 4>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>>, - static_cast<int>(ElType::QUAD4), 4>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>>, - static_cast<int>(ElType::QUAD4), 4>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>>, - static_cast<int>(ElType::QUAD4), 4>; - -template class ElementVectors<double, static_cast<int>(ElType::TETRA4), 4>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>>, - static_cast<int>(ElType::TETRA4), 4>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>>, - static_cast<int>(ElType::TETRA4), 4>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>>, - static_cast<int>(ElType::TETRA4), 4>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>>, - static_cast<int>(ElType::TETRA4), 4>; - -template class ElementVectors<double, static_cast<int>(ElType::HEX8), 8>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>>, - static_cast<int>(ElType::HEX8), 8>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>>, - static_cast<int>(ElType::HEX8), 8>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>>, - static_cast<int>(ElType::HEX8), 8>; -template class ElementVectors<Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>>, - static_cast<int>(ElType::HEX8), 8>; diff --git a/katoptron/src/ElementsList.cpp b/katoptron/src/ElementsList.cpp deleted file mode 100644 index fd78fd75..00000000 --- a/katoptron/src/ElementsList.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#include "ElementsList.h" - -#include "wProblem.h" -#include "wTag.h" -#include "wMshData.h" -#include "wElement.h" -#include "wNode.h" -#include "wMedium.h" - -using namespace katoptron; - -/** - * @brief ElementsList constructor - * - * This constructor allocates 1 Kokkos::View which stores all the required information related to the elements, including: - * <ul> - * <li> all their local node IDs, - * <li> their size, type, and material (at most one material per element). - * </ul> - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> map: an RCP to a Map object. - * </ul> - */ -ElementsList::ElementsList(Problem &pbl, Teuchos::RCP<Map> map) -{ - typedef Map::local_ordinal_type local_ordinal_type; - - elements_number = map->mapElems->getNodeNumElements(); - - local_ordinal_type materials_number = pbl.media.size(); - elements_type = 0; - elements_size = 1; - elements_material = 2; - elements_owned = 3; - elements_nodes = 4; - - elements = Kokkos::View<int **, Kokkos::LayoutRight>("R", elements_number, elements_nodes + 8); - - const int n_procs = map->mapElems->getComm()->getSize(); - const int rank = map->mapElems->getComm()->getRank(); - - int i1 = 0; - int i2 = 0; - while (i1 < elements_number) - { - tbox::Element *e = pbl.msh->elems[i2++]; - if (map->mapElems->isNodeGlobalElement(e->no - 1)) - { - elements(i1, elements_type) = static_cast<int>(e->type()); - elements(i1, elements_size) = e->nodes.size(); - for (int j = 0; j < materials_number; ++j) - if (e->ptag == (pbl.media[j]->tag)) - { - elements(i1, elements_material) = j; - break; - } - for (int j = 0; j < e->nodes.size(); ++j) - elements(i1, elements_nodes + j) = map->mapNodesWO->getLocalElement(e->nodes[j]->row); - ++i1; - } - } - - for (int i = 0; i < elements_number; ++i) - elements(i, elements_owned) = 0; - - int p_key; - if (n_procs != 1) - for (auto const &p : pbl.msh->parts) - if (p.second->no == (rank + 1)) - p_key = p.first; - - if (n_procs != 1) - for (int i = 0; i < pbl.msh->parts[p_key]->elems.size(); ++i) - { - local_ordinal_type local_i = map->mapElems->getLocalElement(pbl.msh->parts[p_key]->elems[i]->no - 1); - elements(local_i, elements_owned) = 1; - } - - else - for (int i = 0; i < elements_number; ++i) - elements(i, elements_owned) = 1; -} diff --git a/katoptron/src/ElementsList.h b/katoptron/src/ElementsList.h deleted file mode 100644 index 08f902a8..00000000 --- a/katoptron/src/ElementsList.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef KATOPTRON_ELEMENTLISTS_H -#define KATOPTRON_ELEMENTLISTS_H - -#include "katoptron.h" - -#include "Map.h" - -#include <Tpetra_Map.hpp> -#include <Tpetra_Vector.hpp> -#include <Kokkos_ViewFactory.hpp> - -namespace katoptron -{ - -/** - * @brief Class used to store the element information including: - * <ul> - * <li> The number of local elements, - * <li> The type of every elements, - * <li> The size of each elements, - * <li> The material ID of each elements, - * <li> The local node ID of each elements. - * </ul> - */ -class ElementsList -{ - typedef Map::local_ordinal_type local_ordinal_type; - -private: - Kokkos::View<int **, Kokkos::LayoutRight> elements; - - local_ordinal_type elements_number; - local_ordinal_type elements_type; - local_ordinal_type elements_size; - local_ordinal_type elements_material; - local_ordinal_type elements_owned; - local_ordinal_type elements_nodes; - -public: - ElementsList(Problem &pbl, Teuchos::RCP<Map> map); - - /** - * @brief Return the number of local elements i.e. the number - * of elements owned by the calling process. - */ - inline local_ordinal_type getElementNumber(void) const { return elements_number; } - - /** - * @brief Return the type of the local element of local ID e. - * Argument: - * <ul> - * <li> e: local ID of the element. - * </ul> - */ - inline local_ordinal_type getElementType(const local_ordinal_type e) const - { - return elements(e, elements_type); - } - - /** - * @brief Return the size of the local element of local ID e. - * Argument: - * <ul> - * <li> e: local ID of the element. - * </ul> - */ - inline local_ordinal_type getElementSize(const local_ordinal_type e) const - { - return elements(e, elements_size); - } - - /** - * @brief Return the material ID of the local element of ID e. - * Argument: - * <ul> - * <li> e: local ID of the element. - * </ul> - */ - inline local_ordinal_type getElementMaterial(const local_ordinal_type e) const - { - return elements(e, elements_material); - } - - /** - * @brief Return the local ID of the ith node of the local element of ID e. - * Argument: - * <ul> - * <li> e: local ID of the element, - * <li> i: element local ID of the node. - * </ul> - */ - inline local_ordinal_type getElementNode(const local_ordinal_type e, local_ordinal_type i) const - { - return elements(e, elements_nodes + i); - } - - /** - * @brief Return whether local element of ID e is owned by this MPI process (i.e whether it - * is not a ghost element). - * Argument: - * <ul> - * <li> e: local ID of the element. - * </ul> - */ - inline local_ordinal_type isLocal(const local_ordinal_type e) const - { - return elements(e, elements_owned); - } -}; -}; // namespace katoptron - -#endif //KATOPTRON_ELEMENTLISTS_H diff --git a/katoptron/src/EnsembleReduction.h b/katoptron/src/EnsembleReduction.h deleted file mode 100644 index 9d6f393e..00000000 --- a/katoptron/src/EnsembleReduction.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef KATOPTRON_ENSEMBLEREDUCTION_H -#define KATOPTRON_ENSEMBLEREDUCTION_H - -#include <Stokhos_config.h> - -bool UseEnsembleReduction() -{ -#ifdef HAVE_STOKHOS_ENSEMBLE_REDUCT - return true; -#else - return false; -#endif -} -#endif //KATOPTRON_ENSEMBLEREDUCTION_H \ No newline at end of file diff --git a/katoptron/src/EnsembleTraits.h b/katoptron/src/EnsembleTraits.h deleted file mode 100644 index d107df17..00000000 --- a/katoptron/src/EnsembleTraits.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef KATOPTRON_ENSEMBLETRAITS_H -#define KATOPTRON_ENSEMBLETRAITS_H - -#include "Sacado.hpp" -#include "Stokhos_Tpetra_Utilities_MP_Vector.hpp" - -template <typename T> -struct EnsembleTraits -{ - static const int size = 1; - typedef T value_type; - static const value_type &coeff(const T &x, int i) { return x; } - static value_type &coeff(T &x, int i) { return x; } -}; - -template <typename S> -struct EnsembleTraits<Sacado::MP::Vector<S>> -{ - static const int size = S::static_size; - typedef typename S::value_type value_type; - static const value_type &coeff(const Sacado::MP::Vector<S> &x, int i) - { - return x.fastAccessCoeff(i); - } - static value_type &coeff(Sacado::MP::Vector<S> &x, int i) - { - return x.fastAccessCoeff(i); - } -}; -#endif // KATOPTRON_ENSEMBLETRAITS_H diff --git a/katoptron/src/Graph.cpp b/katoptron/src/Graph.cpp deleted file mode 100644 index b5859366..00000000 --- a/katoptron/src/Graph.cpp +++ /dev/null @@ -1,335 +0,0 @@ -#include "Graph.h" - -#include "wProblem.h" -#include "wMshData.h" -#include "wElement.h" -#include "wNode.h" - -#include <utility> - -#include <Kokkos_UnorderedMap.hpp> -#include <Kokkos_Sort.hpp> - -#include "Tpetra_CrsMatrix.hpp" -#include <MatrixMarket_Tpetra.hpp> - -#include "LinearSolver.h" - -using namespace katoptron; - -int min(int a, int b) -{ - return (a <= b) ? a : b; -} - -int max(int a, int b) -{ - return (a >= b) ? a : b; -} - -/** - * @brief Graph constructor - * - * This constructor computes the sparsity pattern of the primal matrix. - * - * Arguments: - * <ul> - * <li> map: an RCP to a Map object, - * <li> elementsList: an RCP to a ElementsList object. - * </ul> - */ -Graph::Graph(Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList) -{ - using std::pair; - using Teuchos::RCP; - using Teuchos::rcp; - using Teuchos::tuple; - typedef Map::local_ordinal_type local_ordinal_type; - typedef Map::global_ordinal_type global_ordinal_type; - typedef Tpetra::CrsGraph<local_ordinal_type, global_ordinal_type> crs_graph_type; - typedef local_ordinal_type LO; - typedef global_ordinal_type GO; - - auto numMyElems = elementsList->getElementNumber(); - - auto numPrimalDPN = map->numPrimalDPN; - - int numLclNodes = map->mapNodes->getNodeNumElements(); - - int numLclRowsK = 3 * numLclNodes; - int numLclRowsL = numLclNodes; - - Kokkos::View<size_t *> rowCountsK("row counts", numLclRowsK); - Kokkos::View<size_t *> rowCountsS("row counts", numLclRowsK); - Kokkos::View<size_t *> rowCountsL("row counts", numLclRowsL); - - const int maxConnections = 30; - Kokkos::UnorderedMap<pair<GO, GO>, bool> nodenode(numLclNodes * maxConnections); - - size_t numLclEntries = 0; - - Kokkos::parallel_reduce( - numMyElems, - KOKKOS_LAMBDA(const LO e, size_t &curNumLclEntries) { - const int element_size = elementsList->getElementSize(e); - - for (auto n1 = 0; n1 < element_size; ++n1) - for (auto n2 = n1; n2 < element_size; ++n2) - { - const LO lclNodeWO1 = elementsList->getElementNode(e, n1); - const LO lclNodeWO2 = elementsList->getElementNode(e, n2); - - const GO globalTmpNode1 = map->mapNodesWO->getGlobalElement(lclNodeWO1); - const GO globalTmpNode2 = map->mapNodesWO->getGlobalElement(lclNodeWO2); - - const GO globalNode1 = min(globalTmpNode1, globalTmpNode2); - const GO globalNode2 = max(globalTmpNode1, globalTmpNode2); - - const pair<GO, GO> key(globalNode1, globalNode2); - - auto result = nodenode.insert(key); - - if (result.success()) - { - const bool isDiffNodes = (globalNode1 != globalNode2); - const bool isLocalNode1 = map->mapNodes->isNodeGlobalElement(globalNode1); - const bool isLocalNode2 = map->mapNodes->isNodeGlobalElement(globalNode2); - - const LO lclNode1 = map->mapNodes->getLocalElement(globalNode1); - const LO lclNode2 = map->mapNodes->getLocalElement(globalNode2); - - if (numPrimalDPN == 4 || numPrimalDPN == 1) - { - if (isLocalNode1) - Kokkos::atomic_fetch_add(&rowCountsL(lclNode1), 1); - if (isDiffNodes && isLocalNode2) - Kokkos::atomic_fetch_add(&rowCountsL(lclNode2), 1); - } - if (numPrimalDPN == 4 || numPrimalDPN == 3) - { - for (auto i = 0; i < 3; ++i) - for (auto j = 0; j < 3; ++j) - { - const LO lclRow = 3 * lclNode1 + i; - const LO lclCol = 3 * lclNode2 + j; - - if (isLocalNode1) - Kokkos::atomic_fetch_add(&rowCountsK(lclRow), 1); - if (isDiffNodes && isLocalNode2) - Kokkos::atomic_fetch_add(&rowCountsK(lclCol), 1); - } - } - if (numPrimalDPN == 4) - { - if (isLocalNode1) - for (auto i = 0; i < 3; ++i) - { - const LO lclRow = 3 * lclNode1 + i; - Kokkos::atomic_fetch_add(&rowCountsS(lclRow), 1); - } - - if (isDiffNodes && isLocalNode2) - for (auto i = 0; i < 3; ++i) - { - const LO lclRow = 3 * lclNode2 + i; - - Kokkos::atomic_fetch_add(&rowCountsS(lclRow), 1); - } - } - } - } - }, - numLclEntries); - - Kokkos::View<size_t *> rowOffsetsK("row offsets", numLclRowsK + 1); - Kokkos::View<size_t *> rowOffsetsS("row offsets", numLclRowsK + 1); - Kokkos::View<size_t *> rowOffsetsL("row offsets", numLclRowsL + 1); - - if (numPrimalDPN == 4 || numPrimalDPN == 1) - Kokkos::parallel_scan( - numLclRowsL, - KOKKOS_LAMBDA(int irow, int &update, bool final) { - // parallel scan is a multi-pass parallel pattern - // In the ‘final’ pass ‘update’ has the prefix value - if (final) - rowOffsetsL(irow) = update; - update += rowCountsL(irow); - if (final && numLclRowsL == irow + 1) - rowOffsetsL(irow + 1) = update; // total non-zeros - }); - - if (numPrimalDPN == 4 || numPrimalDPN == 3) - Kokkos::parallel_scan( - numLclRowsK, - KOKKOS_LAMBDA(int irow, int &update, bool final) { - // parallel scan is a multi-pass parallel pattern - // In the ‘final’ pass ‘update’ has the prefix value - if (final) - rowOffsetsK(irow) = update; - update += rowCountsK(irow); - if (final && numLclRowsK == irow + 1) - rowOffsetsK(irow + 1) = update; // total non-zeros - }); - - if (numPrimalDPN == 4) - Kokkos::parallel_scan( - numLclRowsK, - KOKKOS_LAMBDA(int irow, int &update, bool final) { - // parallel scan is a multi-pass parallel pattern - // In the ‘final’ pass ‘update’ has the prefix value - if (final) - rowOffsetsS(irow) = update; - update += rowCountsS(irow); - if (final && numLclRowsK == irow + 1) - rowOffsetsS(irow + 1) = update; // total non-zeros - }); - - Kokkos::deep_copy(rowCountsK, static_cast<size_t>(0)); - Kokkos::deep_copy(rowCountsS, static_cast<size_t>(0)); - Kokkos::deep_copy(rowCountsL, static_cast<size_t>(0)); - - Kokkos::View<LO *> colIndicesK("column indices", rowOffsetsK(numLclRowsK)); - Kokkos::View<LO *> colIndicesS("column indices", rowOffsetsS(numLclRowsK)); - Kokkos::View<LO *> colIndicesL("column indices", rowOffsetsL(numLclRowsL)); - - Kokkos::parallel_for( - nodenode.capacity(), - KOKKOS_LAMBDA(int ientry) { - if (nodenode.valid_at(ientry)) - { - const pair<GO, GO> key = nodenode.key_at(ientry); - const GO globalNode1 = key.first; - const GO globalNode2 = key.second; - - const bool isDiffNodes = (globalNode1 != globalNode2); - const bool isLocalNode1 = map->mapNodes->isNodeGlobalElement(globalNode1); - const bool isLocalNode2 = map->mapNodes->isNodeGlobalElement(globalNode2); - - const LO lclNode1 = map->mapNodes->getLocalElement(globalNode1); - const LO lclNode2 = map->mapNodes->getLocalElement(globalNode2); - - const LO lclNodeWO1 = map->mapNodesWO->getLocalElement(globalNode1); - const LO lclNodeWO2 = map->mapNodesWO->getLocalElement(globalNode2); - - if (numPrimalDPN == 4 || numPrimalDPN == 1) - { - - if (isLocalNode1) - { - const LO lclRow = lclNode1; - const LO lclCol = lclNodeWO2; - - const size_t count = Kokkos::atomic_fetch_add(&rowCountsL(lclRow), 1); - colIndicesL(rowOffsetsL(lclRow) + count) = lclCol; - } - if (isDiffNodes && isLocalNode2) - { - const LO lclRow = lclNode2; - const LO lclCol = lclNodeWO1; - - const size_t count = Kokkos::atomic_fetch_add(&rowCountsL(lclRow), 1); - colIndicesL(rowOffsetsL(lclRow) + count) = lclCol; - } - } - if (numPrimalDPN == 4 || numPrimalDPN == 3) - { - if (isLocalNode1) - { - for (auto i = 0; i < 3; ++i) - for (auto j = 0; j < 3; ++j) - { - const LO lclRow = 3 * lclNode1 + i; - const LO lclCol = 3 * lclNodeWO2 + j; - - const size_t count = Kokkos::atomic_fetch_add(&rowCountsK(lclRow), 1); - colIndicesK(rowOffsetsK(lclRow) + count) = lclCol; - } - } - if (isDiffNodes && isLocalNode2) - { - for (auto i = 0; i < 3; ++i) - for (auto j = 0; j < 3; ++j) - { - const LO lclRow = 3 * lclNode2 + i; - const LO lclCol = 3 * lclNodeWO1 + j; - - const size_t count = Kokkos::atomic_fetch_add(&rowCountsK(lclRow), 1); - colIndicesK(rowOffsetsK(lclRow) + count) = lclCol; - } - } - } - if (numPrimalDPN == 4) - { - if (isLocalNode1) - for (auto i = 0; i < 3; ++i) - { - const LO lclRow = 3 * lclNode1 + i; - const LO lclCol = lclNodeWO2; - - const size_t count = Kokkos::atomic_fetch_add(&rowCountsS(lclRow), 1); - colIndicesS(rowOffsetsS(lclRow) + count) = lclCol; - } - if (isDiffNodes && isLocalNode2) - for (auto i = 0; i < 3; ++i) - { - const LO lclRow = 3 * lclNode2 + i; - const LO lclCol = lclNodeWO1; - - const size_t count = Kokkos::atomic_fetch_add(&rowCountsS(lclRow), 1); - colIndicesS(rowOffsetsS(lclRow) + count) = lclCol; - } - } - } - }); - - LinearSolver::getTimers()["graph: sort"].start(); - - if (numPrimalDPN == 4 || numPrimalDPN == 1) - Kokkos::parallel_for( - numLclRowsL, - KOKKOS_LAMBDA(int lclRow) { - auto currentColIndices = subview(colIndicesL, Kokkos::make_pair(rowOffsetsL(lclRow), rowOffsetsL(lclRow + 1))); - LO *const lclColIndsRaw = currentColIndices.data(); - std::sort(lclColIndsRaw, lclColIndsRaw + rowOffsetsL(lclRow + 1) - rowOffsetsL(lclRow)); - }); - - if (numPrimalDPN == 4 || numPrimalDPN == 3) - Kokkos::parallel_for( - numLclRowsK, - KOKKOS_LAMBDA(int lclRow) { - auto currentColIndices = subview(colIndicesK, Kokkos::make_pair(rowOffsetsK(lclRow), rowOffsetsK(lclRow + 1))); - LO *const lclColIndsRaw = currentColIndices.data(); - std::sort(lclColIndsRaw, lclColIndsRaw + rowOffsetsK(lclRow + 1) - rowOffsetsK(lclRow)); - }); - - if (numPrimalDPN == 4) - Kokkos::parallel_for( - numLclRowsK, - KOKKOS_LAMBDA(int lclRow) { - auto currentColIndices = subview(colIndicesS, Kokkos::make_pair(rowOffsetsS(lclRow), rowOffsetsS(lclRow + 1))); - LO *const lclColIndsRaw = currentColIndices.data(); - std::sort(lclColIndsRaw, lclColIndsRaw + rowOffsetsS(lclRow + 1) - rowOffsetsS(lclRow)); - }); - - LinearSolver::getTimers()["graph: sort"].stop(); - - if (numPrimalDPN == 4 || numPrimalDPN == 1) - { - L = rcp(new crs_graph_type(map->thermoMap, map->thermoMapWO, rowOffsetsL, colIndicesL)); - L->fillComplete(map->thermoMap, map->thermoMap); - } - - if (numPrimalDPN == 4 || numPrimalDPN == 3) - { - K = rcp(new crs_graph_type(map->mechaMap, map->mechaMapWO, rowOffsetsK, colIndicesK)); - K->fillComplete(map->mechaMap, map->mechaMap); - } - - if (numPrimalDPN == 4) - { - S = rcp(new crs_graph_type(map->mechaMap, map->thermoMapWO, rowOffsetsS, colIndicesS)); - S->fillComplete(map->thermoMap, map->mechaMap); - - Tpetra::MatrixMarket::Writer<Tpetra::CrsMatrix<>>::writeSparseGraphFile(std::string("S_graph.txt"), S); - } -} diff --git a/katoptron/src/Graph.h b/katoptron/src/Graph.h deleted file mode 100644 index f3f0fd52..00000000 --- a/katoptron/src/Graph.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef KATOPTRON_GRAPH_H -#define KATOPTRON_GRAPH_H - -#include "katoptron.h" - -#include "Map.h" -#include "ElementsList.h" - -#include <Tpetra_Map.hpp> -#include <Tpetra_Vector.hpp> -#include <Tpetra_CrsGraph.hpp> - -#include <Teuchos_RCP.hpp> - -namespace katoptron -{ - -/** - * @brief Class used to compute and store the graph of the primal matrices with and without overlaps. - */ -class Graph -{ - typedef Map::local_ordinal_type local_ordinal_type; - typedef Map::global_ordinal_type global_ordinal_type; - typedef Tpetra::CrsGraph<local_ordinal_type, global_ordinal_type> crs_graph_type; - -public: - Teuchos::RCP<crs_graph_type> K; - Teuchos::RCP<crs_graph_type> S; - Teuchos::RCP<crs_graph_type> L; - - Graph(Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList); -}; -}; // namespace katoptron - -#endif //KATOPTRON_GRAPH_H diff --git a/katoptron/src/IterativeSolver.cpp b/katoptron/src/IterativeSolver.cpp deleted file mode 100644 index cf429c7f..00000000 --- a/katoptron/src/IterativeSolver.cpp +++ /dev/null @@ -1,868 +0,0 @@ -#include "IterativeSolver.h" -#include "wTimer.h" -#include "wProblem.h" -#include "wTag.h" -#include "wMshData.h" -#include "wElement.h" -#include "wNode.h" -#include "wMedium.h" -#include "wDirichlet.h" -#include "wContact.h" -#include <map> -#include "wTag.h" -#include <math.h> -#include "wHex8.h" -#include "wQuad4.h" -#include "wTri3.h" -#include "wCacheHex8.h" -#include "wGaussHex8.h" -#include "wResults.h" - -#include "wRandomVariable.h" - -//#include "wElemMatrix.h" - -#include "wDisplayHook.h" - -#include <math.h> - -#include <mpi.h> - -//#include <tbb/tbb.h> -//#include <tbb/parallel_for.h> -//#include <tbb/blocked_range.h> -//#include <tbb/task_scheduler_init.h> -//#include <tbb/spin_mutex.h> - -#include <cstring> -#include <sstream> -#include <iostream> -#include <locale> // std::locale - -// Tpetra -#include "Stokhos_Tpetra_MP_Vector.hpp" -#include "Stokhos_Tpetra_Utilities_MP_Vector.hpp" -#include "Tpetra_ConfigDefs.hpp" - -#include "Tpetra_Map.hpp" -#include "Tpetra_MultiVector.hpp" -#include "Tpetra_Vector.hpp" -#include "Tpetra_CrsGraph.hpp" -#include "Tpetra_CrsMatrix.hpp" -#include "Stokhos_Tpetra_CG.hpp" -//#include "Sacado_Fad_MP_Vector.hpp" - -#include "Teuchos_XMLParameterListCoreHelpers.hpp" -#include <Teuchos_Array.hpp> -#include <Teuchos_GlobalMPISession.hpp> -#include <Teuchos_oblackholestream.hpp> -#include <Teuchos_ScalarTraits.hpp> -#include <Teuchos_RCP.hpp> -#include "Teuchos_ParameterList.hpp" - -#include "Stokhos_Amesos2_MP_Vector.hpp" -#include "Amesos2_Factory.hpp" - -#include "Stokhos_Ifpack2_MP_Vector.hpp" -#include "Ifpack2_Factory.hpp" - -#include "Belos_Tpetra_MP_Vector.hpp" -#include "BelosStatusTestCombo.hpp" - -#include <Xpetra_BlockedCrsMatrix.hpp> -#include <Xpetra_Matrix.hpp> -#include <BelosXpetraAdapter.hpp> // => This header defines Belos::XpetraOp -#include <BelosMueLuAdapter.hpp> // => This header defines Belos::MueLuOp -#include <Xpetra_TpetraMultiVector.hpp> - -#include <Xpetra_MapExtractorFactory.hpp> -#include <Xpetra_MatrixUtils.hpp> -//#include "BelosGmresSolMgr.hpp" - -#include "Kokkos_ViewFactory.hpp" -#include "Kokkos_Vector.hpp" - -#include <Epetra_Map.h> -#include "Epetra_MpiComm.h" - -#include "BelosConfigDefs.hpp" - -#include "Map.h" -#include "DiscreteProblem.h" - -#include <fstream> - -#include <MueLu.hpp> - -#include <MueLu_Exceptions.hpp> -#include <MueLu_Hierarchy.hpp> -#include <MueLu_MasterList.hpp> -#include <MueLu_MLParameterListInterpreter.hpp> -#include <MueLu_ParameterListInterpreter.hpp> -#include <MueLu_Utilities.hpp> -#include <MueLu_HierarchyUtils.hpp> - -#include <BelosXpetraStatusTestGenResSubNorm_MP_Vector.hpp> -#include <BelosStatusTestWeightedGenResNorm_MP_Vector.hpp> - -#include "ElementMatrices.h" - -#include "NodesList.h" - -#ifdef max -#undef max // pour std::numeric_limits<std::streamsize>::max() -#endif - -using namespace katoptron; -using namespace fwk; - -#define HAVE_BELOS_TPETRA_TIMERS - -template <typename scalar> -Teuchos::ParameterList convertParamList(Teuchos::ParameterList ¶mList) -{ - for (Teuchos::ParameterList::ConstIterator i = paramList.begin(); i != paramList.end(); ++i) - { - const std::string &name_i = paramList.name(i); - - if (Teuchos::isParameterType<double>(paramList, name_i)) - { - double value = Teuchos::getParameter<double>(paramList, name_i); - std::string name_ii = name_i; - - paramList.set<scalar>(name_ii, ((scalar)value)); - } - else if (Teuchos::isParameterType<Teuchos::ParameterList>(paramList, name_i)) - { - Teuchos::ParameterList subparamList = Teuchos::getParameter<Teuchos::ParameterList>(paramList, name_i); - subparamList = convertParamList<scalar>(subparamList); - paramList.set(name_i, subparamList); - } - } - - return paramList; -} - -/** - * @brief Display IterativeSolver information. - */ -void IterativeSolver::write(std::ostream &out) const -{ - out << "katoptron::Solver:\n"; - out << pbl; // wProblem.h -} - -/** - * @brief Launch the solver. - */ -void IterativeSolver::start() -{ - std::locale::global(std::locale::classic()); - { - if (minimum_ensemble_size <= 1) - { - IterativeSolver::tstart<double>(); - } - else if (minimum_ensemble_size <= 8) - { - typedef Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>> ensemble_scalar; - IterativeSolver::tstart<ensemble_scalar>(); - } - else if (minimum_ensemble_size <= 16) - { - typedef Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>> ensemble_scalar; - IterativeSolver::tstart<ensemble_scalar>(); - } - else if (minimum_ensemble_size <= 24) - { - typedef Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>> ensemble_scalar; - IterativeSolver::tstart<ensemble_scalar>(); - } - else if (minimum_ensemble_size <= 32) - { - typedef Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>> ensemble_scalar; - IterativeSolver::tstart<ensemble_scalar>(); - } - } -} - -/** - * @brief Launch the solver with a templated scalar type. - */ -template <typename scalar> -void IterativeSolver::tstart() -{ - LinearSolver::getTimers().reset(); - // ------------------------------------------ - // - // Trilinos initialization - // - // ------------------------------------------ - using std::cerr; - using std::cout; - using std::endl; - using Teuchos::arcp; - using Teuchos::Array; - using Teuchos::ArrayRCP; - using Teuchos::ArrayView; - using Teuchos::RCP; - using Teuchos::rcp; - using Teuchos::tuple; - - using Kokkos::ALL; - using Kokkos::subview; - - typedef Map::local_ordinal_type local_ordinal_type; - typedef Map::global_ordinal_type global_ordinal_type; - typedef Map::node_type node_type; - - typedef typename Vectors<scalar>::tpetra_vector_type tpetra_vector_type; - typedef typename Vectors<scalar>::tpetra_mvector_type tpetra_mvector_type; - typedef typename Vectors<scalar>::xpetra_mvector_type xpetra_mvector_type; - typedef typename Vectors<scalar>::xpetra_tmvector_type xpetra_tmvector_type; - - typedef typename Matrices<scalar>::tpetra_crs_type tpetra_crs_type; - - typedef typename Matrices<scalar>::xpetra_bcrs_type xpetra_bcrs_type; - typedef typename Matrices<scalar>::xpetra_mat_type xpetra_mat_type; - - typedef Tpetra::Export<local_ordinal_type, global_ordinal_type, node_type> export_type; - typedef Tpetra::Import<local_ordinal_type, global_ordinal_type, node_type> import_type; - - typedef MueLu::Hierarchy<scalar, local_ordinal_type, global_ordinal_type, node_type> Hierarchy; - typedef MueLu::ParameterListInterpreter<scalar, local_ordinal_type, global_ordinal_type, node_type> ParameterListInterpreter; - - typedef Teuchos::ScalarTraits<scalar> STS; - typedef typename STS::magnitudeType magnitude_type; - - Teuchos::oblackholestream blackhole; - - RCP<const Teuchos::Comm<int>> comm = rcp(new Teuchos::MpiComm<int>(pbl.comm)); - - const size_t myRank = comm->getRank(); - - // Make an output stream (for verbose output) that only prints on - // Proc 0 of the communicator. - Teuchos::oblackholestream blackHole; - std::ostream &out = (myRank == 0) ? std::cout : blackHole; - - // Create some timers used by Belos so we can access them - Teuchos::RCP<Teuchos::Time> time_mat_vec = - Teuchos::TimeMonitor::getNewTimer("Belos: Operation Op*x"); - Teuchos::RCP<Teuchos::Time> time_prec_apply = - Teuchos::TimeMonitor::getNewTimer("Belos: Operation Prec*x"); - Teuchos::RCP<Teuchos::Time> time_prec_setup = - Teuchos::TimeMonitor::getNewTimer("Total MueLu setup time"); - - std::string ortho_strategy = solverList->get("Orthogonalization", "DGKS"); - std::string belos_ortho_timer_name = "Belos: " + ortho_strategy; - - if (ortho_strategy == "IMGS") - belos_ortho_timer_name = belos_ortho_timer_name + "[1]"; - else - belos_ortho_timer_name = belos_ortho_timer_name + "[2]"; - - Teuchos::RCP<Teuchos::Time> time_ortho = - Teuchos::TimeMonitor::getNewTimer(belos_ortho_timer_name + ": Orthogonalization"); - Teuchos::RCP<Teuchos::Time> time_ortho_inner = - Teuchos::TimeMonitor::getNewTimer(belos_ortho_timer_name + ": Ortho (Inner Product)"); - Teuchos::RCP<Teuchos::Time> time_ortho_norm = - Teuchos::TimeMonitor::getNewTimer(belos_ortho_timer_name + ": Ortho (Norm)"); - Teuchos::RCP<Teuchos::Time> time_ortho_update = - Teuchos::TimeMonitor::getNewTimer(belos_ortho_timer_name + ": Ortho (Update)"); - - Teuchos::RCP<Teuchos::Time> time_belos_total = - Teuchos::TimeMonitor::getNewTimer("Belos: PseudoBlockGmresSolMgr total solve time"); - - bool write_intermediate_files = solverList->get("Write intermediate files", false); - bool write_txt_files = solverList->get("Write txt files", false); - bool write_vtk_files = solverList->get("Write vtk files", true); - { - LinearSolver::getTimers()["total"].start(); - auto msh = pbl.msh; - - auto numNodes = msh->nodes.size(); - - RCP<Teuchos::ParameterList> randomParams = - rcp(new Teuchos::ParameterList(solverList->get("randomParams", Teuchos::ParameterList()))); - const int n_rv = pbl.RandomVariables.size(); - - typedef Kokkos::View<scalar *, Kokkos::LayoutLeft> RandomVariableView; - - RandomVariableView m_rv_values = RandomVariableView("KL Random Variables", n_rv); - - typedef EnsembleTraits<scalar> ET; - const int ensemble_size = ET::size; - - for (int i = 0; i < n_rv; ++i) - for (int j = 0; j < ensemble_size; ++j) - ET::coeff(m_rv_values(i), j) = (double)pbl.RandomVariables[i]->values[j]; - - LinearSolver::getTimers()["dp"].start(); - Teuchos::RCP<DiscreteProblem<scalar>> discreteProblem = - Teuchos::rcp(new DiscreteProblem<scalar>(pbl, numPrimalDPN, randomParams, m_rv_values)); - LinearSolver::getTimers()["dp"].stop(); - LinearSolver::getTimers()["computeMatrices"].start(); - - const bool contactProblem = (discreteProblem->domain->contactsList->getContactNumber() >= 1); - - if (contactProblem) - { - LinearSolver::getTimers()["compute contact matrices"].start(); - discreteProblem->computeContactMatrices(pbl.comm); - LinearSolver::getTimers()["compute contact matrices"].stop(); - } - LinearSolver::getTimers()["compute block 00 matrix"].start(); - discreteProblem->computeMatrices(); - LinearSolver::getTimers()["compute block 00 matrix"].stop(); - LinearSolver::getTimers()["computeMatrices"].stop(); - - LinearSolver::getTimers()["computeMatrices"].start(); - - const bool mergeMatrix = solverList->get("Merge block matrix", true); - const bool writeMatrixAndVectors = solverList->get("Write matrix and vectors", false); - - if (writeMatrixAndVectors) - { - LinearSolver::getTimers()["write"].start(); - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeSparseFile(std::string("A_mm.txt"), - discreteProblem->algebraic->matrices->K); - if (contactProblem) - { - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeSparseFile(std::string("B_mm.txt"), - discreteProblem->algebraic->matrices->B); - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeSparseFile(std::string("B_T_mm.txt"), - discreteProblem->algebraic->matrices->B_T); - } - LinearSolver::getTimers()["write"].stop(); - } - - LinearSolver::getTimers()["computeLoads"].start(); - bool is_scaled = solverList->get("Scaled Block 0", false); - discreteProblem->computeLoads(is_scaled); - LinearSolver::getTimers()["computeLoads"].stop(); - - if (contactProblem) - { - scalar gamma; - if (solverList->isType<std::string>("gamma")) - { - Teuchos::Array<double> array_gamma_double = Teuchos::getArrayFromStringParameter<double>(*solverList, "gamma"); - for (int j = 0; j < ensemble_size; ++j) - ET::coeff(gamma, j) = (double)array_gamma_double[j]; - } - else - gamma = solverList->get("gamma", 0.); - discreteProblem->createBlockMatrix(gamma, writeMatrixAndVectors, mergeMatrix); - } - - LinearSolver::getTimers()["computeMatrices"].stop(); - - LinearSolver::getTimers()["computeLoads"].start(); - if (contactProblem) - { - discreteProblem->createBlockMVector(writeMatrixAndVectors); - } - LinearSolver::getTimers()["computeLoads"].stop(); - - if (writeMatrixAndVectors) - { - std::string name_1, name_2, name_3; - name_1 = "matrix_after_bc.text"; - name_2 = "matrix_after_bc"; - name_3 = "vector_after_bc.text"; - - LinearSolver::getTimers()["write"].start(); - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeSparseFile(std::string("A_mm_after_bc.txt"), - discreteProblem->algebraic->matrices->K); - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeDenseFile(std::string("b_mm_after_bc.txt"), - discreteProblem->algebraic->vectors->b); - LinearSolver::getTimers()["write"].stop(); - } - - std::string name_4, defaultName, name_x; - defaultName = "none"; - name_4 = solverList->get("Initial guess", defaultName); - name_x = "solution"; - - RCP<export_type> exportOutput; - RCP<import_type> importOutput; - RCP<tpetra_vector_type> xPost, xPost2; - if (contactProblem) - { - importOutput = rcp(new import_type(discreteProblem->algebraic->map->fullmap, discreteProblem->algebraic->map->fullmapWO)); - exportOutput = rcp(new export_type(discreteProblem->algebraic->map->fullmapWO, discreteProblem->algebraic->map->fullmapOutput)); - xPost = rcp(new tpetra_vector_type(discreteProblem->algebraic->map->fullmapWO, false)); - xPost2 = rcp(new tpetra_vector_type(discreteProblem->algebraic->map->fullmapOutput, false)); - } - else - { - importOutput = rcp(new import_type(discreteProblem->algebraic->map->mapDofs, discreteProblem->algebraic->map->mapDofsWO)); - exportOutput = rcp(new export_type(discreteProblem->algebraic->map->mapDofsWO, discreteProblem->algebraic->map->mapOutput)); - xPost = rcp(new tpetra_vector_type(discreteProblem->algebraic->map->mapDofsWO, false)); - xPost2 = rcp(new tpetra_vector_type(discreteProblem->algebraic->map->mapOutput, false)); - } - - if (name_4.compare(defaultName) != 0) - discreteProblem->algebraic->vectors->x = discreteProblem->algebraic->readVectorFromFile(name_4, myRank); - - RCP<tpetra_vector_type> r(new tpetra_vector_type(discreteProblem->algebraic->map->mapDofs, true)); - - discreteProblem->algebraic->matrices->K->apply(*(discreteProblem->algebraic->vectors->x), *r, Teuchos::NO_TRANS, (scalar)-1., (scalar)1.); - - if (writeMatrixAndVectors) - { - LinearSolver::getTimers()["write"].start(); - std::string name_5 = "x_0.text"; - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeDenseFile(std::string(name_5), discreteProblem->algebraic->vectors->x); - std::string name_6 = "r_0.text"; - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeDenseFile(std::string(name_6), r); - LinearSolver::getTimers()["write"].stop(); - } - - bool usePrec = solverList->get("Use preconditioner", contactProblem); - - std::string belos_output_file = solverList->get("Output Stream file name belos", "belos_out.txt"); - - std::ofstream belos_ofstream(belos_output_file); - - RCP<Teuchos::FancyOStream> verbOut = Teuchos::getFancyOStream(Teuchos::rcpFromRef(belos_ofstream)); - solverList->set("Output Stream", verbOut->getOStream()); - - magnitude_type GMRES_tol = solverList->get("Ensemble Convergence Tolerance", 1E-08); - solverList->set("Convergence Tolerance", GMRES_tol); - - active_set_iteration = 0; - size_t max_active_set_iteration = solverList->get("Maximum active set iteration", 1); - - bool blockedStatusTest = solverList->get("Use blocked status test", !mergeMatrix); - bool blockedStatusTest_x = solverList->get("Use blocked status test: x", blockedStatusTest); - bool blockedStatusTest_T = solverList->get("Use blocked status test: T", blockedStatusTest); - - LinearSolver::getTimers()["solver"].start(); - while (true) - { - // Solve - RCP<tpetra_vector_type> xx; - - const bool blockedMatrix = (numPrimalDPN == 4); - - RCP<xpetra_mat_type> A; - if (contactProblem) - A = discreteProblem->algebraic->matrices->blockedMatrix; - else if (mergeMatrix && blockedMatrix) - A = Teuchos::rcp_dynamic_cast<xpetra_bcrs_type>(discreteProblem->algebraic->matrices->A)->Merge(); - else - A = discreteProblem->algebraic->matrices->A; - - typedef xpetra_mvector_type MV; - typedef typename tpetra_mvector_type::dot_type belos_scalar; - typedef Belos::OperatorT<MV> OP; - - typedef Belos::LinearProblem<belos_scalar, MV, OP> BLinProb; - // Turns a Xpetra::Matrix object into a Belos operator - RCP<OP> belosOp = rcp(new Belos::XpetraOp<scalar, local_ordinal_type, global_ordinal_type, node_type>(A)); - RCP<OP> belosPrec; - - if (usePrec) - { - LinearSolver::getTimers()["preconditioner setup"].start(); - RCP<xpetra_mvector_type> nullspace1 = Teuchos::null; - RCP<xpetra_mvector_type> nullspace2 = Teuchos::null; - - bool useXML = solverList->get("use xml file", false); - string xmlFileName = solverList->get("MueLu xml file name", " "); - RCP<Teuchos::ParameterList> mueluParams; - - if (useXML || contactProblem) - { - bool doIconver = solverList->get("convert MueLu xml file", false); - - RCP<Teuchos::ParameterList> paramList = Teuchos::getParametersFromXmlFile(xmlFileName); - - Teuchos::ParameterList paramList2; - - if (contactProblem) - { - RCP<std::map<local_ordinal_type, local_ordinal_type>> lagr2dof = - Teuchos::rcpFromRef(discreteProblem->algebraic->map->lm_to_dof); - - RCP<Teuchos::ParameterList> paramsF, paramsI; - paramsF = sublist(paramList, "Factories"); - paramsI = sublist(paramsF, "myInterfaceAggs2"); - paramsI->set<RCP<std::map<local_ordinal_type, local_ordinal_type>>>("DualNodeID2PrimalNodeID - level 0", lagr2dof); - } - - if (doIconver) - paramList2 = convertParamList<scalar>(*paramList); - else - paramList2 = (*paramList); - - mueluParams = rcp(new Teuchos::ParameterList(paramList2)); - } - else - mueluParams = rcp(new Teuchos::ParameterList(solverList->get("mueluParams", Teuchos::ParameterList()))); - - ParameterListInterpreter mueLuFactory(*mueluParams, comm); - RCP<Hierarchy> H = mueLuFactory.CreateHierarchy(); - H->GetLevel(0)->Set("A", A); - - H->IsPreconditioner(true); - H->SetDefaultVerbLevel(MueLu::Extreme); - mueLuFactory.SetupHierarchy(*H); - LinearSolver::getTimers()["preconditioner setup"].stop(); - - // Turns a MueLu::Hierarchy object into a Belos operator - belosPrec = rcp(new Belos::MueLuOp<scalar, local_ordinal_type, global_ordinal_type, node_type>(H)); - } - - RCP<MV> xMV; - RCP<MV> bMV; - RCP<MV> weightsMV; - - if (contactProblem) - { - xMV = discreteProblem->algebraic->vectors->solutionMultiVector; - bMV = discreteProblem->algebraic->vectors->rhsMultiVector; - } - else - { - xMV = rcp(new xpetra_tmvector_type(discreteProblem->algebraic->vectors->x)); - bMV = rcp(new xpetra_tmvector_type(discreteProblem->algebraic->vectors->b)); - weightsMV = rcp(new xpetra_tmvector_type(discreteProblem->algebraic->vectors->weights)); - } - - RCP<BLinProb> blinproblem = rcp(new BLinProb(belosOp, xMV, bMV)); - - if (usePrec) - blinproblem->setRightPrec(belosPrec); - blinproblem->setProblem(); - RCP<Teuchos::ParameterList> belosParams = solverList; - RCP<Belos::SolverManager<belos_scalar, MV, OP>> blinsolver = - rcp(new Belos::PseudoBlockGmresSolMgr<belos_scalar, MV, OP>(blinproblem, belosParams)); - out << "Belos informations are written in file " << belos_output_file << endl; - - if (writeMatrixAndVectors) - { - LinearSolver::getTimers()["write"].start(); - if (contactProblem) - { - RCP<tpetra_mvector_type> mxx = - (Teuchos::rcp_dynamic_cast<xpetra_tmvector_type>(discreteProblem->algebraic->vectors->solutionMultiVector))->getTpetra_MultiVector(); - RCP<tpetra_mvector_type> mbb = - (Teuchos::rcp_dynamic_cast<xpetra_tmvector_type>(discreteProblem->algebraic->vectors->rhsMultiVector))->getTpetra_MultiVector(); - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeDenseFile(std::string("blocked_x_0_mm.txt"), mxx->getVectorNonConst(0)); - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeDenseFile(std::string("blocked_b_mm.txt"), mbb->getVectorNonConst(0)); - } - LinearSolver::getTimers()["write"].stop(); - } - - if (contactProblem && solverList->get("Create Preconditioned Matrix", false)) - { - LinearSolver::getTimers()["create AM^{-1}"].start(); - typedef xpetra_tmvector_type TMV; - - Teuchos::RCP<const Xpetra::Map<local_ordinal_type, global_ordinal_type, node_type>> merged_map = - discreteProblem->algebraic->vectors->rhsMultiVector->getMap(); - - Teuchos::RCP<TMV> MVx1 = Teuchos::rcp(new TMV(merged_map, merged_map->getGlobalNumElements(), true)); - Teuchos::RCP<TMV> MVx2 = Teuchos::rcp(new TMV(merged_map, merged_map->getGlobalNumElements(), true)); - Teuchos::RCP<TMV> MVy1 = Teuchos::rcp(new TMV(merged_map, merged_map->getGlobalNumElements(), true)); - Teuchos::RCP<TMV> MVy2 = Teuchos::rcp(new TMV(merged_map, merged_map->getGlobalNumElements(), true)); - - for (size_t local_i = 0; local_i < merged_map->getNodeNumElements(); ++local_i) - MVx1->sumIntoGlobalValue(merged_map->getGlobalElement(local_i), merged_map->getGlobalElement(local_i), ((scalar)1.)); - - belosPrec->Apply(*MVx1, *MVx2); - belosOp->Apply(*MVx2, *MVy2); - belosOp->Apply(*MVx1, *MVy1); - - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeDenseFile(std::string("Applied_Matrix_mm.txt"), - MVy1->getTpetra_MultiVector()); - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeDenseFile(std::string("Applied_Preconditioner_mm.txt"), - MVx2->getTpetra_MultiVector()); - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeDenseFile(std::string("Applied_Preconditioned_Matrix_mm.txt"), - MVy2->getTpetra_MultiVector()); - - LinearSolver::getTimers()["create AM^{-1}"].stop(); - } - - if (blockedMatrix && blockedStatusTest) - { - typedef Belos::StatusTestGenResSubNorm<belos_scalar, MV, OP> blockStatusTestClass; - typedef Belos::StatusTestWeightedGenResNorm<belos_scalar, MV, OP> weightedStatusTestClass; - typedef Belos::StatusTestCombo<belos_scalar, MV, OP> StatusTestComboClass; - - magnitude_type GMRES_tol_x = solverList->get("Ensemble Convergence Tolerance: x", 1E-08); - magnitude_type GMRES_tol_T = solverList->get("Ensemble Convergence Tolerance: T", 1E-08); - magnitude_type GMRES_tol_w = solverList->get("Ensemble Convergence Tolerance: weights", 1E-08); - - bool x_rel = solverList->get("Ensemble Convergence Tolerance: x - relative", true); - bool x_rel_full_rhs = solverList->get("Ensemble Convergence Tolerance: x - relative full rhs", false); - bool T_rel = solverList->get("Ensemble Convergence Tolerance: T - relative", true); - bool T_rel_full_rhs = solverList->get("Ensemble Convergence Tolerance: T - relative full rhs", false); - - bool weightStatusTest = solverList->get("Use weighted status test", false); - bool w_rel = solverList->get("Ensemble Convergence Tolerance: weights - relative", true); - - RCP<blockStatusTestClass> blockStatusTest_T = Teuchos::rcp(new blockStatusTestClass(GMRES_tol_T, 0)); - RCP<blockStatusTestClass> blockStatusTest_x = Teuchos::rcp(new blockStatusTestClass(GMRES_tol_x, 1)); - RCP<weightedStatusTestClass> weightedStatusTest = Teuchos::rcp(new weightedStatusTestClass(GMRES_tol_w, weightsMV)); - - if (x_rel && x_rel_full_rhs) - blockStatusTest_x->defineScaleForm(Belos::NormOfFullInitRes, Belos::TwoNorm); - else if (!x_rel) - blockStatusTest_x->defineScaleForm(Belos::None, Belos::TwoNorm); - if (T_rel && T_rel_full_rhs) - blockStatusTest_T->defineScaleForm(Belos::NormOfFullInitRes, Belos::TwoNorm); - else if (!T_rel) - blockStatusTest_T->defineScaleForm(Belos::None, Belos::TwoNorm); - if (!w_rel) - weightedStatusTest->defineScaleForm(Belos::None, Belos::TwoNorm); - - RCP<StatusTestComboClass> statusTestCombo = Teuchos::rcp(new StatusTestComboClass(StatusTestComboClass::SEQ)); - - if (blockedStatusTest_T) - statusTestCombo->addStatusTest(blockStatusTest_T); - if (blockedStatusTest_x) - statusTestCombo->addStatusTest(blockStatusTest_x); - if (weightStatusTest) - statusTestCombo->addStatusTest(weightedStatusTest); - - blinsolver->setUserConvStatusTest(statusTestCombo); - } - out << "--------- Belos start" << endl; - blinsolver->solve(); - out << "--------- Belos stop" << endl; - - if (contactProblem) - { - RCP<tpetra_mvector_type> mxx = - (Teuchos::rcp_dynamic_cast<xpetra_tmvector_type>(discreteProblem->algebraic->vectors->solutionMultiVector))->getTpetra_MultiVector(); - xx = mxx->getVectorNonConst(0); - - if (write_intermediate_files) - { - LinearSolver::getTimers()["solver"].stop(); - LinearSolver::getTimers()["write results"].start(); - - std::string name_5 = "x_sol" + std::to_string(active_set_iteration) + ".txt"; - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeDenseFile(std::string(name_5), xx); - LinearSolver::getTimers()["write results"].stop(); - LinearSolver::getTimers()["solver"].start(); - } - - xPost->doImport(*xx, *importOutput, Tpetra::INSERT); - } - else - { - xPost->doImport(*(discreteProblem->algebraic->vectors->x), *importOutput, Tpetra::INSERT); - } - ++active_set_iteration; - - if (write_intermediate_files) - { - LinearSolver::getTimers()["solver"].stop(); - LinearSolver::getTimers()["write results"].start(); - if (write_txt_files) - { - xPost2->doExport(*(xPost), *exportOutput, Tpetra::INSERT); - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeDenseFile(std::string("x_mm.txt"), xPost2); - } - if (write_vtk_files) - { - this->writeResults<scalar>(xPost, numNodes, name_x, active_set_iteration, - false, false, discreteProblem->algebraic->map, - discreteProblem->domain->random_field); - } - LinearSolver::getTimers()["write results"].stop(); - LinearSolver::getTimers()["solver"].start(); - } - - Mask<scalar> hasConverged; - const size_t ensemble_size = hasConverged.getSize(); - - for (size_t l = 0; l < ensemble_size; ++l) - hasConverged.set(l, true); - - if (active_set_iteration == max_active_set_iteration) - { - if (contactProblem) - { - LinearSolver::getTimers()["update"].start(); - hasConverged = discreteProblem->updateActivity(active_set_iteration); - LinearSolver::getTimers()["update"].stop(); - - if (MaskLogic::AND(hasConverged) == false) - { - out << "---------------------------------------------------------" << std::endl; - out << "---Has not converged before reaching maximum iteration---" << std::endl; - out << "---------------------------------------------------------" << std::endl; - } - } - break; - } - else if (contactProblem) - { - LinearSolver::getTimers()["update"].start(); - hasConverged = discreteProblem->updateActivity(active_set_iteration); - LinearSolver::getTimers()["update"].stop(); - } - if (MaskLogic::AND(hasConverged)) - break; - else - { -#ifndef HAVE_STOKHOS_ENSEMBLE_REDUCT - mask_assign(hasConverged, GMRES_tol) = {1., GMRES_tol}; - solverList->set("Convergence Tolerance", GMRES_tol); -#else - ; -#endif - } - } - - LinearSolver::getTimers()["solver"].stop(); - - LinearSolver::getTimers()["write results"].start(); - if (write_txt_files) - { - xPost2->doExport(*(xPost), *exportOutput, Tpetra::INSERT); - Tpetra::MatrixMarket::Writer<tpetra_crs_type>::writeDenseFile(std::string("x_mm.txt"), xPost2); - } - if (write_vtk_files) - { - this->writeResults<scalar>(xPost, numNodes, name_x, active_set_iteration, true, false, - discreteProblem->algebraic->map, discreteProblem->domain->random_field); - } - LinearSolver::getTimers()["write results"].stop(); - // ------------------------------------------ - // - // End of the timers and print - // - // ------------------------------------------ - LinearSolver::getTimers()["total"].stop(); - - discreteProblem->domain->elementsList = Teuchos::null; - discreteProblem->domain->nodesList = Teuchos::null; - discreteProblem->domain->materialsList = Teuchos::null; - discreteProblem->domain->contactsList = Teuchos::null; - discreteProblem->domain->random_field = Teuchos::null; - discreteProblem->domain->~Domain(); - discreteProblem = Teuchos::null; - - double time_mat_vec_sec = time_mat_vec->totalElapsedTime(); - double time_prec_setup_sec = time_prec_setup->totalElapsedTime(); - double time_prec_apply_sec = time_prec_apply->totalElapsedTime(); - double time_ortho_sec = time_ortho->totalElapsedTime(); - - double time_belos_total_sec = time_belos_total->totalElapsedTime(); - - double time_ortho_inner_sec = time_ortho_inner->totalElapsedTime(); - double time_ortho_norm_sec = time_ortho_norm->totalElapsedTime(); - double time_ortho_update_sec = time_ortho_update->totalElapsedTime(); - - static clock_t freq = CLOCKS_PER_SEC; - - UnixClockTime zero_time = UnixClockTime(0); - UnixClockTime time_mat_vec_time = UnixClockTime(time_mat_vec_sec * static_cast<double>(freq) / 10000); - UnixClockTime time_prec_setup_time = UnixClockTime(time_prec_setup_sec * static_cast<double>(freq) / 10000); - UnixClockTime time_prec_apply_time = UnixClockTime(time_prec_apply_sec * static_cast<double>(freq) / 10000); - UnixClockTime time_ortho_time = UnixClockTime(time_ortho_sec * static_cast<double>(freq) / 10000); - UnixClockTime time_ortho_inner_time = UnixClockTime(time_ortho_inner_sec * static_cast<double>(freq) / 10000); - UnixClockTime time_ortho_norm_time = UnixClockTime(time_ortho_norm_sec * static_cast<double>(freq) / 10000); - UnixClockTime time_ortho_update_time = UnixClockTime(time_ortho_update_sec * static_cast<double>(freq) / 10000); - - UnixClockTime time_belos_total_time = UnixClockTime(time_belos_total_sec * static_cast<double>(freq) / 10000); - - Times time_mat_vec_times, time_prec_setup_times, time_prec_apply_times, time_ortho_times, - time_ortho_inner_times, time_ortho_norm_times, time_ortho_update_times; - Times zero_times; - - Times time_belos_total_times; - - time_mat_vec_times.setUser(zero_time); - time_mat_vec_times.setReal(time_mat_vec_time); - time_mat_vec_times.setKernel(zero_time); - - time_prec_setup_times.setUser(zero_time); - time_prec_setup_times.setReal(time_prec_setup_time); - time_prec_setup_times.setKernel(zero_time); - - time_prec_apply_times.setUser(zero_time); - time_prec_apply_times.setReal(time_prec_apply_time); - time_prec_apply_times.setKernel(zero_time); - - time_ortho_times.setUser(zero_time); - time_ortho_times.setReal(time_ortho_time); - time_ortho_times.setKernel(zero_time); - - time_ortho_inner_times.setUser(zero_time); - time_ortho_inner_times.setReal(time_ortho_inner_time); - time_ortho_inner_times.setKernel(zero_time); - - time_ortho_norm_times.setUser(zero_time); - time_ortho_norm_times.setReal(time_ortho_norm_time); - time_ortho_norm_times.setKernel(zero_time); - - time_ortho_update_times.setUser(zero_time); - time_ortho_update_times.setReal(time_ortho_update_time); - time_ortho_update_times.setKernel(zero_time); - - zero_times.setUser(zero_time); - zero_times.setReal(zero_time); - zero_times.setKernel(zero_time); - - time_belos_total_times.setUser(zero_time); - time_belos_total_times.setReal(time_belos_total_time); - time_belos_total_times.setKernel(zero_time); - - LinearSolver::getTimers()["time_belos_total"].setTStart(zero_times); - LinearSolver::getTimers()["time_belos_total"].setTElaps(time_belos_total_times); - - LinearSolver::getTimers()["time_mat_vec"].setTStart(zero_times); - LinearSolver::getTimers()["time_mat_vec"].setTElaps(time_mat_vec_times); - - LinearSolver::getTimers()["time_prec_setup"].setTStart(zero_times); - LinearSolver::getTimers()["time_prec_setup"].setTElaps(time_prec_setup_times); - - LinearSolver::getTimers()["time_prec_apply"].setTStart(zero_times); - LinearSolver::getTimers()["time_prec_apply"].setTElaps(time_prec_apply_times); - - LinearSolver::getTimers()["time_ortho"].setTStart(zero_times); - LinearSolver::getTimers()["time_ortho"].setTElaps(time_ortho_times); - - LinearSolver::getTimers()["time_ortho_inner"].setTStart(zero_times); - LinearSolver::getTimers()["time_ortho_inner"].setTElaps(time_ortho_inner_times); - - LinearSolver::getTimers()["time_ortho_norm"].setTStart(zero_times); - LinearSolver::getTimers()["time_ortho_norm"].setTElaps(time_ortho_norm_times); - - LinearSolver::getTimers()["time_ortho_update"].setTStart(zero_times); - LinearSolver::getTimers()["time_ortho_update"].setTElaps(time_ortho_update_times); - - out << "\n---CPU statistics of proc " << myRank << "---\n"; - out << LinearSolver::getTimers(); - out << "---------------------------\n"; - - bool print_teuchos_timers = solverList->get("Print Teuchos timers", false); - if (print_teuchos_timers) - { - std::streambuf *psbuf, *backup; - std::ofstream filestr; - filestr.open("teuchos_timers.txt"); - - backup = std::cout.rdbuf(); // back up cout's streambuf - - psbuf = filestr.rdbuf(); // get file's streambuf - std::cout.rdbuf(psbuf); // assign streambuf to cout - - Teuchos::TimeMonitor::summarize(); - - std::cout.rdbuf(backup); // restore cout's original streambuf - - filestr.close(); - } - - Teuchos::TimeMonitor::zeroOutTimers(); - } -} diff --git a/katoptron/src/IterativeSolver.h b/katoptron/src/IterativeSolver.h deleted file mode 100644 index 57e1df27..00000000 --- a/katoptron/src/IterativeSolver.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef KATOPTRON_ITERATIVESOLVER_H -#define KATOPTRON_ITERATIVESOLVER_H - -#include "katoptron.h" -#include "wObject.h" -#include "wTimer.h" -#include "wTimers.h" -#include "Teuchos_ParameterList.hpp" - -#include "LinearSolver.h" - -namespace katoptron -{ - -/** - * @brief Solver class where the active set strategy is implemented. - */ -class KATOPTRON_API IterativeSolver : public LinearSolver -{ -public: - IterativeSolver(Problem &pbl, Teuchos::RCP<Teuchos::ParameterList> solverList, - int numPrimalDPN = 3, - size_t minimum_ensemble_size = 1) - : LinearSolver(pbl, solverList, numPrimalDPN, minimum_ensemble_size){}; -#ifndef SWIG - virtual void write(std::ostream &out) const; -#endif - void start(); - -private: - template <typename scalar> - void tstart(); -}; - -} // namespace katoptron - -#endif //KATOPTRON_ITERATIVESOLVER_H diff --git a/katoptron/src/Kokkos_Init.h b/katoptron/src/Kokkos_Init.h deleted file mode 100644 index 70164ab0..00000000 --- a/katoptron/src/Kokkos_Init.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef KATOPTRON_KOKKOSINIT_H -#define KATOPTRON_KOKKOSINIT_H - -#include <Kokkos_Core.hpp> - -void Kokkos_Initialize(int nThreads) -{ -#ifdef KOKKOS_ENABLE_DEPRECATED_CODE - Kokkos::OpenMP::initialize(nThreads); -#else - Kokkos::OpenMP::impl_initialize(nThreads); -#endif -} - -void Kokkos_Finalize() -{ - Kokkos::finalize(); -} - -#endif //KATOPTRON_KOKKOSINIT_H \ No newline at end of file diff --git a/katoptron/src/LinearSolver.h b/katoptron/src/LinearSolver.h deleted file mode 100644 index 0fe02a2f..00000000 --- a/katoptron/src/LinearSolver.h +++ /dev/null @@ -1,162 +0,0 @@ -#ifndef KATOPTRON_LINEARSOLVER_H -#define KATOPTRON_LINEARSOLVER_H - -#include "katoptron.h" -#include "wObject.h" -#include "wTimer.h" -#include "wTimers.h" -#include "wTag.h" -#include "wMedium.h" -#include "wNode.h" - -#include "Teuchos_ParameterList.hpp" - -#include "wProblem.h" -#include "wContact.h" -#include "wMshData.h" -#include "wDisplayHook.h" -#include "wElement.h" - -// Tpetra -#include "Stokhos_Tpetra_MP_Vector.hpp" -#include "Stokhos_Tpetra_Utilities_MP_Vector.hpp" -#include "Tpetra_ConfigDefs.hpp" -#include "Tpetra_Map.hpp" -#include "Tpetra_MultiVector.hpp" -#include "Tpetra_Vector.hpp" -#include "Tpetra_CrsGraph.hpp" -#include "Tpetra_CrsMatrix.hpp" -#include "Stokhos_Tpetra_CG.hpp" - -#include <Teuchos_Array.hpp> -#include <Teuchos_GlobalMPISession.hpp> -#include <Teuchos_oblackholestream.hpp> -#include <Teuchos_ScalarTraits.hpp> -#include <Teuchos_RCP.hpp> -#include "Teuchos_ParameterList.hpp" - -#include "Stokhos_Amesos2_MP_Vector.hpp" -#include "Amesos2_Factory.hpp" - -#include "Stokhos_Ifpack2_MP_Vector.hpp" -#include "Ifpack2_Factory.hpp" - -#include "Belos_Tpetra_MP_Vector.hpp" -#include "BelosLinearProblem.hpp" -#include "BelosPseudoBlockGmresSolMgr.hpp" -#include "BelosPseudoBlockCGSolMgr.hpp" -#include "BelosBlockGmresSolMgr.hpp" - -#include "Kokkos_ViewFactory.hpp" -#include "Kokkos_Vector.hpp" - -#include <Epetra_Map.h> -#include "Epetra_MpiComm.h" - -#include "BelosConfigDefs.hpp" - -#include "wRandomField.h" - -#include "wResults.h" -#include "wLazy.h" -#include "Map.h" - -#include <map> - -#include <limits> - -#include "EnsembleTraits.h" - -#include "ResultsDecl.hpp" - -namespace katoptron -{ - -/** - * @brief Solver class which includes utilities such as timers and VTK writers. - */ -class KATOPTRON_API LinearSolver -{ -public: -#ifndef SWIG - Problem &pbl; -#endif - Teuchos::RCP<Teuchos::ParameterList> solverList; - const int numPrimalDPN; - const size_t minimum_ensemble_size; - size_t active_set_iteration; -#ifndef SWIG - DisplayHook *dhook; - -#endif -public: - /** - * @brief LinearSolver constructor - * - * Arguments: - * <ul> - * <li> _pbl: A Problem object, - * <li> _solverList: an RCP to a ParameterList object which describes the solver, - * <li> _numPrimalDPN: the number of degrees of freedom per node (without taking into account the Lagrange multipliers), - * <li> _minimum_ensemble_size: the used ensemble size (1, 8, 16, 24, or 32), - * </ul> - */ - LinearSolver(Problem &_pbl, Teuchos::RCP<Teuchos::ParameterList> _solverList, - int _numPrimalDPN, - size_t _minimum_ensemble_size) : pbl(_pbl), - solverList(_solverList), - numPrimalDPN(_numPrimalDPN), - minimum_ensemble_size(_minimum_ensemble_size) - { - dhook = NULL; - } - - virtual ~LinearSolver() {} - - /** - * @brief Manage timers. - */ - static fwk::Timers &getTimers() - { - static fwk::Timers tms; - return tms; - } - - /** - * @brief Set the GUI. - */ - void setGUI(DisplayHook &hook) - { - dhook = &hook; - } - -protected: - /** - * @brief Write results on disk in VTK format. - */ - template <typename scalar> - void writeResults( - Teuchos::RCP<Tpetra::Vector<scalar, Map::local_ordinal_type, Map::global_ordinal_type>> xPost, - size_t numNodes, - std::string name, - size_t ast, - bool final_result, - bool write_txt, - Teuchos::RCP<Map> map, - Teuchos::RCP<RandomField<scalar, Kokkos::DefaultExecutionSpace>> random_field) - { - LinearSolver::getTimers()["write results"].start(); - - typedef Map::local_ordinal_type LocalOrdinal; - typedef Map::global_ordinal_type GlobalOrdinal; - - writeResultsVTK<scalar, LocalOrdinal, GlobalOrdinal>(pbl, xPost, map, - random_field, - name, ast, final_result, write_txt); - - LinearSolver::getTimers()["write results"].stop(); - } -}; -} // namespace katoptron - -#endif //KATOPTRON_LINEARSOLVER_H diff --git a/katoptron/src/Loads.h b/katoptron/src/Loads.h deleted file mode 100644 index aa8ab46d..00000000 --- a/katoptron/src/Loads.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef KATOPTRON_LOADS_H -#define KATOPTRON_LOADS_H - -#include "katoptron.h" -#include "Map.h" -#include "Domain.h" -#include "DirichletList.h" -#include "NeumannList.h" -#include "SourcesList.h" -#include "ElementsList.h" -#include "PreloadList.h" -#include "WeightsList.h" - -namespace katoptron -{ - -/** - * @brief Class which includes all the loads, boundary conditions, preloads, and weights. - */ -template <typename scalar> -class Loads -{ -public: - Teuchos::RCP<DirichletList<scalar>> dirichletList; - Teuchos::RCP<NeumannList<scalar>> neumannList; - Teuchos::RCP<SourcesList<scalar>> sourcesList; - Teuchos::RCP<PreloadList<scalar>> preloadList; - Teuchos::RCP<WeightsList<scalar>> weightsList; - - Loads(); - Loads(Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<Domain<scalar>> domain); -}; - -/** - * @brief Loads constructor - * - * This constructor initializes the lists of Dirichlet BC, Neumann BC, sources, preloads, and weights. - * - * Arguments: - * <ul> - * <li> pbl: A Problem object, - * <li> map: an RCP to a Map object, - * <li> domain: an RCP to a Domain object. - * </ul> - */ -template <typename scalar> -Loads<scalar>::Loads(Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<Domain<scalar>> domain) -{ - dirichletList = Teuchos::rcp(new DirichletList<scalar>(pbl, map, domain->elementsList)); - neumannList = Teuchos::rcp(new NeumannList<scalar>(pbl, map, domain->elementsList)); - sourcesList = Teuchos::rcp(new SourcesList<scalar>(pbl, map, domain->elementsList)); - preloadList = Teuchos::rcp(new PreloadList<scalar>(pbl, map, domain->elementsList)); - weightsList = Teuchos::rcp(new WeightsList<scalar>(pbl, map, domain->elementsList)); -} - -}; // namespace katoptron - -#endif //KATOPTRON_LOADS_H diff --git a/katoptron/src/Map.cpp b/katoptron/src/Map.cpp deleted file mode 100644 index 50321d34..00000000 --- a/katoptron/src/Map.cpp +++ /dev/null @@ -1,328 +0,0 @@ -#include "Map.h" - -#include "wProblem.h" -#include "wMshData.h" -#include "wElement.h" -#include "wNode.h" -#include "wGroup.h" -#include "wTag.h" - -#include <mpi.h> - -#include "wContact.h" - -#include <Teuchos_Array.hpp> - -using namespace katoptron; -using namespace tbox; - -void std_vector_intersection(std::vector<Map::global_ordinal_type> vec1, - std::vector<int> vec2, std::vector<int> &vec3) -{ - std::sort(vec2.begin(), vec2.end()); - for (auto i = 0; i < vec1.size(); ++i) - { - if (std::find(vec2.begin(), vec2.end(), vec1[i]) != vec2.end()) - vec3.push_back(vec1[i]); - } -} - -/** - * @brief Map constructor - * - * This constructor initializes the maps used to describe the distributed matrices and vectors. - * - * Arguments: - * <ul> - * <li> pbl: A Problem object, - * <li> numPrimalDPN: the number of degrees of freedom per node (without taking into account the Lagrange multipliers). - * </ul> - */ -Map::Map(Problem &pbl, size_t _numPrimalDPN) -{ - using Teuchos::Array; - using Teuchos::ArrayRCP; - using Teuchos::ArrayView; - using Teuchos::RCP; - using Teuchos::rcp; - - numPrimalDPN = _numPrimalDPN; - - RCP<const Teuchos::Comm<int>> comm = rcp(new Teuchos::MpiComm<int>(pbl.comm)); - - const size_t myRank = comm->getRank(); - const size_t numtasks = comm->getSize(); - - auto msh = pbl.msh; - - const Tpetra::global_size_t numNodes = msh->nodes.size(); - const Tpetra::global_size_t numPrimalDOFs = numNodes * numPrimalDPN; - const Tpetra::global_size_t numThermalDOFs = numNodes; - const Tpetra::global_size_t numMechanicalDOFs = numNodes * 3; - - // ------------------------------------------------------------- // - // Node and elements maps - // ------------------------------------------------------------- // - - // Nodes map with overlaps - // Create a map which associates to each mpi process the nodes included - // in their elements partition. This map has overlaps associated to the - // interfaces of the partitions. - std::vector<global_ordinal_type> myNodesWO1 = {}; - std::vector<global_ordinal_type> myNodesWO2 = {}; - std::vector<global_ordinal_type> tmpMyNodesWO1 = {}; - std::vector<global_ordinal_type> tmpMyNodesWO2 = {}; - std::vector<global_ordinal_type> myElems = {}; - - if (numtasks == 1) - { - for (auto e : msh->elems) - if (e->type() != ElType::POINT1) - myElems.push_back(e->no - 1); - - for (auto n : msh->nodes) - { - myNodesWO1.push_back(n->row); - myNodesWO2.push_back(n->row); - } - } - else - { - for (auto const &p : msh->parts) - { - if (p.second->no == (myRank + 1)) - { - for (auto e : p.second->elems) - { - if (e->type() == ElType::HEX8 || e->type() == ElType::TETRA4) - for (auto n1 : e->nodes) - { - tmpMyNodesWO1.push_back(n1->row); - tmpMyNodesWO2.push_back(n1->row); - } - if (e->type() != ElType::POINT1) - myElems.push_back(e->no - 1); - } - } - else if (p.second->no == -(myRank + 1)) - { - for (auto e : p.second->elems) - { - if (e->type() == ElType::HEX8 || e->type() == ElType::TETRA4) - for (auto n1 : e->nodes) - tmpMyNodesWO1.push_back(n1->row); - - if (e->type() != ElType::POINT1) - myElems.push_back(e->no - 1); - } - } - } - - std::sort(tmpMyNodesWO1.begin(), tmpMyNodesWO1.end()); - std::sort(tmpMyNodesWO2.begin(), tmpMyNodesWO2.end()); - std::sort(myElems.begin(), myElems.end()); - - myNodesWO1.push_back(tmpMyNodesWO1[0]); - - for (auto i = 1; i < tmpMyNodesWO1.size(); ++i) - if (tmpMyNodesWO1[i] != tmpMyNodesWO1[i - 1]) - myNodesWO1.push_back(tmpMyNodesWO1[i]); - - myNodesWO2.push_back(tmpMyNodesWO2[0]); - - for (auto i = 1; i < tmpMyNodesWO2.size(); ++i) - if (tmpMyNodesWO2[i] != tmpMyNodesWO2[i - 1]) - myNodesWO2.push_back(tmpMyNodesWO2[i]); - } - - mapNodesWO = rcp(new tpetra_map_type(numNodes, myNodesWO1, indexBase, comm)); - mapElems = rcp(new tpetra_map_type(Teuchos::OrdinalTraits<Tpetra::global_size_t>::invalid(), myElems, indexBase, comm)); - - // Loop on the contact and remove from myNodesWO2 any nodes included in a contact boundary for which the - // current mpi process has no contact element. - // This prevent Moertel of not finding the nodes. - int contacts_number = pbl.Contacts.size(); - if (numtasks != 1) - for (auto i = 0; i < contacts_number; ++i) - { - { - std::vector<int> v3; - std_vector_intersection(myNodesWO2, pbl.Contacts[i]->slave_boundary_nodes, v3); - for (auto j = 0; j < pbl.Contacts[i]->slave_elems.size(); ++j) - for (auto jj = 0; jj < pbl.Contacts[i]->slave_elems[j]->nodes.size(); ++jj) - { - auto no = pbl.Contacts[i]->slave_elems[j]->nodes[jj]->row; - - auto p = std::find(v3.begin(), v3.end(), no); - if (p != v3.end()) - { - v3.erase(p); - } - } - - for (auto j = 0; j < v3.size(); ++j) - { - auto p = std::find(myNodesWO2.begin(), myNodesWO2.end(), v3[j]); - if (p != myNodesWO2.end()) - { - myNodesWO2.erase(p); - } - } - } - { - std::vector<int> v3; - std_vector_intersection(myNodesWO2, pbl.Contacts[i]->master_boundary_nodes, v3); - - for (auto j = 0; j < pbl.Contacts[i]->master_elems.size(); ++j) - for (auto jj = 0; jj < pbl.Contacts[i]->master_elems[j]->nodes.size(); ++jj) - { - auto no = pbl.Contacts[i]->master_elems[j]->nodes[jj]->row; - auto p = std::find(v3.begin(), v3.end(), no); - if (p != v3.end()) - { - v3.erase(p); - } - } - for (auto j = 0; j < v3.size(); ++j) - { - auto p = std::find(myNodesWO2.begin(), myNodesWO2.end(), v3[j]); - if (p != myNodesWO2.end()) - { - myNodesWO2.erase(p); - } - } - } - } - RCP<const Tpetra::Map<>> mapNodesWO_contact = rcp(new tpetra_map_type(numNodes, myNodesWO2, indexBase, comm)); - - // Create a map of nodes without overlaps. Each node is owned by one and - // only mpi process. - mapNodes = Tpetra::createOneToOne(mapNodesWO_contact); - - // Create a map of the degrees of fredom associated to the nodes of the - // previous map. - const size_t numMyNodes = mapNodes->getNodeNumElements(); - const size_t numMyNodesWO = mapNodesWO->getNodeNumElements(); - Teuchos::ArrayView<const global_ordinal_type> myNodes = mapNodes->getNodeElementList(); - - // ------------------------------------------------------------- // - // Dofs maps - // ------------------------------------------------------------- // - - // Create a map of the degrees of fredom associated to the nodes of the - // previous map. - Array<global_ordinal_type> myDofsWO(numMyNodesWO * numPrimalDPN); - Array<global_ordinal_type> myThermalDofsWO(numMyNodesWO); - Array<global_ordinal_type> myMechanicalDofsWO(numMyNodesWO * 3); - - for (auto i = 0; i < numMyNodesWO; ++i) - { - if (numPrimalDPN == 4) - { - myThermalDofsWO[i] = myNodesWO1[i]; - myDofsWO[i] = myNodesWO1[i]; - - for (auto j = 0; j < 3; ++j) - { - myDofsWO[numMyNodesWO + 3 * i + j] = 3 * myNodesWO1[i] + j + numNodes; - myMechanicalDofsWO[3 * i + j] = 3 * myNodesWO1[i] + j; - } - } - else if (numPrimalDPN == 3) - { - for (auto j = 0; j < 3; ++j) - { - myMechanicalDofsWO[3 * i + j] = 3 * myNodesWO1[i] + j; - myDofsWO[3 * i + j] = 3 * myNodesWO1[i] + j; - } - } - else if (numPrimalDPN == 1) - { - myThermalDofsWO[i] = myNodesWO1[i]; - myDofsWO[i] = myNodesWO1[i]; - } - } - - mapDofsWO = rcp(new tpetra_map_type(numPrimalDOFs, myDofsWO, indexBase, comm)); - if (numPrimalDPN == 4 || numPrimalDPN == 1) - thermoMapWO = rcp(new tpetra_map_type(numThermalDOFs, myThermalDofsWO, indexBase, comm)); - if (numPrimalDPN == 4 || numPrimalDPN == 3) - mechaMapWO = rcp(new tpetra_map_type(numMechanicalDOFs, myMechanicalDofsWO, indexBase, comm)); - - Array<global_ordinal_type> myDofs(numMyNodes * numPrimalDPN); - Array<global_ordinal_type> myThermalDofs(numMyNodes); - Array<global_ordinal_type> myMechanicalDofs(numMyNodes * 3); - Array<global_ordinal_type> myThermomechanicalDofs(numMyNodes * numPrimalDPN); - - for (auto i = 0; i < numMyNodes; ++i) - { - if (numPrimalDPN == 4) - { - myThermalDofs[i] = myNodes[i]; - myDofs[i] = myNodes[i]; - - for (auto j = 0; j < 3; ++j) - { - myMechanicalDofs[3 * i + j] = 3 * myNodes[i] + j; - myDofs[numMyNodes + 3 * i + j] = 3 * myNodes[i] + j + numNodes; - } - } - else if (numPrimalDPN == 3) - { - for (auto j = 0; j < 3; ++j) - { - myMechanicalDofs[3 * i + j] = 3 * myNodes[i] + j; - myDofs[3 * i + j] = 3 * myNodes[i] + j; - } - } - else if (numPrimalDPN == 1) - { - myThermalDofs[i] = myNodes[i]; - myDofs[i] = myNodes[i]; - } - } - - mapDofs = rcp(new tpetra_map_type(numPrimalDOFs, myDofs, indexBase, comm)); - if (numPrimalDPN == 4 || numPrimalDPN == 1) - thermoMap = rcp(new tpetra_map_type(numThermalDOFs, myThermalDofs, indexBase, comm)); - if (numPrimalDPN == 4 || numPrimalDPN == 3) - mechaMap = rcp(new tpetra_map_type(numMechanicalDOFs, myMechanicalDofs, indexBase, comm)); - - if (numPrimalDPN == 4) - { - thermoMap = rcp(new tpetra_map_type(numThermalDOFs, myThermalDofs, indexBase, comm)); - mechaMap = rcp(new tpetra_map_type(numMechanicalDOFs, myMechanicalDofs, indexBase, comm)); - - thermomecFullmap = rcp(new tpetra_map_type(numPrimalDOFs, myThermomechanicalDofs, indexBase, comm)); - RCP<xpetra_map_type> xthermomecFullmap = rcp(new xpetra_tmap_type(thermomecFullmap)); - std::vector<RCP<const xpetra_map_type>> xsubmaps = {rcp(new xpetra_tmap_type(thermoMap)), - rcp(new xpetra_tmap_type(mechaMap))}; - - thermomecBlockedMap = rcp(new xpetra_bmap_type(xthermomecFullmap, xsubmaps, true)); - } - else if (numPrimalDPN == 3) - { - mechaMap = rcp(new tpetra_map_type(numMechanicalDOFs, myMechanicalDofs, indexBase, comm)); - - thermomecFullmap = rcp(new tpetra_map_type(numPrimalDOFs, myThermomechanicalDofs, indexBase, comm)); - RCP<xpetra_map_type> xthermomecFullmap = rcp(new xpetra_tmap_type(thermomecFullmap)); - std::vector<RCP<const xpetra_map_type>> xsubmaps = {rcp(new xpetra_tmap_type(mechaMap))}; - - thermomecBlockedMap = rcp(new xpetra_bmap_type(xthermomecFullmap, xsubmaps, true)); - } - else - { - thermoMap = rcp(new tpetra_map_type(numThermalDOFs, myThermalDofs, indexBase, comm)); - - thermomecFullmap = rcp(new tpetra_map_type(numPrimalDOFs, myThermomechanicalDofs, indexBase, comm)); - RCP<xpetra_map_type> xthermomecFullmap = rcp(new xpetra_tmap_type(thermomecFullmap)); - std::vector<RCP<const xpetra_map_type>> xsubmaps = {rcp(new xpetra_tmap_type(thermoMap))}; - - thermomecBlockedMap = rcp(new xpetra_bmap_type(xthermomecFullmap, xsubmaps, true)); - } - - // Construct a Map that puts all the equations on processor 0 (for outputs). - const size_t numLclIndices = (myRank == 0) ? numPrimalDOFs : 0; - - mapOutput = rcp(new tpetra_map_type(numPrimalDOFs, numLclIndices, indexBase, comm)); -} \ No newline at end of file diff --git a/katoptron/src/Map.h b/katoptron/src/Map.h deleted file mode 100644 index 39e95abe..00000000 --- a/katoptron/src/Map.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef KATOPTRON_MAP_H -#define KATOPTRON_MAP_H - -#include "katoptron.h" - -#include <Tpetra_Map.hpp> -#include <Tpetra_Vector.hpp> -#include <Teuchos_RCP.hpp> - -#include <Xpetra_Map.hpp> -#include <Xpetra_TpetraMap.hpp> -#include <Xpetra_BlockedMap.hpp> - -namespace katoptron -{ - -/** - * @brief Class which includes all the Trilinos maps (Tpetra maps and Xpetra maps) used - * in the simulation. - */ -class Map -{ -public: - // - // Convenience typedefs - // - typedef int local_ordinal_type; - typedef int global_ordinal_type; - typedef KokkosClassic::DefaultNode::DefaultNodeType node_type; - typedef Tpetra::Map<local_ordinal_type, global_ordinal_type, node_type> tpetra_map_type; - typedef Xpetra::Map<local_ordinal_type, global_ordinal_type, node_type> xpetra_map_type; - typedef Xpetra::TpetraMap<local_ordinal_type, global_ordinal_type, node_type> xpetra_tmap_type; - typedef Xpetra::BlockedMap<local_ordinal_type, global_ordinal_type, node_type> xpetra_bmap_type; - - Teuchos::RCP<const tpetra_map_type> mapNodesWO; - Teuchos::RCP<const tpetra_map_type> mapNodes; - Teuchos::RCP<const tpetra_map_type> mapElems; - Teuchos::RCP<const tpetra_map_type> mapDofsWO; - Teuchos::RCP<const tpetra_map_type> mapDofs; - Teuchos::RCP<const tpetra_map_type> mapOutput; - Teuchos::RCP<const tpetra_map_type> mapLagrangeDofs; - Teuchos::RCP<const tpetra_map_type> fullmap; - Teuchos::RCP<const tpetra_map_type> fullmapWO; - Teuchos::RCP<const tpetra_map_type> fullmapOutput; - - Teuchos::RCP<const tpetra_map_type> thermoMap; - Teuchos::RCP<const tpetra_map_type> mechaMap; - - Teuchos::RCP<const tpetra_map_type> thermoMapWO; - Teuchos::RCP<const tpetra_map_type> mechaMapWO; - - Teuchos::RCP<const tpetra_map_type> thermomecFullmap; - Teuchos::RCP<const tpetra_map_type> thermomecFullmapWO; - - Teuchos::RCP<const xpetra_bmap_type> thermomecBlockedMap; - - Teuchos::RCP<const xpetra_bmap_type> blockedMap; - - std::map<int, int> lm_to_dof; //to change - std::map<int, int> lm_to_dof_global; //to change - std::map<int, int> lagrange_to_dof; - std::map<int, int> dof_to_lm; - - const global_ordinal_type indexBase = 0; - size_t numPrimalDPN; - size_t numDualDPN = 1; - - Map(Problem &pbl, size_t _numPrimalDPN); -}; - -}; // namespace katoptron - -#endif //KATOPTRON_MAP_H diff --git a/katoptron/src/Material.h b/katoptron/src/Material.h deleted file mode 100644 index af6b2b18..00000000 --- a/katoptron/src/Material.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef KATOPTRON_MATERIAL_H -#define KATOPTRON_MATERIAL_H - -#include "katoptron.h" - -#include "Map.h" -#include "wProblem.h" -#include "wTag.h" -#include "wMshData.h" -#include "wElement.h" -#include "wNode.h" -#include "wMedium.h" - -#include <Tpetra_Map.hpp> -#include <Tpetra_Vector.hpp> -#include <Teuchos_RCP.hpp> -#include <Kokkos_ViewFactory.hpp> - -namespace katoptron -{ - -/** - * @brief Class which includes all constitutive values of a given material. - */ -template <typename scalar> -class Material -{ -private: - scalar E; - scalar nu; - scalar k; - scalar beta; - -public: - Material(scalar _E, scalar _nu, scalar _k, scalar _beta); - - /** - * @brief Return \f$E\f$ - */ - inline scalar getE() { return E; } - - /** - * @brief Return \f$\nu\f$ - */ - inline scalar getNu() { return nu; } - - /** - * @brief Return \f$k\f$ - */ - inline scalar getK() { return k; } - - /** - * @brief Return \f$\beta\f$ - */ - inline scalar getBeta() { return beta; } -}; - -/** - * @brief Material constructor - * - * This constructor creates a new katoptron::Material which store the constitutive parameters. - * - * Arguments: - * <ul> - * <li> _E: the Young modulus \f$E\f$, - * <li> _nu: the Poisson coefficient \f$\nu\f$, - * <li> _k: the heat conductivity \f$k\f$, - * <li> _beta: the coefficient of thermal expansion \f$\beta\f$. - * </ul> - */ -template <typename scalar> -Material<scalar>::Material(scalar _E, scalar _nu, scalar _k, scalar _beta) : E(_E), nu(_nu), k(_k), beta(_beta) -{ -} -}; // namespace katoptron - -#endif //KATOPTRON_MATERIAL_H diff --git a/katoptron/src/MaterialsList.h b/katoptron/src/MaterialsList.h deleted file mode 100644 index 4ca10108..00000000 --- a/katoptron/src/MaterialsList.h +++ /dev/null @@ -1,170 +0,0 @@ -#ifndef KATOPTRON_MATERIALSLIST_H -#define KATOPTRON_MATERIALSLIST_H - -#include "Stokhos_Sacado_Kokkos_MP_Vector.hpp" - -#include "katoptron.h" - -#include "Map.h" -#include "wProblem.h" -#include "wTag.h" -#include "wMshData.h" -#include "wElement.h" -#include "wNode.h" -#include "wMedium.h" - -#include "Material.h" - -#include <Kokkos_Core.hpp> -//#include "Sacado.hpp" - -#include <Tpetra_Map.hpp> -#include <Tpetra_Vector.hpp> -#include <Teuchos_RCP.hpp> -#include <Kokkos_ViewFactory.hpp> -#include <vector> - -#include "EnsembleTraits.h" - -namespace katoptron -{ - -/** - * @brief Class which stores the list of the used materials. - */ -template <typename scalar> -class MaterialsList -{ -private: - Kokkos::View<scalar ***, Kokkos::LayoutRight> materials; - - Map::local_ordinal_type materials_number; - -public: - Map::local_ordinal_type materials_T; - Map::local_ordinal_type materials_E; - Map::local_ordinal_type materials_nu; - Map::local_ordinal_type materials_k; - Map::local_ordinal_type materials_beta; - - MaterialsList(Problem &pbl, Teuchos::RCP<Map> map); - - Material<scalar> getMaterial(int current_material, int i_thread); -}; - -/** - * @brief MaterialsList constructor - * - * This constructor allocates 1 Kokkos::View which stores all the constitutive parameters of each material. - * - * Arguments: - * <ul> - * <li> pbl: A Problem object, - * <li> map: an RCP to a Map object.. - * </ul> - */ -template <typename scalar> -MaterialsList<scalar>::MaterialsList(Problem &pbl, Teuchos::RCP<Map> map) -{ - materials_number = pbl.media.size(); - - materials_T = 0; - materials_E = 1; - materials_nu = 2; - materials_k = 3; - materials_beta = 4; - - typedef EnsembleTraits<scalar> ET; - const int ensemble_size = ET::size; - - materials = Kokkos::View<scalar ***, Kokkos::LayoutRight>("R", materials_number, 1, 5); - for (auto i = 0; i < materials_number; ++i) - { - materials(i, 0, materials_T) = (scalar)0; // !!! needed to be changed latter on !!! - for (int j = 0; j < ensemble_size; ++j) - { - ET::coeff(materials(i, 0, materials_E), j) = (double)pbl.media[i]->E_vector[j]; - ET::coeff(materials(i, 0, materials_nu), j) = (double)pbl.media[i]->nu_vector[j]; - ET::coeff(materials(i, 0, materials_k), j) = (double)pbl.media[i]->k_vector[j]; - ET::coeff(materials(i, 0, materials_beta), j) = (double)pbl.media[i]->beta_vector[j]; - } - materials(i, 0, materials_k) = (scalar)pbl.media[i]->k; - materials(i, 0, materials_beta) = (scalar)pbl.media[i]->beta; - } -} - -/** - * @brief Return a Material - * - * Arguments: - * <ul> - * <li> current_material: current material ID, - * <li> i_thread: thread ID. - * </ul> - */ -template <typename scalar> -Material<scalar> MaterialsList<scalar>::getMaterial(int current_material, int i_thread) -{ - scalar E; - scalar nu; - scalar k; - scalar beta; - - size_t materials_T = 0; - - typedef EnsembleTraits<scalar> ET; - const int ensemble_size = ET::size; - - for (int j = 0; j < ensemble_size; ++j) - { - typename ET::value_type Tj = 0.; - - size_t index_0 = 0; - size_t index_1 = materials.extent(1) - 1; - - if (Tj <= ET::coeff(materials(current_material, index_0, materials_T), j)) - { - ET::coeff(E, j) = ET::coeff(materials(current_material, index_0, 1), j); - ET::coeff(nu, j) = ET::coeff(materials(current_material, index_0, 2), j); - ET::coeff(k, j) = ET::coeff(materials(current_material, index_0, 3), j); - ET::coeff(beta, j) = ET::coeff(materials(current_material, index_0, 4), j); - } - else if (Tj > ET::coeff(materials(current_material, index_1, materials_T), j)) - { - ET::coeff(E, j) = ET::coeff(materials(current_material, index_1, 1), j); - ET::coeff(nu, j) = ET::coeff(materials(current_material, index_1, 2), j); - ET::coeff(k, j) = ET::coeff(materials(current_material, index_1, 3), j); - ET::coeff(beta, j) = ET::coeff(materials(current_material, index_1, 4), j); - } - else - { - while (index_1 != index_0 + 1) - { - size_t index_c = index_0 + (index_1 - index_0) / 2; - - if (Tj == ET::coeff(materials(current_material, index_c, materials_T), j)) - { - index_1 = index_c; - index_0 = index_1 - 1; - } - else if (Tj < ET::coeff(materials(current_material, index_c, materials_T), j)) - index_1 = index_c; - else - index_0 = index_c; - } - - double coeff = (Tj - ET::coeff(materials(current_material, index_0, materials_T), j)) / (ET::coeff(materials(current_material, index_1, materials_T), j) - ET::coeff(materials(current_material, index_0, materials_T), j)); - - ET::coeff(E, j) = ET::coeff(materials(current_material, index_0, 1), j) + coeff * (ET::coeff(materials(current_material, index_1, 1), j) - ET::coeff(materials(current_material, index_0, 1), j)); - ET::coeff(nu, j) = ET::coeff(materials(current_material, index_0, 2), j) + coeff * (ET::coeff(materials(current_material, index_1, 2), j) - ET::coeff(materials(current_material, index_0, 2), j)); - ET::coeff(k, j) = ET::coeff(materials(current_material, index_0, 3), j) + coeff * (ET::coeff(materials(current_material, index_1, 3), j) - ET::coeff(materials(current_material, index_0, 3), j)); - ET::coeff(beta, j) = ET::coeff(materials(current_material, index_0, 4), j) + coeff * (ET::coeff(materials(current_material, index_1, 4), j) - ET::coeff(materials(current_material, index_0, 4), j)); - } - } - - Material<scalar> material(E, nu, k, beta); - return material; -} -}; // namespace katoptron - -#endif //KATOPTRON_MATERIALSLIST_H diff --git a/katoptron/src/Matrices.h b/katoptron/src/Matrices.h deleted file mode 100644 index be293660..00000000 --- a/katoptron/src/Matrices.h +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef KATOPTRON_MATRICES_H -#define KATOPTRON_MATRICES_H - -#include "katoptron.h" - -#include "Map.h" -#include "Graph.h" - -#include <Tpetra_Map.hpp> -#include <Tpetra_Vector.hpp> -#include <Tpetra_CrsGraph.hpp> -#include <Tpetra_CrsMatrix.hpp> -#include <Teuchos_RCP.hpp> - -#include <Xpetra_BlockedMap.hpp> -#include <Xpetra_BlockedCrsMatrix.hpp> -#include <Stokhos_MueLu_MP_Vector.hpp> - -namespace katoptron -{ - -/** - * @brief Class which includes all the Trilinos matrices (Tpetra matrices and Xpetra matrices) used - * in the simulation. - * - * In the case of the saddle point matrix arising from the Mortar FEM, the block matrix is stored as follows: - * \f[ - * \begin{bmatrix} \boldsymbol{A} & \boldsymbol{B}_1 \\ \boldsymbol{B}_2 & \boldsymbol{C} \end{bmatrix}. - * \f] - */ -template <typename scalar> -class Matrices -{ - /* - 2x2 block matrix: - ---------------- - - *-----*-----* - | A | B_1 | - *-----*-----* - | B_2 | C | - *-----*-----* - - B includes the values of B_2 if the contact is fully closed. - B_T includes the values of B_1 if the contact is fully closed. - B_G includes the values of B with the M matrix included regardless if we have a Signorini problem or not. - */ -public: - // - // Convenience typedefs - // - typedef Map::local_ordinal_type local_ordinal_type; - typedef Map::global_ordinal_type global_ordinal_type; - typedef Map::node_type node_type; - typedef Map::tpetra_map_type tpetra_map_type; - typedef Map::xpetra_bmap_type xpetra_bmap_type; - typedef Tpetra::CrsGraph<local_ordinal_type, global_ordinal_type, node_type> tpetra_graph_type; - typedef Tpetra::CrsMatrix<scalar, local_ordinal_type, global_ordinal_type, node_type> tpetra_crs_type; - - typedef Xpetra::Matrix<scalar, local_ordinal_type, global_ordinal_type, node_type> xpetra_mat_type; - typedef Xpetra::CrsMatrix<scalar, local_ordinal_type, global_ordinal_type, node_type> xpetra_crs_type; - typedef Xpetra::CrsMatrixWrap<scalar, local_ordinal_type, global_ordinal_type, node_type> xpetra_wcrs_type; - typedef Xpetra::BlockedCrsMatrix<scalar, local_ordinal_type, global_ordinal_type, node_type> xpetra_bcrs_type; - typedef Xpetra::TpetraCrsMatrix<scalar, local_ordinal_type, global_ordinal_type, node_type> xpetra_tcrs_type; - - Teuchos::RCP<tpetra_crs_type> K; - Teuchos::RCP<tpetra_crs_type> S; - Teuchos::RCP<tpetra_crs_type> L; - Teuchos::RCP<tpetra_crs_type> B; - Teuchos::RCP<tpetra_crs_type> B_T; - Teuchos::RCP<tpetra_crs_type> B_1; - Teuchos::RCP<tpetra_crs_type> B_2; - Teuchos::RCP<tpetra_crs_type> B_G; - Teuchos::RCP<tpetra_crs_type> C; - Teuchos::RCP<tpetra_crs_type> Cb; - - Teuchos::RCP<xpetra_crs_type> xA; - Teuchos::RCP<xpetra_crs_type> xB; - Teuchos::RCP<xpetra_crs_type> xB_T; - Teuchos::RCP<xpetra_crs_type> xC; - - Teuchos::RCP<xpetra_wcrs_type> xwA; - Teuchos::RCP<xpetra_wcrs_type> xwB; - Teuchos::RCP<xpetra_wcrs_type> xwB_T; - Teuchos::RCP<xpetra_wcrs_type> xwC; - - Teuchos::RCP<xpetra_bcrs_type> blockedMatrix; - - Teuchos::RCP<xpetra_mat_type> A; - - Matrices(Teuchos::RCP<Graph> graph); -}; - -/** - * @brief Matrices constructor - * - * This constructor allocates the memory for the matrix \f$\boldsymbol{A}\f$. - * The other matrices and the filling of the entries are done later. - * - * Argument: - * <ul> - * <li> graph: an RCP to a Graph object. - * </ul> - */ -template <typename scalar> -Matrices<scalar>::Matrices(Teuchos::RCP<Graph> graph) -{ - if (graph->K != Teuchos::null) - { - K = Teuchos::rcp(new tpetra_crs_type(graph->K)); - K->fillComplete(); - } - if (graph->S != Teuchos::null) - { - S = Teuchos::rcp(new tpetra_crs_type(graph->S)); - S->fillComplete(graph->S->getDomainMap(), graph->S->getRangeMap()); - } - if (graph->L != Teuchos::null) - { - L = Teuchos::rcp(new tpetra_crs_type(graph->L)); - L->fillComplete(); - } -} -}; // namespace katoptron - -#endif //KATOPTRON_MATRICES_H diff --git a/katoptron/src/Mortar.cpp b/katoptron/src/Mortar.cpp deleted file mode 100644 index ae171421..00000000 --- a/katoptron/src/Mortar.cpp +++ /dev/null @@ -1,1059 +0,0 @@ -#include "Mortar.h" -//#include "wElement.h" - -#include <MatrixMarket_Tpetra.hpp> - -#include "Epetra_MpiComm.h" -#include "Epetra_SerialComm.h" -#include "Teuchos_ParameterList.hpp" - -// MOERTEL headers -#include "mrtr_manager.H" -#include "mrtr_segment_bilinearquad.H" -#include "mrtr_segment_bilineartri.H" - -/** - * @brief Compute the Mortar matrices using Moertel and returns a Tpetra CrsMatrix - * with double scalar type. - */ -Teuchos::RCP<Tpetra::CrsMatrix<>> compute_B(Teuchos::RCP<katoptron::ElementsList> elementsList, - Teuchos::RCP<katoptron::NodesList> nodesList, - Teuchos::RCP<katoptron::ContactsList> contactsList, - Teuchos::RCP<katoptron::Map> map, MPI_Comm comm, bool SignoriniCheck) -{ - Epetra_MpiComm Comm(comm); - Teuchos::RCP<const Teuchos::Comm<int>> Tcomm = Teuchos::rcp(new Teuchos::MpiComm<int>(comm)); - - typedef katoptron::Map::local_ordinal_type local_ordinal_type; - typedef katoptron::Map::global_ordinal_type global_ordinal_type; - - typedef Tpetra::CrsMatrix<> crs_matrix_type; - - const local_ordinal_type numMyContacts = contactsList->getContactNumber(); - - // ------------------------------------------------------------- // - // create numMyContacts empty MOERTEL::Interface instances - // ------------------------------------------------------------- // - int printlevel = 0; - std::vector<Teuchos::RCP<MOERTEL::Interface>> interfaces(numMyContacts); - for (auto i = 0; i < numMyContacts; ++i) - interfaces[i] = Teuchos::rcp(new MOERTEL::Interface(i, false, Comm, printlevel)); - - // ------------------------------------------------------------- // - // Add nodes on both sides of interface to interfaces - // loop all nodes in the maps add them - // to the interface with unique ids - // ------------------------------------------------------------- // - for (auto i = 0; i < numMyContacts; ++i) - { - const local_ordinal_type numMySlaveNodes = contactsList->getSlaveNodesSize(i); - - for (auto j = 0; j < numMySlaveNodes; ++j) - { - // get unique node id - auto global_nodeid = contactsList->getSlaveNode(i, j); - - if (map->mapNodes->isNodeGlobalElement(global_nodeid)) - { - // get node coordinates - auto local_nodeid = map->mapNodesWO->getLocalElement(global_nodeid); - double coord[3]; - for (auto k = 0; k < 3; ++k) - coord[k] = nodesList->nodes(local_nodeid, k); - - // create a moertel node - MOERTEL::Node node(global_nodeid, coord, 1, &global_nodeid, contactsList->isASlaveDirichletNode(i, global_nodeid), printlevel); - // add node to interface i on side j - interfaces[i]->AddNode(node, 0); - } - } - - const local_ordinal_type numMyMasterNodes = contactsList->getMasterNodesSize(i); - - for (auto j = 0; j < numMyMasterNodes; ++j) - { - // get unique node id - auto global_nodeid = contactsList->getMasterNode(i, j); - - if (map->mapNodes->isNodeGlobalElement(global_nodeid)) - { - // get node coordinates - auto local_nodeid = map->mapNodesWO->getLocalElement(global_nodeid); - double coord[3]; - for (auto k = 0; k < 3; ++k) - coord[k] = nodesList->nodes(local_nodeid, k); - - // create a moertel node - MOERTEL::Node node(global_nodeid, coord, 1, &global_nodeid, false, printlevel); - // add node to interface i on side j - interfaces[i]->AddNode(node, 1); - } - } - } - - // ------------------------------------------------------------- // - // add segments on both sides of the interface to the interface - // ------------------------------------------------------------- // - - auto i_index = 0; - - for (auto i = 0; i < numMyContacts; ++i) - { - const local_ordinal_type numMySlaveElems = contactsList->getSlaveElementsSize(i); - - for (auto j = 0; j < numMySlaveElems; ++j) - { - auto elem_local_index = contactsList->getSlaveElement(i, j); - - if (elementsList->getElementSize(elem_local_index) == 4) - { - i_index = map->mapElems->getGlobalElement(elem_local_index); - - global_ordinal_type nodeids[4]; - for (auto k = 0; k < 4; ++k) - nodeids[k] = - map->mapNodesWO->getGlobalElement(elementsList->getElementNode(elem_local_index, k)); - - MOERTEL::Segment_BiLinearQuad segment(i_index, 4, nodeids, printlevel); - interfaces[i]->AddSegment(segment, 0); - } - else if (elementsList->getElementSize(elem_local_index) == 3) - { - i_index = map->mapElems->getGlobalElement(elem_local_index); - - global_ordinal_type nodeids[3]; - for (auto k = 0; k < 3; ++k) - nodeids[k] = - map->mapNodesWO->getGlobalElement(elementsList->getElementNode(elem_local_index, k)); - MOERTEL::Segment_BiLinearTri segment(i_index++, 3, nodeids, printlevel); - interfaces[i]->AddSegment(segment, 0); - } - } - - const local_ordinal_type numMyMasterElems = contactsList->getMasterElementsSize(i); - - for (auto j = 0; j < numMyMasterElems; ++j) - { - auto elem_local_index = contactsList->getMasterElement(i, j); - - if (elementsList->getElementSize(elem_local_index) == 4) - { - i_index = map->mapElems->getGlobalElement(elem_local_index); - - global_ordinal_type nodeids[4]; - for (auto k = 0; k < 4; ++k) - nodeids[k] = - map->mapNodesWO->getGlobalElement(elementsList->getElementNode(elem_local_index, k)); - - MOERTEL::Segment_BiLinearQuad segment(i_index, 4, nodeids, printlevel); - interfaces[i]->AddSegment(segment, 1); - } - else if (elementsList->getElementSize(elem_local_index) == 3) - { - i_index = map->mapElems->getGlobalElement(elem_local_index); - - global_ordinal_type nodeids[3]; - for (auto k = 0; k < 3; ++k) - nodeids[k] = - map->mapNodesWO->getGlobalElement(elementsList->getElementNode(elem_local_index, k)); - MOERTEL::Segment_BiLinearTri segment(i_index++, 3, nodeids, printlevel); - interfaces[i]->AddSegment(segment, 1); - } - } - } - - // ------------------------------------------------------------- // - // choose the mortar side of the interface (0 or 1) - // - // ------------------------------------------------------------- // - for (auto i = 0; i < numMyContacts; ++i) - interfaces[i]->SetMortarSide(1); - - // ------------------------------------------------------------- // - // As we do not know the mortar side yet (we decided to le the - // package choose it), we can not set a dual trace function (mortar space) - // as we don't know the side to set it to - // so we just give orders for the function type - // ------------------------------------------------------------- // - for (auto i = 0; i < numMyContacts; ++i) - { - if (contactsList->getSlaveElementsSize(i) >= 1) - { - if (elementsList->getElementSize(contactsList->getSlaveElement(i, 0)) == 4) - { - if (contactsList->isStandardShapeFunction(i)) - { - interfaces[i]->SetFunctionTypes(MOERTEL::Function::func_BiLinearQuad, - MOERTEL::Function::func_BiLinearQuad); - } - else - { - interfaces[i]->SetFunctionTypes(MOERTEL::Function::func_BiLinearQuad, - MOERTEL::Function::func_DualBiLinearQuad); - } - } - else if (elementsList->getElementSize(contactsList->getSlaveElement(i, 0)) == 3) - { - if (contactsList->isStandardShapeFunction(i)) - { - interfaces[i]->SetFunctionTypes(MOERTEL::Function::func_LinearTri, - MOERTEL::Function::func_LinearTri); - } - else - { - interfaces[i]->SetFunctionTypes(MOERTEL::Function::func_LinearTri, - MOERTEL::Function::func_DualLinearTri); - } - } - } - - else if (contactsList->getMasterElementsSize(i) >= 1) - { - if (elementsList->getElementSize(contactsList->getMasterElement(i, 0)) == 4) - { - if (contactsList->isStandardShapeFunction(i)) - { - interfaces[i]->SetFunctionTypes(MOERTEL::Function::func_BiLinearQuad, - MOERTEL::Function::func_BiLinearQuad); - } - else - { - interfaces[i]->SetFunctionTypes(MOERTEL::Function::func_BiLinearQuad, - MOERTEL::Function::func_DualBiLinearQuad); - } - } - else if (elementsList->getElementSize(contactsList->getMasterElement(i, 0)) == 3) - { - if (contactsList->isStandardShapeFunction(i)) - { - interfaces[i]->SetFunctionTypes(MOERTEL::Function::func_LinearTri, - MOERTEL::Function::func_LinearTri); - } - else - { - interfaces[i]->SetFunctionTypes(MOERTEL::Function::func_LinearTri, - MOERTEL::Function::func_DualLinearTri); - } - } - } - } - // ------------------------------------------------------------- // - // complete the interfaces - // ------------------------------------------------------------- // - for (auto i = 0; i < numMyContacts; ++i) - if (!interfaces[i]->Complete()) - { - exit(EXIT_FAILURE); - } - // ------------------------------------------------------------- // - // create an empty MOERTEL::Manager for 3D problems - // It organizes everything from integration to solution - // ------------------------------------------------------------- // - MOERTEL::Manager manager(Comm, MOERTEL::Manager::manager_3D, printlevel); - - // ------------------------------------------------------------- // - // Add the interfaces to the manager - // ------------------------------------------------------------- // - for (auto i = 0; i < numMyContacts; ++i) - manager.AddInterface(*(interfaces[i])); - - // ------------------------------------------------------------- // - // for mortar integration, the mortar manager needs to know about - // the rowmap of the original (uncoupled) problem because it will - // create coupling matrices D and M matching that rowmap - // ------------------------------------------------------------- // - Teuchos::ArrayView<const global_ordinal_type> myNodes = map->mapNodes->getNodeElementList(); - - int numMyNodes = map->mapNodes->getNodeNumElements(); - int numNodes = map->mapNodes->getGlobalNumElements(); - - int myNodesArray[numMyNodes]; - - for (auto i = 0; i < numMyNodes; ++i) - myNodesArray[i] = (int)myNodes[i]; - - Epetra_Map map00((int)numNodes, (int)numMyNodes, myNodesArray, (int)map->mapNodes->getIndexBase(), Comm); - manager.SetProblemMap(&map00); - - // ============================================================= // - // choose integration parameters - // ============================================================= // - Teuchos::ParameterList &moertelparams = manager.Default_Parameters(); - // this does affect this 3D case only - moertelparams.set("exact values at gauss points", true); - // 1D interface possible values are 1,2,3,4,5,6,7,8,10 (2 recommended with linear shape functions) - moertelparams.set("number gaussian points 1D", 2); - // 2D interface possible values are 3,6,12,13,16,19,27 (12 recommended with linear functions) - moertelparams.set("number gaussian points 2D", 12); - - // ============================================================= // - // Here we are done with the construction phase of the interface - // so we can integrate the mortar integrals - // (Note we have not yet evaluated the PDE at all!) - // ============================================================= // - - bool do_integrate = true; - int n_integration = 0; - int n_integration_max = 10; - - while (do_integrate) - { - try - { - do_integrate = false; - ++n_integration; - manager.Mortar_Integrate(); - } - catch (...) - { - do_integrate = true; - } - - if (n_integration >= n_integration_max) - break; - } - - if (n_integration != 1) - std::cout << "Has integrate " << n_integration << " times" << std::endl; - - const Epetra_CrsMatrix *D = manager.D(); - const Epetra_CrsMatrix *M = manager.M(); - - std::map<int, int> lm_to_dof = manager.lm_to_dof(); - - const size_t numDPN = map->numPrimalDPN; - const size_t numMDPN = 3; - const bool isThermo = (numDPN == 4); - const size_t numMechanicalLagrangeMultipliers = (D->NumGlobalCols() - numNodes); - - size_t numLMPN; - if (contactsList->hasAtLeastOneSticking() && isThermo) - numLMPN = 4; - else if (contactsList->hasAtLeastOneSticking()) - numLMPN = 3; - else if (isThermo) - numLMPN = 2; - else - numLMPN = 1; - - map->numDualDPN = numLMPN; - - const size_t numTotalLagrangeMultipliers = numLMPN * numMechanicalLagrangeMultipliers; - - int indexBase = 0; - - // --------------- - - { - Teuchos::ArrayView<const global_ordinal_type> myNodes = map->mapNodes->getNodeElementList(); - - std::vector<global_ordinal_type> myLagrangeDofs = {}; - - size_t numMyRows = D->NumMyRows(); - for (auto i = 0; i < numMyRows; ++i) - { - size_t global_id = D->GRID(i); - if (global_id < numNodes) - continue; - size_t lagrange_id = global_id - numNodes; - for (auto j = 0; j < numLMPN; ++j) - myLagrangeDofs.push_back(lagrange_id * numLMPN + j); - } - - map->mapLagrangeDofs = rcp(new Tpetra::Map<>(numTotalLagrangeMultipliers, myLagrangeDofs, indexBase, Tcomm)); - } - - // --------------- - for (auto i = lm_to_dof.begin(); i != lm_to_dof.end(); ++i) - map->lm_to_dof_global[i->first - numNodes] = i->second; - - for (auto i = lm_to_dof.begin(); i != lm_to_dof.end(); ++i) - if (map->mapNodes->isNodeGlobalElement(i->second)) - { - map->lm_to_dof[i->first - numNodes] = i->second; - } - - for (auto i = map->lm_to_dof.begin(); i != map->lm_to_dof.end(); ++i) - map->lagrange_to_dof[i->first - numNodes] = (i->second) * map->numPrimalDPN; - - // As lm_to_dof is one to one, we can create dof_to_lm as follows - for (auto i = map->lm_to_dof.begin(); i != map->lm_to_dof.end(); ++i) - map->dof_to_lm[i->second] = i->first; - - // --------------- - - // Compute the outward normal - typedef Tpetra::MultiVector<double, local_ordinal_type, global_ordinal_type> double_multivector_type; - - Teuchos::RCP<double_multivector_type> normalWO = Teuchos::rcp(new double_multivector_type(map->mapNodesWO, 3 * numMyContacts, true)); - Teuchos::RCP<double_multivector_type> normalSUM = Teuchos::rcp(new double_multivector_type(map->mapNodes, 3 * numMyContacts, true)); - - std::vector<global_ordinal_type> myNodes2 = {}; - - for (auto i = 0; i < numNodes; ++i) - myNodes2.push_back(i); - - Teuchos::RCP<Tpetra::Map<>> fullNodeMap = rcp(new Tpetra::Map<>(numNodes, myNodes2, indexBase, Tcomm)); - Teuchos::RCP<double_multivector_type> normal = Teuchos::rcp(new double_multivector_type(fullNodeMap, 3 * numMyContacts, true)); - - { - for (auto i = 0; i < numMyContacts; ++i) - { - const local_ordinal_type numMySlaveElems = contactsList->getSlaveElementsSize(i); - - for (auto j = 0; j < numMySlaveElems; ++j) - { - auto elem_local_index = contactsList->getSlaveElement(i, j); - - if (elementsList->getElementSize(elem_local_index) == 4) - { - i_index = map->mapElems->getGlobalElement(elem_local_index); - - global_ordinal_type node_id[4]; - double coordinates[4 * 3]; - for (auto k = 0; k < 4; ++k) - { - node_id[k] = map->mapNodesWO->getGlobalElement(elementsList->getElementNode(elem_local_index, k)); - auto local_nodeid = map->mapNodesWO->getLocalElement(node_id[k]); - - for (auto l = 0; l < 3; ++l) - coordinates[k * 3 + l] = nodesList->nodes(local_nodeid, l); - } - - double vec1[3]; - double vec2[3]; - double vec3[3]; - double current_normal[3]; - double current_normal2[3]; - double norm1; - double norm2; - double current_area; - - vec1[0] = coordinates[3] - coordinates[0]; - vec1[1] = coordinates[4] - coordinates[1]; - vec1[2] = coordinates[5] - coordinates[2]; - - vec2[0] = coordinates[6] - coordinates[0]; - vec2[1] = coordinates[7] - coordinates[1]; - vec2[2] = coordinates[8] - coordinates[2]; - - vec3[0] = coordinates[9] - coordinates[0]; - vec3[1] = coordinates[10] - coordinates[1]; - vec3[2] = coordinates[11] - coordinates[2]; - - current_normal[0] = vec1[1] * vec2[2] - vec1[2] * vec2[1]; - current_normal[1] = vec1[2] * vec2[0] - vec1[0] * vec2[2]; - current_normal[2] = vec1[0] * vec2[1] - vec1[1] * vec2[0]; - - current_normal2[0] = vec2[1] * vec3[2] - vec2[2] * vec3[1]; - current_normal2[1] = vec2[2] * vec3[0] - vec2[0] * vec3[2]; - current_normal2[2] = vec2[0] * vec3[1] - vec2[1] * vec3[0]; - - norm1 = sqrt(pow(current_normal[0], 2) + pow(current_normal[1], 2) + pow(current_normal[2], 2)); - norm2 = sqrt(pow(current_normal2[0], 2) + pow(current_normal2[1], 2) + pow(current_normal2[2], 2)); - - if (norm1 > 0.) - { - current_normal[0] = current_normal[0] / norm1; - current_normal[1] = current_normal[1] / norm1; - current_normal[2] = current_normal[2] / norm1; - - for (auto l = 0; l < 3; ++l) - if (abs(current_normal[l]) <= 1e-10) - current_normal[l] = 0.; - } - else - { - current_normal[0] = 0.; - current_normal[1] = 0.; - current_normal[2] = 0.; - } - - current_area = (norm1 + norm2) / 2.; - - for (auto k = 0; k < 4; ++k) - { - auto local_nodeid = map->mapNodesWO->getLocalElement(node_id[k]); - - for (auto l = 0; l < 3; ++l) - normalWO->sumIntoLocalValue(local_nodeid, i * 3 + l, current_area * current_normal[l]); - } - } - else if (elementsList->getElementSize(elem_local_index) == 3) - { - i_index = map->mapElems->getGlobalElement(elem_local_index); - - global_ordinal_type node_id[3]; - double coordinates[3 * 3]; - for (auto k = 0; k < 3; ++k) - { - node_id[k] = map->mapNodesWO->getGlobalElement(elementsList->getElementNode(elem_local_index, k)); - auto local_nodeid = map->mapNodesWO->getLocalElement(node_id[k]); - - for (auto l = 0; l < 3; ++l) - coordinates[k * 3 + l] = nodesList->nodes(local_nodeid, l); - } - - double vec1[3]; - double vec2[3]; - double current_normal[3]; - double norm; - double current_area; - - vec1[0] = coordinates[3] - coordinates[0]; - vec1[1] = coordinates[4] - coordinates[1]; - vec1[2] = coordinates[5] - coordinates[2]; - - vec2[0] = coordinates[6] - coordinates[0]; - vec2[1] = coordinates[7] - coordinates[1]; - vec2[2] = coordinates[8] - coordinates[2]; - - current_normal[0] = vec1[1] * vec2[2] - vec1[2] * vec2[1]; - current_normal[1] = vec1[2] * vec2[0] - vec1[0] * vec2[2]; - current_normal[2] = vec1[0] * vec2[1] - vec1[1] * vec2[0]; - - norm = sqrt(pow(current_normal[0], 2) + pow(current_normal[1], 2) + pow(current_normal[2], 2)); - - current_area = norm / 2.; - - if (norm > 0.) - { - current_normal[0] = current_normal[0] / norm; - current_normal[1] = current_normal[1] / norm; - current_normal[2] = current_normal[2] / norm; - - for (auto l = 0; l < 3; ++l) - if (abs(current_normal[l]) <= 1e-10) - current_normal[l] = 0.; - } - else - { - current_normal[0] = 0.; - current_normal[1] = 0.; - current_normal[2] = 0.; - } - - for (auto k = 0; k < 3; ++k) - { - auto local_nodeid = map->mapNodesWO->getLocalElement(node_id[k]); - - for (auto l = 0; l < 3; ++l) - normalWO->sumIntoLocalValue(local_nodeid, i * 3 + l, current_area * current_normal[l]); - } - } - } - - const local_ordinal_type numMyMasterElems = contactsList->getMasterElementsSize(i); - - for (auto j = 0; j < numMyMasterElems; ++j) - { - auto elem_local_index = contactsList->getMasterElement(i, j); - - if (elementsList->getElementSize(elem_local_index) == 4) - { - i_index = map->mapElems->getGlobalElement(elem_local_index); - - global_ordinal_type node_id[4]; - double coordinates[4 * 3]; - for (auto k = 0; k < 4; ++k) - { - node_id[k] = map->mapNodesWO->getGlobalElement(elementsList->getElementNode(elem_local_index, k)); - auto local_nodeid = map->mapNodesWO->getLocalElement(node_id[k]); - - for (auto l = 0; l < 3; ++l) - coordinates[k * 3 + l] = nodesList->nodes(local_nodeid, l); - } - - double vec1[3]; - double vec2[3]; - double vec3[3]; - double current_normal[3]; - double current_normal2[3]; - double norm1; - double norm2; - double current_area; - - vec1[0] = coordinates[3] - coordinates[0]; - vec1[1] = coordinates[4] - coordinates[1]; - vec1[2] = coordinates[5] - coordinates[2]; - - vec2[0] = coordinates[6] - coordinates[0]; - vec2[1] = coordinates[7] - coordinates[1]; - vec2[2] = coordinates[8] - coordinates[2]; - - vec3[0] = coordinates[9] - coordinates[0]; - vec3[1] = coordinates[10] - coordinates[1]; - vec3[2] = coordinates[11] - coordinates[2]; - - current_normal[0] = vec1[1] * vec2[2] - vec1[2] * vec2[1]; - current_normal[1] = vec1[2] * vec2[0] - vec1[0] * vec2[2]; - current_normal[2] = vec1[0] * vec2[1] - vec1[1] * vec2[0]; - - current_normal2[0] = vec2[1] * vec3[2] - vec2[2] * vec3[1]; - current_normal2[1] = vec2[2] * vec3[0] - vec2[0] * vec3[2]; - current_normal2[2] = vec2[0] * vec3[1] - vec2[1] * vec3[0]; - - norm1 = sqrt(pow(current_normal[0], 2) + pow(current_normal[1], 2) + pow(current_normal[2], 2)); - norm2 = sqrt(pow(current_normal2[0], 2) + pow(current_normal2[1], 2) + pow(current_normal2[2], 2)); - - if (norm1 > 0.) - { - current_normal[0] = current_normal[0] / norm1; - current_normal[1] = current_normal[1] / norm1; - current_normal[2] = current_normal[2] / norm1; - - for (auto l = 0; l < 3; ++l) - if (abs(current_normal[l]) <= 1e-10) - current_normal[l] = 0.; - } - else - { - current_normal[0] = 0.; - current_normal[1] = 0.; - current_normal[2] = 0.; - } - - current_area = (norm1 + norm2) / 2.; - - for (auto k = 0; k < 4; ++k) - { - auto local_nodeid = map->mapNodesWO->getLocalElement(node_id[k]); - - for (auto l = 0; l < 3; ++l) - normalWO->sumIntoLocalValue(local_nodeid, i * 3 + l, current_area * current_normal[l]); - } - } - else if (elementsList->getElementSize(elem_local_index) == 3) - { - i_index = map->mapElems->getGlobalElement(elem_local_index); - - global_ordinal_type node_id[3]; - double coordinates[3 * 3]; - for (auto k = 0; k < 3; ++k) - { - node_id[k] = map->mapNodesWO->getGlobalElement(elementsList->getElementNode(elem_local_index, k)); - auto local_nodeid = map->mapNodesWO->getLocalElement(node_id[k]); - - for (auto l = 0; l < 3; ++l) - coordinates[k * 3 + l] = nodesList->nodes(local_nodeid, l); - } - - double vec1[3]; - double vec2[3]; - double current_normal[3]; - double norm; - double current_area; - - vec1[0] = coordinates[3] - coordinates[0]; - vec1[1] = coordinates[4] - coordinates[1]; - vec1[2] = coordinates[5] - coordinates[2]; - - vec2[0] = coordinates[6] - coordinates[0]; - vec2[1] = coordinates[7] - coordinates[1]; - vec2[2] = coordinates[8] - coordinates[2]; - - current_normal[0] = vec1[1] * vec2[2] - vec1[2] * vec2[1]; - current_normal[1] = vec1[2] * vec2[0] - vec1[0] * vec2[2]; - current_normal[2] = vec1[0] * vec2[1] - vec1[1] * vec2[0]; - - norm = sqrt(pow(current_normal[0], 2) + pow(current_normal[1], 2) + pow(current_normal[2], 2)); - - current_area = norm / 2.; - - if (norm > 0.) - { - current_normal[0] = current_normal[0] / norm; - current_normal[1] = current_normal[1] / norm; - current_normal[2] = current_normal[2] / norm; - - for (auto l = 0; l < 3; ++l) - if (abs(current_normal[l]) <= 1e-10) - current_normal[l] = 0.; - } - else - { - current_normal[0] = 0.; - current_normal[1] = 0.; - current_normal[2] = 0.; - } - - for (auto k = 0; k < 3; ++k) - { - auto local_nodeid = map->mapNodesWO->getLocalElement(node_id[k]); - - for (auto l = 0; l < 3; ++l) - normalWO->sumIntoLocalValue(local_nodeid, i * 3 + l, current_area * current_normal[l]); - } - } - } - } - } - Tpetra::Export<> export1(map->mapNodesWO, map->mapNodes); - Tpetra::Export<> export2(map->mapNodes, normal->getMap()); - Tpetra::Import<> import1(map->mapNodes, normal->getMap()); - - normalSUM->doExport(*normalWO, export1, Tpetra::ADD); - normal->doImport(*normalSUM, import1, Tpetra::INSERT); - - normal->template sync<Kokkos::HostSpace>(); - auto normal_2d = normal->template getLocalView<Kokkos::HostSpace>(); - - size_t maxNumEntPerRow = 3 * (D->MaxNumEntries() + M->MaxNumEntries()); - Teuchos::RCP<crs_matrix_type> B(new crs_matrix_type(map->mapLagrangeDofs, maxNumEntPerRow)); - { - int DNumMyRow = D->NumMyRows(); - int DMaxNumIndices = D->MaxNumEntries(); - double *values = new double[DMaxNumIndices]; - int DNumIndices; - int *Indices_int = new int[DMaxNumIndices]; - - const Epetra_Map DrowMap = D->RowMap(); - const Epetra_Map DcolMap = D->ColMap(); - - for (size_t i = 0; i < DNumMyRow; ++i) - { - size_t global_id = D->GRID(i); - if (global_id < numNodes) - continue; - - D->ExtractGlobalRowCopy(global_id, DMaxNumIndices, DNumIndices, values, Indices_int); - - // find which interface interface_j is related to the current Lagrange multiplier - size_t interface_j = 0; // 0 by default - if (contactsList->getContactNumber() > 1) - { - bool doIStop = false; - for (auto k = 0; k < DNumIndices; ++k) - { - for (auto j = 0; j < numMyContacts; ++j) - { - const local_ordinal_type numMySlaveNodes = contactsList->getSlaveNodesSize(j); - - for (auto l = 0; l < numMySlaveNodes; ++l) - { - auto global_nodeid = contactsList->getSlaveNode(j, l); - - if (global_nodeid == Indices_int[k]) - { - interface_j = j; - doIStop = true; - } - if (doIStop) - break; - } - if (doIStop) - break; - } - if (doIStop) - break; - } - } - - global_ordinal_type row = (global_id - numNodes) * numLMPN; - - for (auto k = 0; k < DNumIndices; ++k) - { - global_ordinal_type col1 = Indices_int[k] * numMDPN; - global_ordinal_type col2 = Indices_int[k] * numMDPN + 1; - global_ordinal_type col3 = Indices_int[k] * numMDPN + 2; - - if (isThermo) - { - col1 += numNodes; - col2 += numNodes; - col3 += numNodes; - } - - global_ordinal_type global_node_id = Indices_int[k]; - local_ordinal_type local_node_id = normal->getMap()->getLocalElement(global_node_id); - - double current_normal[3]; - current_normal[0] = normal_2d(local_node_id, interface_j * 3 + 0); - current_normal[1] = normal_2d(local_node_id, interface_j * 3 + 1); - current_normal[2] = normal_2d(local_node_id, interface_j * 3 + 2); - - double norm = sqrt(pow(current_normal[0], 2) + pow(current_normal[1], 2) + pow(current_normal[2], 2)); - - if (norm > 0.) - { - current_normal[0] = current_normal[0] / norm; - current_normal[1] = current_normal[1] / norm; - current_normal[2] = current_normal[2] / norm; - } - else - { - current_normal[0] = 0.; - current_normal[1] = 0.; - current_normal[2] = 0.; - } - - double current_tangential_1[3]; - double current_tangential_2[3]; - - current_tangential_1[0] = 0.; - current_tangential_1[1] = 0.; - current_tangential_1[2] = 1.; - - current_tangential_2[0] = 0.; - current_tangential_2[1] = 0.; - current_tangential_2[2] = 0.; - - if (contactsList->hasAtLeastOneSticking()) - { - double dot_n_z = current_normal[0] * current_tangential_1[0] + current_normal[1] * current_tangential_1[1] + current_normal[2] * current_tangential_1[2]; - - if (acos(abs(dot_n_z)) <= 1e-6 || contactsList->isTying(interface_j)) - { - if (contactsList->isTying(interface_j)) - { - current_normal[0] = 0.; - current_normal[1] = 0.; - current_normal[2] = 1.; - } - current_tangential_1[0] = 1.; - current_tangential_1[1] = 0.; - current_tangential_1[2] = 0.; - - current_tangential_2[0] = 0.; - current_tangential_2[1] = 1.; - current_tangential_2[2] = 0.; - } - else - { - current_tangential_1[0] = current_tangential_1[0] - dot_n_z * current_normal[0]; - current_tangential_1[1] = current_tangential_1[1] - dot_n_z * current_normal[1]; - current_tangential_1[2] = current_tangential_1[2] - dot_n_z * current_normal[2]; - - double norm = sqrt(pow(current_tangential_1[0], 2) + pow(current_tangential_1[1], 2) + pow(current_tangential_1[2], 2)); - - current_tangential_1[0] = current_tangential_1[0] / norm; - current_tangential_1[1] = current_tangential_1[1] / norm; - current_tangential_1[2] = current_tangential_1[2] / norm; - - current_tangential_2[0] = -(current_normal[1] * current_tangential_1[2] - current_normal[2] * current_tangential_1[1]); - current_tangential_2[1] = -(current_normal[2] * current_tangential_1[0] - current_normal[0] * current_tangential_1[2]); - current_tangential_2[2] = -(current_normal[0] * current_tangential_1[1] - current_normal[1] * current_tangential_1[0]); - } - } - - double value1 = values[k] * current_normal[0] * contactsList->getMortarScale(interface_j); - double value2 = values[k] * current_normal[1] * contactsList->getMortarScale(interface_j); - double value3 = values[k] * current_normal[2] * contactsList->getMortarScale(interface_j); - - B->insertGlobalValues(row, - Teuchos::tuple<global_ordinal_type>(col1), - Teuchos::tuple<double>(value1)); - B->insertGlobalValues(row, - Teuchos::tuple<global_ordinal_type>(col2), - Teuchos::tuple<double>(value2)); - B->insertGlobalValues(row, - Teuchos::tuple<global_ordinal_type>(col3), - Teuchos::tuple<double>(value3)); - - if (contactsList->isSticking(interface_j)) - { - value1 = values[k] * current_tangential_1[0] * contactsList->getMortarScale(interface_j); - value2 = values[k] * current_tangential_1[1] * contactsList->getMortarScale(interface_j); - value3 = values[k] * current_tangential_1[2] * contactsList->getMortarScale(interface_j); - - B->insertGlobalValues(row + 1, - Teuchos::tuple<global_ordinal_type>(col1), - Teuchos::tuple<double>(value1)); - B->insertGlobalValues(row + 1, - Teuchos::tuple<global_ordinal_type>(col2), - Teuchos::tuple<double>(value2)); - B->insertGlobalValues(row + 1, - Teuchos::tuple<global_ordinal_type>(col3), - Teuchos::tuple<double>(value3)); - - value1 = values[k] * current_tangential_2[0] * contactsList->getMortarScale(interface_j); - value2 = values[k] * current_tangential_2[1] * contactsList->getMortarScale(interface_j); - value3 = values[k] * current_tangential_2[2] * contactsList->getMortarScale(interface_j); - - B->insertGlobalValues(row + 2, - Teuchos::tuple<global_ordinal_type>(col1), - Teuchos::tuple<double>(value1)); - B->insertGlobalValues(row + 2, - Teuchos::tuple<global_ordinal_type>(col2), - Teuchos::tuple<double>(value2)); - B->insertGlobalValues(row + 2, - Teuchos::tuple<global_ordinal_type>(col3), - Teuchos::tuple<double>(value3)); - } - if (numDPN == 4) - { - global_ordinal_type row2 = row + numLMPN - 1; - global_ordinal_type col4 = Indices_int[k]; - B->insertGlobalValues(row2, - Teuchos::tuple<global_ordinal_type>(col4), - Teuchos::tuple<double>(values[k])); - } - } - - if (SignoriniCheck) - if (contactsList->isNotSignorini(interface_j) == false) - continue; - { - int MMaxNumIndices = M->MaxNumEntries(); - double *values = new double[MMaxNumIndices]; - int MNumIndices; - int *Indices_int = new int[MMaxNumIndices]; - - M->ExtractGlobalRowCopy(global_id, MMaxNumIndices, MNumIndices, values, Indices_int); - - for (auto k = 0; k < MNumIndices; ++k) - { - global_ordinal_type col1 = Indices_int[k] * numMDPN; - global_ordinal_type col2 = Indices_int[k] * numMDPN + 1; - global_ordinal_type col3 = Indices_int[k] * numMDPN + 2; - - if (isThermo) - { - col1 += numNodes; - col2 += numNodes; - col3 += numNodes; - } - - global_ordinal_type global_node_id = Indices_int[k]; - local_ordinal_type local_node_id = normal->getMap()->getLocalElement(global_node_id); - - double current_normal[3]; - current_normal[0] = normal_2d(local_node_id, interface_j * 3 + 0); - current_normal[1] = normal_2d(local_node_id, interface_j * 3 + 1); - current_normal[2] = normal_2d(local_node_id, interface_j * 3 + 2); - - double norm = sqrt(pow(current_normal[0], 2) + pow(current_normal[1], 2) + pow(current_normal[2], 2)); - - if (norm > 0.) - { - current_normal[0] = current_normal[0] / norm; - current_normal[1] = current_normal[1] / norm; - current_normal[2] = current_normal[2] / norm; - } - else - { - current_normal[0] = 0.; - current_normal[1] = 0.; - current_normal[2] = 0.; - } - - double current_tangential_1[3]; - double current_tangential_2[3]; - - current_tangential_1[0] = 0.; - current_tangential_1[1] = 0.; - current_tangential_1[2] = 1.; - - current_tangential_2[0] = 0.; - current_tangential_2[1] = 0.; - current_tangential_2[2] = 0.; - - if (contactsList->hasAtLeastOneSticking()) - { - current_tangential_1[0] = 0.; - current_tangential_1[1] = 0.; - current_tangential_1[2] = 1.; - - double dot_n_z = current_normal[0] * current_tangential_1[0] + current_normal[1] * current_tangential_1[1] + current_normal[2] * current_tangential_1[2]; - - if (acos(abs(dot_n_z)) <= 1e-6 || contactsList->isTying(interface_j)) - { - if (contactsList->isTying(interface_j)) - { - current_normal[0] = 0.; - current_normal[1] = 0.; - current_normal[2] = -1.; - } - current_tangential_1[0] = 1.; - current_tangential_1[1] = 0.; - current_tangential_1[2] = 0.; - - current_tangential_2[0] = 0.; - current_tangential_2[1] = 1.; - current_tangential_2[2] = 0.; - } - else - { - current_tangential_1[0] = current_tangential_1[0] - dot_n_z * current_normal[0]; - current_tangential_1[1] = current_tangential_1[1] - dot_n_z * current_normal[1]; - current_tangential_1[2] = current_tangential_1[2] - dot_n_z * current_normal[2]; - - double norm = sqrt(pow(current_tangential_1[0], 2) + pow(current_tangential_1[1], 2) + pow(current_tangential_1[2], 2)); - - current_tangential_1[0] = current_tangential_1[0] / norm; - current_tangential_1[1] = current_tangential_1[1] / norm; - current_tangential_1[2] = current_tangential_1[2] / norm; - - current_tangential_2[0] = current_normal[1] * current_tangential_1[2] - current_normal[2] * current_tangential_1[1]; - current_tangential_2[1] = current_normal[2] * current_tangential_1[0] - current_normal[0] * current_tangential_1[2]; - current_tangential_2[2] = current_normal[0] * current_tangential_1[1] - current_normal[1] * current_tangential_1[0]; - } - } - - double value1 = -values[k] * current_normal[0] * contactsList->getMortarScale(interface_j); - double value2 = -values[k] * current_normal[1] * contactsList->getMortarScale(interface_j); - double value3 = -values[k] * current_normal[2] * contactsList->getMortarScale(interface_j); - - B->insertGlobalValues(row, - Teuchos::tuple<global_ordinal_type>(col1), - Teuchos::tuple<double>(value1)); - B->insertGlobalValues(row, - Teuchos::tuple<global_ordinal_type>(col2), - Teuchos::tuple<double>(value2)); - B->insertGlobalValues(row, - Teuchos::tuple<global_ordinal_type>(col3), - Teuchos::tuple<double>(value3)); - - if (contactsList->isSticking(interface_j)) - { - value1 = values[k] * current_tangential_1[0] * contactsList->getMortarScale(interface_j); - value2 = values[k] * current_tangential_1[1] * contactsList->getMortarScale(interface_j); - value3 = values[k] * current_tangential_1[2] * contactsList->getMortarScale(interface_j); - - B->insertGlobalValues(row + 1, - Teuchos::tuple<global_ordinal_type>(col1), - Teuchos::tuple<double>(value1)); - B->insertGlobalValues(row + 1, - Teuchos::tuple<global_ordinal_type>(col2), - Teuchos::tuple<double>(value2)); - B->insertGlobalValues(row + 1, - Teuchos::tuple<global_ordinal_type>(col3), - Teuchos::tuple<double>(value3)); - - value1 = values[k] * current_tangential_2[0] * contactsList->getMortarScale(interface_j); - value2 = values[k] * current_tangential_2[1] * contactsList->getMortarScale(interface_j); - value3 = values[k] * current_tangential_2[2] * contactsList->getMortarScale(interface_j); - - B->insertGlobalValues(row + 2, - Teuchos::tuple<global_ordinal_type>(col1), - Teuchos::tuple<double>(value1)); - B->insertGlobalValues(row + 2, - Teuchos::tuple<global_ordinal_type>(col2), - Teuchos::tuple<double>(value2)); - B->insertGlobalValues(row + 2, - Teuchos::tuple<global_ordinal_type>(col3), - Teuchos::tuple<double>(value3)); - } - if (numDPN == 4) - { - global_ordinal_type row2 = row + numLMPN - 1; - global_ordinal_type col4 = Indices_int[k]; - B->insertGlobalValues(row2, - Teuchos::tuple<global_ordinal_type>(col4), - Teuchos::tuple<double>(values[k])); - } - } - - delete values; - delete Indices_int; - } - } - - delete values; - delete Indices_int; - } - - B->fillComplete(map->mapDofs, map->mapLagrangeDofs); - - return B; -} diff --git a/katoptron/src/Mortar.h b/katoptron/src/Mortar.h deleted file mode 100644 index 80540be2..00000000 --- a/katoptron/src/Mortar.h +++ /dev/null @@ -1,109 +0,0 @@ -#ifndef KATOPTRON_MORTAR_H -#define KATOPTRON_MORTAR_H - -#include "Tpetra_Vector.hpp" -#include "Kokkos_ViewFactory.hpp" -#include "Tpetra_Map.hpp" -#include <mpi.h> -#include "Tpetra_CrsGraph.hpp" -#include <Epetra_Map.h> - -#include "Tpetra_ConfigDefs.hpp" - -#include "Tpetra_Map.hpp" -#include "Tpetra_MultiVector.hpp" -#include "Tpetra_Vector.hpp" -#include "Tpetra_CrsGraph.hpp" -#include "Tpetra_CrsMatrix.hpp" - -#include "ElementsList.h" -#include "NodesList.h" -#include "ContactsList.h" -#include "Map.h" -#include "Matrices.h" - -Teuchos::RCP<Tpetra::CrsMatrix<>> compute_B(Teuchos::RCP<katoptron::ElementsList> elementsList, - Teuchos::RCP<katoptron::NodesList> nodesList, - Teuchos::RCP<katoptron::ContactsList> contactsList, - Teuchos::RCP<katoptron::Map> map, MPI_Comm comm, bool SignoriniCheck); - -template <typename scalar> -void compute_B(Teuchos::RCP<katoptron::Matrices<scalar>> matrices, - Teuchos::RCP<katoptron::ElementsList> elementsList, - Teuchos::RCP<katoptron::NodesList> nodesList, - Teuchos::RCP<katoptron::ContactsList> contactsList, - Teuchos::RCP<katoptron::Map> map, MPI_Comm comm) -{ - Teuchos::RCP<Tpetra::CrsMatrix<>> B_double = compute_B(elementsList, nodesList, contactsList, map, comm, true); - Teuchos::RCP<Tpetra::CrsMatrix<>> B_G_double; - if (contactsList->isSignorini()) - B_G_double = compute_B(elementsList, nodesList, contactsList, map, comm, false); - else - B_G_double = B_double; - - typedef katoptron::Map::local_ordinal_type local_ordinal_type; - typedef katoptron::Map::global_ordinal_type global_ordinal_type; - - size_t maxNumEntPerRow = B_G_double->getNodeMaxNumRowEntries(); - size_t maxNumEntPerRowT = 200; // Temporary fix - - matrices->B = rcp(new Tpetra::CrsMatrix<scalar, local_ordinal_type, global_ordinal_type>(map->mapLagrangeDofs, maxNumEntPerRow)); - matrices->B_2 = rcp(new Tpetra::CrsMatrix<scalar, local_ordinal_type, global_ordinal_type>(map->mapLagrangeDofs, maxNumEntPerRow)); - matrices->B_G = rcp(new Tpetra::CrsMatrix<scalar, local_ordinal_type, global_ordinal_type>(map->mapLagrangeDofs, maxNumEntPerRow)); - matrices->B_T = rcp(new Tpetra::CrsMatrix<scalar, local_ordinal_type, global_ordinal_type>(map->mapDofs, maxNumEntPerRowT)); - matrices->C = rcp(new Tpetra::CrsMatrix<scalar, local_ordinal_type, global_ordinal_type>(map->mapLagrangeDofs, 1)); - matrices->Cb = rcp(new Tpetra::CrsMatrix<scalar, local_ordinal_type, global_ordinal_type>(map->mapLagrangeDofs, 1)); - - for (auto i = 0; i < map->mapLagrangeDofs->getNodeNumElements(); ++i) - { - if (map->mapLagrangeDofs->isNodeLocalElement(i)) - { - local_ordinal_type local_index = i; - global_ordinal_type global_index = map->mapLagrangeDofs->getGlobalElement(local_index); - - Teuchos::ArrayView<const local_ordinal_type> local_indices; - Teuchos::ArrayView<const double> values; - - B_double->getLocalRowView(local_index, local_indices, values); - - for (auto k = 0; k < local_indices.size(); ++k) - { - global_ordinal_type column_index = B_double->getColMap()->getGlobalElement(local_indices[k]); - - matrices->B->insertGlobalValues(global_index, - Teuchos::tuple<global_ordinal_type>(column_index), - Teuchos::tuple<scalar>((scalar)values[k])); - - matrices->B_2->insertGlobalValues(global_index, - Teuchos::tuple<global_ordinal_type>(column_index), - Teuchos::tuple<scalar>((scalar)values[k])); - - matrices->B_T->insertGlobalValues(column_index, - Teuchos::tuple<global_ordinal_type>(global_index), - Teuchos::tuple<scalar>((scalar)values[k])); - } - - B_G_double->getLocalRowView(local_index, local_indices, values); - - for (auto k = 0; k < local_indices.size(); ++k) - { - global_ordinal_type column_index = B_G_double->getColMap()->getGlobalElement(local_indices[k]); - - matrices->B_G->insertGlobalValues(global_index, - Teuchos::tuple<global_ordinal_type>(column_index), - Teuchos::tuple<scalar>((scalar)values[k])); - } - - matrices->C->insertGlobalValues(global_index, Teuchos::tuple<global_ordinal_type>(global_index), Teuchos::tuple<scalar>((scalar)0.)); - matrices->Cb->insertGlobalValues(global_index, Teuchos::tuple<global_ordinal_type>(global_index), Teuchos::tuple<scalar>((scalar)1.)); - } - } - - matrices->B->fillComplete(map->mapDofs, map->mapLagrangeDofs); - matrices->B_2->fillComplete(map->mapDofs, map->mapLagrangeDofs); - matrices->B_G->fillComplete(map->mapDofs, map->mapLagrangeDofs); - matrices->B_T->fillComplete(map->mapLagrangeDofs, map->mapDofs); - matrices->C->fillComplete(); - matrices->Cb->fillComplete(); -}; -#endif //KATOPTRON_MORTAR_H \ No newline at end of file diff --git a/katoptron/src/NeumannList.h b/katoptron/src/NeumannList.h deleted file mode 100644 index 08aaf001..00000000 --- a/katoptron/src/NeumannList.h +++ /dev/null @@ -1,196 +0,0 @@ -#ifndef KATOPTRON_NEUMANNLIST_H -#define KATOPTRON_NEUMANNLIST_H - -#include "katoptron.h" - -#include "Map.h" -#include "wNeumann.h" -#include "wTag.h" - -#include <Tpetra_Map.hpp> -#include <Tpetra_Vector.hpp> -#include <Teuchos_RCP.hpp> -#include <Kokkos_ViewFactory.hpp> - -#include "EnsembleTraits.h" - -namespace katoptron -{ - -/** - * @brief Class which is used to store the list of the Neumann boundary conditions (BC). - */ -template <typename scalar> -class NeumannList -{ - typedef Map::local_ordinal_type local_ordinal_type; - typedef Map::global_ordinal_type global_ordinal_type; - -private: - Kokkos::View<int **, Kokkos::LayoutRight> neumann_elementsList; - Kokkos::View<scalar ***, Kokkos::LayoutRight> neumann_values_list; - - local_ordinal_type neumann_number; - local_ordinal_type neumann_size; - local_ordinal_type neumann_elements; - - local_ordinal_type neumann_time; - local_ordinal_type neumann_dofs; - local_ordinal_type neumann_values; - -public: - NeumannList(Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList); - - /** - * @brief Return the number of Neumann BC. - */ - inline local_ordinal_type getNeumannNumber() { return neumann_number; } - - /** - * @brief Return the number of elements for a - * given Neumann BC. - * - * Argument: - * <ul> - * <li> i: the BC ID. - * </ul> - */ - inline local_ordinal_type getNeumannSize(local_ordinal_type i) - { - return neumann_elementsList(i, neumann_size); - } - - /** - * @brief Return the local ID of the element e1 of - * a given BC. - * - * Arguments: - * <ul> - * <li> i: the BC ID, - * <li> e1: the ID of the element on the current BC. - * </ul> - */ - inline local_ordinal_type getNeumannElement(local_ordinal_type i, local_ordinal_type e1) - { - return neumann_elementsList(i, neumann_elements + e1); - } - - /** - * @brief Return whether there is a surface - * load for the given BC for a given DOF index. - * - * Arguments: - * <ul> - * <li> i: the BC ID, - * <li> j: the index of the DOF (0-3 if thermomechanical problems). - * </ul> - */ - inline scalar getNeumannDof(local_ordinal_type i, local_ordinal_type j) - { - return neumann_values_list(i, 0, neumann_dofs + j); - } - - /** - * @brief Return the value of the surface - * load for the given BC for a given DOF index. - * - * Arguments: - * <ul> - * <li> i: the BC ID, - * <li> j: the index of the DOF (0-3 if thermomechanical problems). - * </ul> - */ - inline scalar getNeumannValue(local_ordinal_type i, local_ordinal_type j) - { - return neumann_values_list(i, 0, neumann_values + j); - } -}; - -/** - * @brief NeumannList constructor - * - * This constructor allocates 2 Kokkos::View which store all the required information related to each Neumann BC, including: - * <ul> - * <li> all the Neumann elements, - * <li> all the values of the Neumann BC. - * </ul> - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> map: an RCP to a Map object, - * <li> elementsList: an RCP to an ElementList object. - * </ul> - */ -template <typename scalar> -NeumannList<scalar>::NeumannList(Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList) -{ - typedef local_ordinal_type local_ordinal_type; - typedef global_ordinal_type global_ordinal_type; - - typedef EnsembleTraits<scalar> ET; - const int ensemble_size = ET::size; - - local_ordinal_type numDPN = map->numPrimalDPN; - - neumann_number = pbl.nBCs.size(); - local_ordinal_type maxNumElemsPernBC = 0; - - std::vector<std::vector<global_ordinal_type>> nbcElems = {}; - - for (auto i = 0; i < neumann_number; ++i) - { - std::vector<global_ordinal_type> mynBcElems = {}; - for (auto j = 0; j < pbl.nBCs[i]->tag->elems.size(); ++j) - { - local_ordinal_type e = map->mapElems->getLocalElement(pbl.nBCs[i]->tag->elems[j]->no - 1); - - if (elementsList->getElementType(e) == static_cast<int>(tbox::ElType::QUAD4)) - ; - else if (elementsList->getElementType(e) == static_cast<int>(tbox::ElType::TRI3)) - ; - else - continue; - - mynBcElems.push_back(e); - } - nbcElems.push_back(mynBcElems); - if (maxNumElemsPernBC < mynBcElems.size()) - maxNumElemsPernBC = mynBcElems.size(); - } - - neumann_size = 0; - neumann_elements = 1; - neumann_elementsList = Kokkos::View<int **, Kokkos::LayoutRight>("R", neumann_number, neumann_elements + maxNumElemsPernBC); - - for (auto i = 0; i < neumann_number; ++i) - { - neumann_elementsList(i, neumann_size) = nbcElems[i].size(); - - for (auto j = 0; j < nbcElems[i].size(); ++j) - neumann_elementsList(i, neumann_elements + j) = nbcElems[i][j]; - } - - neumann_time = 0; - neumann_dofs = 1; - neumann_values = 1 + numDPN; - neumann_values_list = Kokkos::View<scalar ***, Kokkos::LayoutRight>("R", neumann_number, 1, 1 + 2 * numDPN); - for (auto i = 0; i < neumann_number; ++i) - { - neumann_values_list(i, 0, neumann_time) = 0.; //to change latter - for (auto j = 0; j < numDPN; ++j) - if (pbl.nBCs[i]->which_dof[j]) - neumann_values_list(i, 0, neumann_dofs + j) = 1; - else - neumann_values_list(i, 0, neumann_dofs + j) = 0; - - for (auto j = 0; j < numDPN; ++j) - for (int s = 0; s < ensemble_size; ++s) - { - ET::coeff(neumann_values_list(i, 0, neumann_values + j), s) = pbl.nBCs[i]->values[j * ensemble_size + s]; - } - } -} -}; // namespace katoptron - -#endif //KATOPTRON_NEUMANNLIST_H diff --git a/katoptron/src/NodesList.cpp b/katoptron/src/NodesList.cpp deleted file mode 100644 index 7bd363ba..00000000 --- a/katoptron/src/NodesList.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "NodesList.h" - -#include "wProblem.h" -#include "wMshData.h" -#include "wNode.h" - -using namespace katoptron; - -/** - * @brief NodesList constructor - * - * This constructor allocates 1 Kokkos::View which stores all the nodes positions. - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> map: an RCP to a Map object. - * </ul> - */ -NodesList::NodesList(Problem &pbl, Teuchos::RCP<Map> map) -{ - nodes_number = map->mapNodesWO->getNodeNumElements(); - - nodes = Kokkos::View<double **, Kokkos::LayoutRight>("R", nodes_number, 3); - for (auto i = 0; i < nodes_number; ++i) - for (auto j = 0; j < 3; ++j) - nodes(i, j) = pbl.msh->nodes[map->mapNodesWO->getGlobalElement(i)]->pos(j); -} diff --git a/katoptron/src/NodesList.h b/katoptron/src/NodesList.h deleted file mode 100644 index 9b2d2cae..00000000 --- a/katoptron/src/NodesList.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef KATOPTRON_NODESLIST_H -#define KATOPTRON_NODESLIST_H - -#include "katoptron.h" - -#include "Map.h" - -#include <Tpetra_Map.hpp> -#include <Tpetra_Vector.hpp> -#include <Teuchos_RCP.hpp> -#include <Kokkos_ViewFactory.hpp> - -namespace katoptron -{ - -/** - * @brief Class used to store the node information. - */ -class NodesList -{ -public: - Kokkos::View<double **, Kokkos::LayoutRight> nodes; - - Map::local_ordinal_type nodes_number; - - NodesList(Problem &pbl, Teuchos::RCP<Map> map); -}; - -}; // namespace katoptron - -#endif //KATOPTRON_NODESLIST_H diff --git a/katoptron/src/PreloadList.h b/katoptron/src/PreloadList.h deleted file mode 100644 index 6d86a279..00000000 --- a/katoptron/src/PreloadList.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef KATOPTRON_PRELOADLIST_H -#define KATOPTRON_PRELOADLIST_H - -#include "katoptron.h" - -#include "Map.h" -#include "wContact.h" -#include "wTag.h" - -#include <Tpetra_Map.hpp> -#include <Tpetra_Vector.hpp> -#include <Teuchos_RCP.hpp> -#include <Kokkos_ViewFactory.hpp> - -#include "EnsembleTraits.h" - -namespace katoptron -{ - -/** - * @brief Class which is used to store the list of the preloads. - */ -template <typename scalar> -class PreloadList -{ - typedef Map::local_ordinal_type local_ordinal_type; - typedef Map::global_ordinal_type global_ordinal_type; - -private: - Kokkos::View<scalar *, Kokkos::LayoutRight> contacts_dg; - -public: - PreloadList(Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList); - - /** - * @brief Return the value of the preload for - * a given contact interface. - * - * Argument: - * <ul> - * <li> i: the contact interface ID. - * </ul> - */ - inline scalar getPreloadValue(local_ordinal_type i) - { - return contacts_dg(i); - } -}; - -/** - * @brief NeumannList constructor - * - * This constructor allocates 1 Kokkos::View which stores all the preload related to each contact interface. - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> map: an RCP to a Map object, - * <li> elementsList: an RCP to an ElementList object. - * </ul> - */ -template <typename scalar> -PreloadList<scalar>::PreloadList(Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList) -{ - int contacts_number = pbl.Contacts.size(); - - typedef EnsembleTraits<scalar> ET; - const int ensemble_size = ET::size; - - contacts_dg = Kokkos::View<scalar *, Kokkos::LayoutRight>("R", contacts_number); - for (auto i = 0; i < contacts_number; ++i) - for (int j = 0; j < ensemble_size; ++j) - ET::coeff(contacts_dg(i), j) = pbl.Contacts[i]->dg_vector[j]; -} -}; // namespace katoptron - -#endif //KATOPTRON_PRELOADLIST_H diff --git a/katoptron/src/ResultsDecl.hpp b/katoptron/src/ResultsDecl.hpp deleted file mode 100644 index 9fac3532..00000000 --- a/katoptron/src/ResultsDecl.hpp +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef KATOPTRON_RESULTSDECL_HPP -#define KATOPTRON_RESULTSDECL_HPP - -#include "katoptron.h" -#include "wObject.h" -#include "wTimer.h" -#include "wTimers.h" -#include "wTag.h" -#include "wMedium.h" -#include "wNode.h" - -#include "Teuchos_ParameterList.hpp" - -#include "wProblem.h" -#include "wContact.h" -#include "wMshData.h" -#include "wDisplayHook.h" -#include "wElement.h" - -// Tpetra -#include "Stokhos_Tpetra_MP_Vector.hpp" -#include "Stokhos_Tpetra_Utilities_MP_Vector.hpp" -#include "Tpetra_ConfigDefs.hpp" - -#include "Tpetra_Map.hpp" -#include "Tpetra_MultiVector.hpp" -#include "Tpetra_Vector.hpp" -#include "Tpetra_CrsGraph.hpp" -#include "Tpetra_CrsMatrix.hpp" - -#include <Teuchos_Array.hpp> -#include <Teuchos_GlobalMPISession.hpp> -#include <Teuchos_oblackholestream.hpp> -#include <Teuchos_ScalarTraits.hpp> -#include <Teuchos_RCP.hpp> -#include "Teuchos_ParameterList.hpp" - -#include "Kokkos_ViewFactory.hpp" -#include "Kokkos_Vector.hpp" - -#include "wRandomField.h" -#include "wResults.h" -#include "wLazy.h" -#include "Map.h" -#include <map> -#include "EnsembleTraits.h" - -/** - * @brief Function to write results on disk using VTK formats. - */ -template <class Scalar, class LocalOrdinal, class GlobalOrdinal> -void writeResultsVTK( - const katoptron::Problem &pbl, - Teuchos::RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal>> xPost, - Teuchos::RCP<katoptron::Map> map, - Teuchos::RCP<RandomField<Scalar, Kokkos::DefaultExecutionSpace>> random_field, - std::string name, - size_t ast, - bool final_result, - bool write_txt); - -#endif //KATOPTRON_RESULTSDECL_HPP diff --git a/katoptron/src/ResultsDef.hpp b/katoptron/src/ResultsDef.hpp deleted file mode 100644 index 28b6389b..00000000 --- a/katoptron/src/ResultsDef.hpp +++ /dev/null @@ -1,366 +0,0 @@ -#ifndef KATOPTRON_RESULTSDEF_HPP -#define KATOPTRON_RESULTSDEF_HPP - -#include "ResultsDecl.hpp" -#include "StressComputation.h" - -/* @todo should be removed */ -#ifdef WAVES_USE_TBOXVTK -#include "tboxVtk.h" -#include "wVtkExport_KIM2CLEAN.h" -#endif - -template <class Scalar, class LocalOrdinal, class GlobalOrdinal> -void writeResultsVTK( - const katoptron::Problem &pbl, - Teuchos::RCP<Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal>> xPost, - Teuchos::RCP<katoptron::Map> map, - Teuchos::RCP<RandomField<Scalar, Kokkos::DefaultExecutionSpace>> random_field, - std::string name, - size_t ast, - bool final_result, - bool write_txt) -{ - /* @todo [AC] temporary fix for initializing Mem in katoptron */ - for (auto e : pbl.msh->elems) - { - if (e->type() == tbox::ElType::HEX8 || e->type() == tbox::ElType::TETRA4) // 3D - e->initValues(true); - //else // 2D - // e->initValues(false); - } - /* end temporary fix*/ - - // Extraction of types and ensemble format - - xPost->template sync<Kokkos::HostSpace>(); - auto x_2d = xPost->template getLocalView<Kokkos::HostSpace>(); - auto X = Kokkos::subview(x_2d, Kokkos::ALL(), 0); - - typedef EnsembleTraits<Scalar> ET; - - const size_t ensemble_size = ET::size; - - typedef decltype(X) X_View; - typename Kokkos::FlatArrayType<X_View>::type X_flat = X; - - size_t numPrimalDPN = map->numPrimalDPN; - - // Construction of the maps - - std::map<LocalOrdinal, GlobalOrdinal> nodesWO_LO_to_GO; - std::map<GlobalOrdinal, LocalOrdinal> nodesWO_GO_to_LO; - std::map<GlobalOrdinal, LocalOrdinal> elements_GO_to_LO; - std::vector<GlobalOrdinal> contactElementID; - std::map<LocalOrdinal, GlobalOrdinal> lagrange_LO_to_nodes_GO; - std::map<GlobalOrdinal, LocalOrdinal> nodes_GO_to_lagrange_LO; - - LocalOrdinal index = 0; - - for (LocalOrdinal i = 0; i < map->mapElems->getNodeNumElements(); ++i) - { - if (pbl.msh->elems[i]->type() == tbox::ElType::HEX8 || pbl.msh->elems[i]->type() == tbox::ElType::TETRA4) - { - GlobalOrdinal global_i = map->mapElems->getGlobalElement(i); - elements_GO_to_LO[global_i] = index; - ++index; - } - } - - for (LocalOrdinal i = 0; i < map->mapNodesWO->getNodeNumElements(); ++i) - { - GlobalOrdinal global_i = map->mapNodesWO->getGlobalElement(i); - nodesWO_LO_to_GO[i] = global_i; - nodesWO_GO_to_LO[global_i] = i; - } - - LocalOrdinal numNodes = nodesWO_LO_to_GO.size(); - LocalOrdinal numMechanicalDualDOFs = map->lagrange_to_dof.size(); - LocalOrdinal numPrimalDOFs = numPrimalDPN * numNodes; - - std::map<LocalOrdinal, GlobalOrdinal> elems_LO_to_GO; - std::map<GlobalOrdinal, LocalOrdinal> elems_GO_to_LO; - - for (GlobalOrdinal i = 0; i < pbl.msh->elems.size(); ++i) - { - if (pbl.msh->elems[i]->type() == tbox::ElType::HEX8 || pbl.msh->elems[i]->type() == tbox::ElType::TETRA4) - { - LocalOrdinal local_i = pbl.msh->elems[i]->no - 1; - elems_LO_to_GO[local_i] = i; - elems_GO_to_LO[i] = local_i; - } - } - - if (pbl.Contacts.size() >= 1) - { - std::vector<GlobalOrdinal> tmpcontactElementID; - for (size_t i = 0; i < pbl.Contacts.size(); ++i) - for (LocalOrdinal j = 0; j < pbl.Contacts[i]->slave_elems.size(); ++j) - tmpcontactElementID.push_back(pbl.Contacts[i]->slave_elems[j]->no - 1); - - if (tmpcontactElementID.size() > 1) - { - std::sort(tmpcontactElementID.begin(), tmpcontactElementID.end()); - - if (tmpcontactElementID.size() >= 1) - { - contactElementID.push_back(tmpcontactElementID[0]); - if (tmpcontactElementID.size() > 1) - for (LocalOrdinal i = 1; i < tmpcontactElementID.size(); ++i) - if (tmpcontactElementID[i] != tmpcontactElementID[i - 1]) - contactElementID.push_back(tmpcontactElementID[i]); - } - } - } - - // Values in which we are interested - - std::vector<double> displacement_x(numNodes); - std::vector<double> displacement_y(numNodes); - std::vector<double> displacement_z(numNodes); - std::vector<double> shear_modulus_per_node(numNodes); - - std::vector<double> sigma_vm_nodes(numNodes); - std::vector<size_t> adjacent_elems(numNodes); - std::vector<Eigen::MatrixXd> stress_at_nodes(numNodes); - std::vector<Eigen::MatrixXd> strain_at_nodes(numNodes); - - std::vector<Eigen::MatrixXd> stress(pbl.msh->elems.size()); - std::vector<Eigen::MatrixXd> strain(pbl.msh->elems.size()); - - std::vector<double> sigma_vm(pbl.msh->elems.size()); - - std::vector<double> G_vector(pbl.msh->elems.size()); - - std::vector<Eigen::Vector3d> displacement(numNodes); - - std::vector<double> displacement_u(numNodes); - std::vector<double> T(numNodes); - std::vector<double> pressure(numMechanicalDualDOFs); - - std::vector<double> h_fluxes(numMechanicalDualDOFs); - std::vector<double> t_x(numMechanicalDualDOFs); - std::vector<double> t_y(numMechanicalDualDOFs); - - for (auto &k : stress) - k = Eigen::Matrix3d::Zero(); - - for (auto &k : strain) - k = Eigen::Matrix3d::Zero(); - - for (auto &k : stress_at_nodes) - k = Eigen::Matrix3d::Zero(); - - for (auto &k : strain_at_nodes) - k = Eigen::Matrix3d::Zero(); - - // Fill the result vectors - - for (size_t ell = 0; ell < ensemble_size; ++ell) - { - - tbox::Results *results = new tbox::Results(); - tbox::Results *results_contact = new tbox::Results(); - - results->scalars_at_nodes["x"] = &displacement_x; - results->scalars_at_nodes["y"] = &displacement_y; - results->scalars_at_nodes["z"] = &displacement_z; - results->scalars_at_nodes["u"] = &displacement_u; - results->scalars_at_nodes["G"] = &shear_modulus_per_node; - results->scalars_at_nodes["von Mises"] = &sigma_vm_nodes; - results->tensors_at_nodes["sigma"] = &stress_at_nodes; - results->tensors_at_nodes["epsilon"] = &strain_at_nodes; - - if (numPrimalDPN == 4) - results->scalars_at_nodes["T"] = &T; - - results->tensors_at_elems["sigma"] = &stress; - results->tensors_at_elems["epsilon"] = &strain; - - results->scalars_at_elems["von Mises"] = &sigma_vm; - - results->scalars_at_elems["G"] = &G_vector; - - results->vectors_at_nodes["displacement"] = &displacement; - - if (pbl.Contacts.size() > 0) - { - results_contact->scalars_at_nodes["p"] = &pressure; - if (numPrimalDPN == 4) - results_contact->scalars_at_nodes["heat fluxes"] = &h_fluxes; - if (map->numDualDPN == 3 || map->numDualDPN == 4) - { - results_contact->scalars_at_nodes["tangential stress 1"] = &t_x; - results_contact->scalars_at_nodes["tangential stress 2"] = &t_y; - } - } - - for (LocalOrdinal i = 0; i < numNodes; ++i) - { - double dx, dy, dz; - if (numPrimalDPN == 4) - { - dx = X_flat[ensemble_size * (numNodes + 3 * i) + ell]; - dy = X_flat[ensemble_size * (numNodes + 3 * i + 1) + ell]; - dz = X_flat[ensemble_size * (numNodes + 3 * i + 2) + ell]; - } - else - { - dx = X_flat[ensemble_size * (3 * i) + ell]; - dy = X_flat[ensemble_size * (3 * i + 1) + ell]; - dz = X_flat[ensemble_size * (3 * i + 2) + ell]; - } - - displacement_x[i] = dx; - displacement_y[i] = dy; - displacement_z[i] = dz; - displacement_u[i] = sqrt(dx * dx + dy * dy + dz * dz); - strain_at_nodes[i].setZero(); - stress_at_nodes[i].setZero(); - shear_modulus_per_node[i] = ET::coeff(random_field->operator()(pbl.msh->nodes[nodesWO_LO_to_GO[i]]->pos(0), pbl.msh->nodes[nodesWO_LO_to_GO[i]]->pos(1), pbl.msh->nodes[nodesWO_LO_to_GO[i]]->pos(2)), ell); - displacement[i] = Eigen::Vector3d(dx, dy, dz); - if (numPrimalDPN == 4 || numPrimalDPN == 1) - T[i] = X_flat[ensemble_size * i + ell]; - } - if (pbl.Contacts.size() > 0) - { - for (LocalOrdinal i = 0; i < numMechanicalDualDOFs; ++i) - { - int i_node = map->lm_to_dof_global[i]; - lagrange_LO_to_nodes_GO[i] = i_node; - nodes_GO_to_lagrange_LO[i_node] = i; - pressure[i] = X_flat[ensemble_size * (i * map->numDualDPN + numPrimalDOFs) + ell]; - } - if (map->numDualDPN == 2 || map->numDualDPN == 4) - for (LocalOrdinal i = 0; i < numMechanicalDualDOFs; ++i) - h_fluxes[i] = X_flat[ensemble_size * (i * map->numDualDPN + map->numDualDPN - 1 + numPrimalDOFs) + ell]; - if (map->numDualDPN == 3 || map->numDualDPN == 4) - for (LocalOrdinal i = 0; i < numMechanicalDualDOFs; ++i) - { - t_x[i] = X_flat[ensemble_size * (i * map->numDualDPN + 1 + numPrimalDOFs) + ell]; - t_y[i] = X_flat[ensemble_size * (i * map->numDualDPN + 2 + numPrimalDOFs) + ell]; - } - } - - for (auto m : pbl.media) - { - tbox::Tag *current_tag = m->tag; - - double E = ET::coeff(m->E, ell); - double nu = ET::coeff(m->nu, ell); - - double lambda = (nu * E) / ((1 + nu) * (1 - 2 * nu)); - double G = E / (2 * (1 + nu)); - - for (LocalOrdinal i_elem = 0; i_elem < current_tag->elems.size(); ++i_elem) - { - if (random_field->isRandom) - { - double x = 0., y = 0., z = 0.; - size_t element_size = current_tag->elems[i_elem]->nodes.size(); - for (size_t j = 0; j < element_size; ++j) - { - x += current_tag->elems[i_elem]->nodes[j]->pos(0) / element_size; - y += current_tag->elems[i_elem]->nodes[j]->pos(1) / element_size; - z += current_tag->elems[i_elem]->nodes[j]->pos(2) / element_size; - } - G = ET::coeff(random_field->operator()(x, y, z), ell); - } - Eigen::MatrixXd H = Eigen::MatrixXd::Zero(9, 9); - Eigen::MatrixXd D = Eigen::MatrixXd::Zero(3, 3); - - for (auto i = 0; i < 3; ++i) - for (auto j = 0; j < 3; ++j) - for (auto k = 0; k < 3; ++k) - for (auto l = 0; l < 3; ++l) - { - if (i == j && k == l) - H(i * 3 + j, k * 3 + l) = lambda; - if (i == k && j == l) - H(i * 3 + j, k * 3 + l) = H(i * 3 + j, k * 3 + l) + G; - if (i == l && j == k) - H(i * 3 + j, k * 3 + l) = H(i * 3 + j, k * 3 + l) + G; - } - if (numPrimalDPN == 4) - { - double kappa = lambda + (2. / 3.) * G; - double beta = ET::coeff(m->beta, ell); - - for (auto i = 0; i < 3; ++i) - D(i, i) = -3. * kappa * beta; - } - std::vector<double> x_tmp(8), y_tmp(8), z_tmp(8), T_tmp(8); - Eigen::MatrixXd Strain(3, 3); - Eigen::MatrixXd Sigma(3, 3); - - auto e = current_tag->elems[i_elem]; - std::vector<Eigen::MatrixXd> Strain_at_node(e->nodes.size()); - std::vector<Eigen::MatrixXd> Sigma_at_node(e->nodes.size()); - - for (auto &k : Strain_at_node) - k = Eigen::MatrixXd::Zero(3, 3); - for (auto &k : Sigma_at_node) - k = Eigen::MatrixXd::Zero(3, 3); - - if (e->type() == tbox::ElType::HEX8 || e->type() == tbox::ElType::TETRA4) - { - for (size_t i = 0; i < e->nodes.size(); ++i) - { - int node_i = nodesWO_GO_to_LO[e->nodes[i]->row]; - x_tmp[i] = displacement_x[node_i]; - y_tmp[i] = displacement_y[node_i]; - z_tmp[i] = displacement_z[node_i]; - if (numPrimalDPN == 4) - T_tmp[i] = T[node_i]; - else - T_tmp[i] = 0.; - } - - strain_stress_x_y_z(e, Strain, Sigma, H, D, x_tmp, y_tmp, z_tmp, T_tmp, numPrimalDPN == 4); - - strain[elems_LO_to_GO[e->no - 1]] = Strain; - stress[elems_LO_to_GO[e->no - 1]] = Sigma; - - G_vector[elems_LO_to_GO[e->no - 1]] = G; - - sigma_vm[elems_LO_to_GO[e->no - 1]] = sqrt((pow(Sigma(0, 0) - Sigma(1, 1), 2.) + pow(Sigma(1, 1) - Sigma(2, 2), 2.) + pow(Sigma(2, 2) - Sigma(0, 0), 2.) + 6 * (pow(Sigma(0, 1), 2.) + pow(Sigma(1, 2), 2.) + pow(Sigma(2, 0), 2.))) / 2); - - strain_stress_x_y_z_at_node(e, Strain_at_node, Sigma_at_node, H, D, x_tmp, y_tmp, z_tmp, T_tmp, numPrimalDPN == 4); - - for (size_t i = 0; i < e->nodes.size(); ++i) - { - LocalOrdinal node_i = nodesWO_GO_to_LO[e->nodes[i]->row]; - if (ell == 0) - ++adjacent_elems[node_i]; // Increases the number of adjacent elements by one only for the first sample - - strain_at_nodes[node_i] += Strain_at_node[i]; - stress_at_nodes[node_i] += Sigma_at_node[i]; - } - } - } - } - for (LocalOrdinal i = 0; i < numNodes; ++i) - { - strain_at_nodes[i] /= adjacent_elems[i]; - stress_at_nodes[i] /= adjacent_elems[i]; - - Eigen::MatrixXd Sigma = stress_at_nodes[i]; - - sigma_vm_nodes[i] = sqrt((pow(Sigma(0, 0) - Sigma(1, 1), 2.) + pow(Sigma(1, 1) - Sigma(2, 2), 2.) + pow(Sigma(2, 2) - Sigma(0, 0), 2.) + 6 * (pow(Sigma(0, 1), 2.) + pow(Sigma(1, 2), 2.) + pow(Sigma(2, 0), 2.))) / 2); - } - - /* @todo temporary fix to output Kim's data */ - // All the post-processing related to katoptron should be done here, - // then tbox::MshExport should be used, either by passing tbox::GmshExport or tboxVtk::VtkExport - - tboxVtk::VtkExport_KIM2CLEAN vtkWriter(pbl.msh); - vtkWriter.save_MPI(pbl.msh->name + "_ast" + std::to_string(ast) + "_s" + std::to_string(ell) + ".pvtu", *results, nodesWO_LO_to_GO, nodesWO_GO_to_LO, elements_GO_to_LO); - if (pbl.Contacts.size() >= 1) - vtkWriter.save_MPI(pbl.msh->name + "_ast" + std::to_string(ast) + "_s" + std::to_string(ell) + "_contact.vtu", *results_contact, contactElementID, lagrange_LO_to_nodes_GO, nodes_GO_to_lagrange_LO); - - delete results; - delete results_contact; - } -} - -#endif //KATOPTRON_RESULTSDEF_HPP diff --git a/katoptron/src/ResultsETI.cpp b/katoptron/src/ResultsETI.cpp deleted file mode 100644 index aa362ebf..00000000 --- a/katoptron/src/ResultsETI.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include "ResultsDecl.hpp" -#include "ResultsDef.hpp" - -typedef katoptron::Map::local_ordinal_type local_ordinal_type; -typedef katoptron::Map::global_ordinal_type global_ordinal_type; - -#define SCALAR double - -template void writeResultsVTK<SCALAR, local_ordinal_type, global_ordinal_type>( - const katoptron::Problem &, - Teuchos::RCP<Tpetra::Vector<SCALAR, local_ordinal_type, global_ordinal_type>>, - Teuchos::RCP<katoptron::Map>, - Teuchos::RCP<RandomField<SCALAR, Kokkos::DefaultExecutionSpace>>, - std::string, - size_t, - bool, - bool); - -#undef SCALAR - -#define SCALAR Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 8, Kokkos::OpenMP>> - -template void writeResultsVTK<SCALAR, local_ordinal_type, global_ordinal_type>( - const katoptron::Problem &, - Teuchos::RCP<Tpetra::Vector<SCALAR, local_ordinal_type, global_ordinal_type>>, - Teuchos::RCP<katoptron::Map>, - Teuchos::RCP<RandomField<SCALAR, Kokkos::DefaultExecutionSpace>>, - std::string, - size_t, - bool, - bool); - -#undef SCALAR - -#define SCALAR Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 16, Kokkos::OpenMP>> - -template void writeResultsVTK<SCALAR, local_ordinal_type, global_ordinal_type>( - const katoptron::Problem &, - Teuchos::RCP<Tpetra::Vector<SCALAR, local_ordinal_type, global_ordinal_type>>, - Teuchos::RCP<katoptron::Map>, - Teuchos::RCP<RandomField<SCALAR, Kokkos::DefaultExecutionSpace>>, - std::string, - size_t, - bool, - bool); - -#undef SCALAR - -#define SCALAR Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 24, Kokkos::OpenMP>> - -template void writeResultsVTK<SCALAR, local_ordinal_type, global_ordinal_type>( - const katoptron::Problem &, - Teuchos::RCP<Tpetra::Vector<SCALAR, local_ordinal_type, global_ordinal_type>>, - Teuchos::RCP<katoptron::Map>, - Teuchos::RCP<RandomField<SCALAR, Kokkos::DefaultExecutionSpace>>, - std::string, - size_t, - bool, - bool); - -#undef SCALAR - -#define SCALAR Sacado::MP::Vector<Stokhos::StaticFixedStorage<int, double, 32, Kokkos::OpenMP>> - -template void writeResultsVTK<SCALAR, local_ordinal_type, global_ordinal_type>( - const katoptron::Problem &, - Teuchos::RCP<Tpetra::Vector<SCALAR, local_ordinal_type, global_ordinal_type>>, - Teuchos::RCP<katoptron::Map>, - Teuchos::RCP<RandomField<SCALAR, Kokkos::DefaultExecutionSpace>>, - std::string, - size_t, - bool, - bool); - -#undef SCALAR diff --git a/katoptron/src/SourcesList.h b/katoptron/src/SourcesList.h deleted file mode 100644 index 2c262ff6..00000000 --- a/katoptron/src/SourcesList.h +++ /dev/null @@ -1,164 +0,0 @@ -#ifndef KATOPTRON_SOURCESLIST_H -#define KATOPTRON_SOURCESLIST_H - -#include "katoptron.h" - -#include "Map.h" -#include "wSource.h" -#include "wTag.h" - -#include <Tpetra_Map.hpp> -#include <Tpetra_Vector.hpp> -#include <Teuchos_RCP.hpp> -#include <Kokkos_ViewFactory.hpp> - -namespace katoptron -{ - -/** - * @brief Class which is used to store the list of the volumetric heat sources. - */ -template <typename scalar> -class SourcesList -{ - typedef Map::local_ordinal_type local_ordinal_type; - typedef Map::global_ordinal_type global_ordinal_type; - -private: - Kokkos::View<int **, Kokkos::LayoutRight> sources_elementsList; - Kokkos::View<scalar ***, Kokkos::LayoutRight> sources_values_list; - - local_ordinal_type sources_number; - local_ordinal_type sources_size; - local_ordinal_type sources_elements; - - local_ordinal_type sources_time; - local_ordinal_type sources_values; - -public: - SourcesList(); - SourcesList(Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList); - - /** - * @brief Return the number of sources. - */ - inline local_ordinal_type getSourceNumber() { return sources_number; } - - /** - * @brief Return the number of elements for a - * given source. - * - * Argument: - * <ul> - * <li> i: the source ID. - * </ul> - */ - inline local_ordinal_type getSourceSize(local_ordinal_type i) - { - return sources_elementsList(i, sources_size); - } - - /** - * @brief Return the local ID of the element e1 of - * a source. - * - * Arguments: - * <ul> - * <li> i: the source ID, - * <li> e1: the ID of the element on the current BC. - * </ul> - */ - inline local_ordinal_type getSourceElement(local_ordinal_type i, local_ordinal_type ea) - { - return sources_elementsList(i, sources_elements + ea); - } - - /** - * @brief Return the value of the source. - * - * Argument: - * <ul> - * <li> i: the source ID. - * </ul> - */ - inline scalar getSourceValue(local_ordinal_type i) - { - return sources_values_list(i, 0, sources_values); - } -}; - -/** - * @brief SourcesList constructor - * - * This constructor allocates 2 Kokkos::View which store all the required information related to source, including: - * <ul> - * <li> all the source elements, - * <li> all the values of the heat source. - * </ul> - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> map: an RCP to a Map object, - * <li> elementsList: an RCP to an ElementList object. - * </ul> - */ -template <typename scalar> -SourcesList<scalar>::SourcesList(Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList) -{ - typedef local_ordinal_type local_ordinal_type; - typedef global_ordinal_type global_ordinal_type; - - sources_number = pbl.Sources.size(); - local_ordinal_type maxNumElemsPerSource = 0; - - std::vector<std::vector<global_ordinal_type>> SourceElems = {}; - - for (auto i = 0; i < sources_number; ++i) - { - std::vector<global_ordinal_type> mySourceElems = {}; - - for (auto j = 0; j < pbl.Sources[i]->tag->elems.size(); ++j) - { - local_ordinal_type e = map->mapElems->getLocalElement(pbl.Sources[i]->tag->elems[j]->no - 1); - - if (elementsList->getElementType(e) == static_cast<int>(tbox::ElType::TETRA4)) - ; - else if (elementsList->getElementType(e) == static_cast<int>(tbox::ElType::HEX8)) - ; - else - continue; - - mySourceElems.push_back(e); - } - - SourceElems.push_back(mySourceElems); - if (maxNumElemsPerSource < mySourceElems.size()) - maxNumElemsPerSource = mySourceElems.size(); - } - - sources_size = 0; - sources_elements = 1; - sources_elementsList = Kokkos::View<int **, Kokkos::LayoutRight>("R", sources_number, sources_elements + maxNumElemsPerSource); - - for (auto i = 0; i < sources_number; ++i) - { - sources_elementsList(i, sources_size) = SourceElems[i].size(); - - for (auto j = 0; j < SourceElems[i].size(); ++j) - sources_elementsList(i, sources_elements + j) = SourceElems[i][j]; - } - - sources_time = 0; - sources_values = 1; - sources_values_list = Kokkos::View<scalar ***, Kokkos::LayoutRight>("R", sources_number, 1, 2); - for (auto i = 0; i < sources_number; ++i) - { - sources_values_list(i, 0, sources_time) = 0.; //to change latter - - sources_values_list(i, 0, sources_values) = pbl.Sources[i]->value; - } -} -}; // namespace katoptron - -#endif //KATOPTRON_SOURCESLIST_H diff --git a/katoptron/src/StressComputation.h b/katoptron/src/StressComputation.h deleted file mode 100644 index ec6c1e81..00000000 --- a/katoptron/src/StressComputation.h +++ /dev/null @@ -1,133 +0,0 @@ -#ifndef KATOPTRON_STRESSCOMPUTATION_H -#define KATOPTRON_STRESSCOMPUTATION_H - -#include "wHex8.h" -#include "wSfHex8.h" -#include "wGaussHex8.h" -#include "wCacheHex8.h" - -#include "wTetra4.h" -#include "wSfTetra4.h" -#include "wGaussTetra4.h" -#include "wCacheTetra4.h" - -/** - * @brief Those functions compute the stress and strain at nodes and in average per element. - * They are currently implemented using Eigen data structure but should be refactored using Kokkos:view - * such that it will be possible to use parallel for in the future. - */ - -void strain_at_gp(size_t n_n, tbox::Element &el, tbox::Cache &cache, size_t a, const Eigen::MatrixXd &u_e, Eigen::MatrixXd &Strain) -{ - Eigen::MatrixXd const &J = el.getJinv(a); - Eigen::MatrixXd const &dffi = cache.getDsf(a); - Eigen::Matrix3d du_d_Phi = Eigen::Matrix3d::Zero(); - for (size_t i = 0; i < n_n; ++i) - { - for (auto k = 0; k < 3; ++k) - for (auto j = 0; j < 3; ++j) - du_d_Phi(j, k) += dffi(j, i) * u_e(k, i); - } - Strain += (J * du_d_Phi).transpose() * (J * du_d_Phi) * 0.5; -} - -void compute_stress(size_t n_n, const Eigen::MatrixXd &Strain, Eigen::MatrixXd &Stress, const Eigen::MatrixXd &H, const Eigen::MatrixXd &D, const std::vector<double> &T, bool thermal) -{ - Stress = Eigen::Matrix3d::Zero(); - for (size_t i = 0; i < 3; ++i) - for (size_t j = 0; j < 3; ++j) - for (size_t k = 0; k < 3; ++k) - for (size_t l = 0; l < 3; ++l) - Stress(i, j) += H(i * 3 + j, k * 3 + l) * Strain(k, l); - - if (thermal) - for (size_t i = 0; i < 3; ++i) - for (size_t j = 0; j < 3; ++j) - { - double tmp = 0.; - for (size_t k = 0; k < n_n; ++k) - tmp += D(i, j) * T[k]; - tmp /= n_n; - Stress(i, j) += tmp; - } -} - -void strain_stress_x_y_z(tbox::Element *elem, Eigen::MatrixXd &Strain, Eigen::MatrixXd &Stress, const Eigen::MatrixXd &H, const Eigen::MatrixXd &D, const std::vector<double> &x, const std::vector<double> &y, const std::vector<double> &z, const std::vector<double> &T, bool thermal = false) -{ - tbox::Cache &cache = elem->getVCache(); - - size_t n_gp = cache.getVGauss().getN(); - size_t n_n = elem->nodes.size(); - - Eigen::MatrixXd u_e(3, n_n); - - for (size_t i = 0; i < n_n; ++i) - { - u_e(0, i) = x[i]; - u_e(1, i) = y[i]; - u_e(2, i) = z[i]; - } - - Strain = Eigen::Matrix3d::Zero(); - for (size_t a = 0; a < n_gp; ++a) - { - strain_at_gp(n_n, *elem, cache, a, u_e, Strain); - } - Strain /= n_n; - - compute_stress(n_n, Strain, Stress, H, D, T, thermal); -} - -void strain_stress_x_y_z_at_node(tbox::Element *elem, std::vector<Eigen::MatrixXd> &Strain_at_node, std::vector<Eigen::MatrixXd> &Stress_at_node, const Eigen::MatrixXd &H, const Eigen::MatrixXd &D, const std::vector<double> &x, const std::vector<double> &y, const std::vector<double> &z, const std::vector<double> &T, bool thermal = false) -{ - tbox::Cache &cache = elem->getVCache(); - - size_t n_gp = cache.getVGauss().getN(); - size_t n_n = elem->nodes.size(); - - std::vector<Eigen::MatrixXd> Strain_at_gp(n_gp); - std::vector<Eigen::MatrixXd> Stress_at_gp(n_gp); - Eigen::MatrixXd u_e(3, n_n); - Eigen::MatrixXd Strain(3, 3); - - for (auto &k : Strain_at_gp) - k.resize(3, 3); - for (auto &k : Stress_at_gp) - k.resize(3, 3); - - for (size_t i = 0; i < n_n; ++i) - { - u_e(0, i) = x[i]; - u_e(1, i) = y[i]; - u_e(2, i) = z[i]; - } - - for (size_t a = 0; a < n_gp; ++a) - { - Strain = Eigen::Matrix3d::Zero(); - strain_at_gp(n_n, *elem, cache, a, u_e, Strain); - Strain_at_gp[a] = Strain; - compute_stress(n_n, Strain, Stress_at_gp[a], H, D, T, thermal); - } - - // Extrapolation at node points - Eigen::MatrixXd values_at_gp(n_gp, 18); - for (size_t i = 0; i < 3; ++i) - for (size_t j = 0; j < 3; ++j) - for (size_t a = 0; a < n_gp; ++a) - { - values_at_gp(a, i * 3 + j) = Strain_at_gp[a](i, j); - values_at_gp(a, 9 + i * 3 + j) = Stress_at_gp[a](i, j); - } - - Eigen::MatrixXd values_at_node = elem->gp2node(values_at_gp); - for (size_t k = 0; k < n_n; ++k) - for (size_t i = 0; i < 3; ++i) - for (size_t j = 0; j < 3; ++j) - { - Strain_at_node[k](i, j) = values_at_node(k, i * 3 + j); - Stress_at_node[k](i, j) = values_at_node(k, 9 + i * 3 + j); - } -} - -#endif //KATOPTRON_STRESSCOMPUTATION_H \ No newline at end of file diff --git a/katoptron/src/Vectors.h b/katoptron/src/Vectors.h deleted file mode 100644 index 5a5069f1..00000000 --- a/katoptron/src/Vectors.h +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef KATOPTRON_VECTORS_H -#define KATOPTRON_VECTORS_H - -#include "katoptron.h" - -#include "Map.h" - -#include <Tpetra_Map.hpp> -#include <Tpetra_Vector.hpp> -#include <Teuchos_RCP.hpp> -#include <Xpetra_BlockedMultiVector.hpp> -#include <Xpetra_MultiVector.hpp> - -namespace katoptron -{ - -/** - * @brief Class which includes all the Trilinos vectors (Tpetra vectors and Xpetra vectors) used - * in the simulation. - */ -template <typename scalar> -class Vectors -{ -public: - // - // Convenience typedefs - // - typedef Map::local_ordinal_type local_ordinal_type; - typedef Map::global_ordinal_type global_ordinal_type; - typedef Map::node_type node_type; - typedef Map::tpetra_map_type tpetra_map_type; - typedef Map::xpetra_bmap_type xpetra_bmap_type; - - typedef Tpetra::Vector<scalar, local_ordinal_type, global_ordinal_type, node_type> tpetra_vector_type; - typedef Tpetra::MultiVector<scalar, local_ordinal_type, global_ordinal_type, node_type> tpetra_mvector_type; - - typedef Xpetra::BlockedMultiVector<scalar, local_ordinal_type, global_ordinal_type, node_type> xpetra_bmvector_type; - typedef Xpetra::MultiVector<scalar, local_ordinal_type, global_ordinal_type, node_type> xpetra_mvector_type; - typedef Xpetra::TpetraMultiVector<scalar, local_ordinal_type, global_ordinal_type, node_type> xpetra_tmvector_type; - - Teuchos::RCP<tpetra_vector_type> bWO; - Teuchos::RCP<tpetra_vector_type> b; - - Teuchos::RCP<tpetra_vector_type> weights; - - Teuchos::RCP<tpetra_vector_type> x; - Teuchos::RCP<tpetra_vector_type> lagrange; - - Teuchos::RCP<tpetra_vector_type> initialGap; - - Teuchos::RCP<xpetra_bmvector_type> rhsBlockedMultiVector; - Teuchos::RCP<xpetra_bmvector_type> solutionBlockedMultiVector; - - Teuchos::RCP<xpetra_mvector_type> rhsMultiVector; - Teuchos::RCP<xpetra_mvector_type> solutionMultiVector; - - Vectors(Teuchos::RCP<Map> map); -}; - -/** - * @brief Vectors constructor - * - * Argument: - * <ul> - * <li> graph: an RCP to a Map object. - * </ul> - */ -template <typename scalar> -Vectors<scalar>::Vectors(Teuchos::RCP<Map> map) -{ - bWO = rcp(new tpetra_vector_type(map->mapDofsWO, true)); - b = rcp(new tpetra_vector_type(map->mapDofs, true)); - x = rcp(new tpetra_vector_type(map->mapDofs, true)); - weights = rcp(new tpetra_vector_type(map->mapDofs, true)); -} -}; // namespace katoptron - -#endif //KATOPTRON_VECTORS_H diff --git a/katoptron/src/WeightsList.h b/katoptron/src/WeightsList.h deleted file mode 100644 index bf1cbe4d..00000000 --- a/katoptron/src/WeightsList.h +++ /dev/null @@ -1,200 +0,0 @@ -#ifndef KATOPTRON_WEIGHTSLIST_H -#define KATOPTRON_WEIGHTSLIST_H - -#include "katoptron.h" - -#include "Map.h" -#include "wWeight.h" -#include "wTag.h" - -#include <Tpetra_Map.hpp> -#include <Tpetra_Vector.hpp> -#include <Teuchos_RCP.hpp> -#include <Kokkos_ViewFactory.hpp> - -#include "EnsembleTraits.h" - -using Teuchos::RCP; - -namespace katoptron -{ - -/** - * @brief Class which is used to store the list of the weights used - * for the residual computation. - */ -template <typename scalar> -class WeightsList -{ - typedef Map::local_ordinal_type local_ordinal_type; - typedef Map::global_ordinal_type global_ordinal_type; - -private: - Kokkos::View<int **, Kokkos::LayoutRight> weights_nodesList; - Kokkos::View<scalar **, Kokkos::LayoutRight> weights_values_list; - - local_ordinal_type weights_number; - local_ordinal_type weights_size; - local_ordinal_type weights_nodes; - - local_ordinal_type weights_dofs; - local_ordinal_type weights_values; - -public: - WeightsList(Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList); - - /** - * @brief Return the number of weighted regions. - */ - inline local_ordinal_type getWeightRegionsNumber() - { - return weights_number; - } - - /** - * @brief Return the number of nodes for a - * given weighted region. - * - * Argument: - * <ul> - * <li> i: the weighted region ID. - * </ul> - */ - inline local_ordinal_type getWeightRegionSize(local_ordinal_type i) - { - return weights_nodesList(i, weights_size); - } - - /** - * @brief Return the global ID of the node n1 of - * a given weighted region. - * - * Arguments: - * <ul> - * <li> i: the weighted region ID, - * <li> n1: the ID of the node on the current BC. - * </ul> - */ - inline local_ordinal_type getNode(local_ordinal_type i, local_ordinal_type n1) - { - return weights_nodesList(i, weights_nodes + n1); - } - - /** - * @brief Return whether the DOF j is weighted for - * a given weighted region. - * - * Arguments: - * <ul> - * <li> i: the weighted region ID, - * <li> j: the index of the DOF (0-3 if thermomechanical problems). - * </ul> - */ - inline bool getWeightDof(local_ordinal_type i, local_ordinal_type j) - { - return (weights_values_list(i, weights_dofs + j) == scalar(1.)); - } - - /** - * @brief Return the value of weight for the - * DOF for a given weighted region. - * - * Arguments: - * <ul> - * <li> i: the weighted region ID, - * <li> j: the index of the DOF (0-3 if thermomechanical problems). - * </ul> - */ - inline scalar getWeightValue(local_ordinal_type i, local_ordinal_type j) - { - return weights_values_list(i, weights_values + j); - } -}; - -/** - * @brief WeightsList constructor - * - * This constructor allocates 2 Kokkos::View which store all the required information related to each weighted region, including: - * <ul> - * <li> all the weighted nodes, - * <li> all the values of the weights. - * </ul> - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> map: an RCP to a Map object, - * <li> elementsList: an RCP to an ElementList object. - * </ul> - */ -template <typename scalar> -WeightsList<scalar>::WeightsList(Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList) -{ - typedef EnsembleTraits<scalar> ET; - const int ensemble_size = ET::size; - - local_ordinal_type numDPN = map->numPrimalDPN; - - weights_number = pbl.Weights.size(); - local_ordinal_type maxNumNodesPerWeight = 0; - - std::vector<std::vector<global_ordinal_type>> WeightNodes = {}; - - for (auto i = 0; i < weights_number; ++i) - { - std::vector<global_ordinal_type> tmpMyWeightNodes = {}; - std::vector<global_ordinal_type> myWeightNodes = {}; - - for (auto j = 0; j < pbl.Weights[i]->nodes.size(); ++j) - tmpMyWeightNodes.push_back(pbl.Weights[i]->nodes[j]->row); - - std::sort(tmpMyWeightNodes.begin(), tmpMyWeightNodes.end()); - - if (tmpMyWeightNodes.size() >= 1) - myWeightNodes.push_back(tmpMyWeightNodes[0]); - - for (auto ii = 1; ii < tmpMyWeightNodes.size(); ++ii) - if (tmpMyWeightNodes[ii] != tmpMyWeightNodes[ii - 1]) - myWeightNodes.push_back(tmpMyWeightNodes[ii]); - - WeightNodes.push_back(myWeightNodes); - if (maxNumNodesPerWeight < myWeightNodes.size()) - maxNumNodesPerWeight = myWeightNodes.size(); - } - - weights_size = 0; - weights_nodes = 1; - weights_nodesList = Kokkos::View<int **, Kokkos::LayoutRight>("R", weights_number, weights_nodes + maxNumNodesPerWeight); - - for (auto i = 0; i < weights_number; ++i) - { - weights_nodesList(i, weights_size) = WeightNodes[i].size(); - - for (auto j = 0; j < WeightNodes[i].size(); ++j) - weights_nodesList(i, weights_nodes + j) = WeightNodes[i][j]; - } - - weights_dofs = 0; - weights_values = weights_dofs + numDPN; - weights_values_list = Kokkos::View<scalar **, Kokkos::LayoutRight>("R", weights_number, 2 * numDPN); - for (auto i = 0; i < weights_number; ++i) - { - for (auto j = 0; j < numDPN; ++j) - if (pbl.Weights[i]->which_dof[j]) - weights_values_list(i, weights_dofs + j) = 1; - else - weights_values_list(i, weights_dofs + j) = 0; - - for (int s = 0; s < ensemble_size; ++s) - { - ET::coeff(weights_values_list(i, weights_values + 0), s) = pbl.Weights[i]->x_values[s]; - ET::coeff(weights_values_list(i, weights_values + 1), s) = pbl.Weights[i]->y_values[s]; - ET::coeff(weights_values_list(i, weights_values + 2), s) = pbl.Weights[i]->z_values[s]; - if (numDPN == 4) - ET::coeff(weights_values_list(i, weights_values + 3), s) = pbl.Weights[i]->T_values[s]; - } - } -} -}; // namespace katoptron - -#endif //KATOPTRON_WEIGHTSLIST_H \ No newline at end of file diff --git a/katoptron/src/katoptron.h b/katoptron/src/katoptron.h deleted file mode 100644 index b59bf330..00000000 --- a/katoptron/src/katoptron.h +++ /dev/null @@ -1,37 +0,0 @@ -// global header of the "katoptron" module - -#ifndef KATOPTRON_H -#define KATOPTRON_H - -#if defined(WIN32) -#ifdef tlnos_EXPORTS -#define KATOPTRON_API __declspec(dllexport) -#else -#define KATOPTRON_API __declspec(dllimport) -#endif -#else -#define KATOPTRON_API -#endif - -#include "tbox.h" - -/** - * @brief katoptron namespace - */ - -namespace katoptron -{ -class Problem; -class Solver; -class Dirichlet; -class Neumann; -class Medium; -class Contact; -class Source; -class RandomVariable; -class Weight; -}; // namespace katoptron - -class DisplayHook; - -#endif //KATOPTRON_H diff --git a/katoptron/src/tMatrix.h b/katoptron/src/tMatrix.h deleted file mode 100644 index 33365523..00000000 --- a/katoptron/src/tMatrix.h +++ /dev/null @@ -1,223 +0,0 @@ -#ifndef KATOPTRON_TMATRIX_H -#define KATOPTRON_TMATRIX_H - -#include "Stokhos_Tpetra_MP_Vector.hpp" - -template <class T, int rows> -class tVector; - -template <class T, int rows, int cols> -class tMatrix -{ -public: - tMatrix() - { - for (auto i = 0; i < rows; ++i) - for (auto j = 0; j < cols; ++j) - data[i * cols + j] = (T)0; - } - T &operator()(int row, int col); - tMatrix operator+(tMatrix rhs); - void operator+=(tMatrix rhs); - T det(); //only for 3x3 - tMatrix inv(); //only for 3x3 - tMatrix operator*(tMatrix rhs); - tVector<T, rows> operator*(tVector<T, cols> rhs); - template <class U> - tVector<typename Sacado::Promote<T, U>::type, rows> operator*(tVector<U, cols> rhs); - void print(); - void clean() - { - for (auto i = 0; i < rows; ++i) - for (auto j = 0; j < cols; ++j) - data[i * cols + j] = (T)0; - } - -private: - T data[rows * cols]; - int numRows = rows; - int numCols = cols; - int getRows() { return numRows; } - int getCols() { return numCols; } -}; - -template <class T, int rows, int cols> -template <class U> -tVector<typename Sacado::Promote<T, U>::type, rows> tMatrix<T, rows, cols>::operator*(tVector<U, cols> rhs) -{ - tVector<typename Sacado::Promote<T, U>::type, rows> results; - for (auto i = 0; i < rows; ++i) - for (auto j = 0; j < cols; ++j) - results(i) += data[i * cols + j] * rhs(j); - return results; -} - -template <class T, int rows, int cols> -tMatrix<T, rows, cols> tMatrix<T, rows, cols>::operator+(tMatrix<T, rows, cols> rhs) -{ - tMatrix<T, rows, cols> results; - for (auto i = 0; i < rows; ++i) - for (auto j = 0; j < cols; ++j) - results(i, j) = data[i * cols + j] + rhs(i, j); - return results; -} - -template <class T, int rows, int cols> -void tMatrix<T, rows, cols>::operator+=(tMatrix<T, rows, cols> rhs) -{ - for (auto i = 0; i < rows; ++i) - for (auto j = 0; j < cols; ++j) - data[i * cols + j] += rhs(i, j); -} - -template <class T, int rows, int cols> -tMatrix<T, rows, cols> tMatrix<T, rows, cols>::operator*(tMatrix<T, rows, cols> rhs) -{ - tMatrix<T, rows, cols> results; - for (auto i = 0; i < rows; ++i) - for (auto j = 0; j < rows; ++j) - for (auto k = 0; k < rows; ++k) - results(i, j) += data[i * cols + k] * rhs(k, j); - return results; -} - -template <class T, int rows, int cols> -T &tMatrix<T, rows, cols>::operator()(int row, int col) -{ - return data[row * cols + col]; -} - -template <class T, int rows, int cols> -T tMatrix<T, rows, cols>::det() -{ - return data[0 * cols + 0] * (data[1 * cols + 1] * data[2 * cols + 2] - data[1 * cols + 2] * data[2 * cols + 1]) - data[0 * cols + 1] * (data[1 * cols + 0] * data[2 * cols + 2] - data[1 * cols + 2] * data[2 * cols + 0]) + data[0 * cols + 2] * (data[1 * cols + 0] * data[2 * cols + 1] - data[1 * cols + 1] * data[2 * cols + 0]); -} - -template <class T, int rows, int cols> -tMatrix<T, rows, cols> tMatrix<T, rows, cols>::inv() -{ - tMatrix<T, rows, cols> results; - T det = this->det(); - results(0, 0) = (1. / det) * (data[1 * cols + 1] * data[2 * cols + 2] - data[1 * cols + 2] * data[2 * cols + 1]); - results(0, 1) = (1. / det) * (data[0 * cols + 2] * data[2 * cols + 1] - data[2 * cols + 2] * data[0 * cols + 1]); - results(0, 2) = (1. / det) * (data[0 * cols + 1] * data[1 * cols + 2] - data[1 * cols + 1] * data[0 * cols + 2]); - - results(1, 0) = (1. / det) * (data[1 * cols + 2] * data[2 * cols + 0] - data[2 * cols + 2] * data[1 * cols + 0]); - results(1, 1) = (1. / det) * (data[0 * cols + 0] * data[2 * cols + 2] - data[2 * cols + 0] * data[0 * cols + 2]); - results(1, 2) = (1. / det) * (data[0 * cols + 2] * data[1 * cols + 0] - data[1 * cols + 2] * data[0 * cols + 0]); - - results(2, 0) = (1. / det) * (data[1 * cols + 0] * data[2 * cols + 1] - data[2 * cols + 0] * data[1 * cols + 1]); - results(2, 1) = (1. / det) * (data[0 * cols + 1] * data[2 * cols + 0] - data[2 * cols + 1] * data[0 * cols + 0]); - results(2, 2) = (1. / det) * (data[0 * cols + 0] * data[1 * cols + 1] - data[1 * cols + 0] * data[0 * cols + 1]); - return results; -} - -template <class T, int rows, int cols> -tVector<T, rows> tMatrix<T, rows, cols>::operator*(tVector<T, cols> rhs) -{ - tVector<T, rows> results; - for (auto i = 0; i < rows; ++i) - for (auto j = 0; j < cols; ++j) - results(i) += data[i * cols + j] * rhs(j); - return results; -} - -template <class T, int rows, int cols> -void tMatrix<T, rows, cols>::print() -{ - for (auto i = 0; i < rows; ++i) - { - for (auto j = 0; j < cols; ++j) - std::cout << data[i * cols + j] << " "; - std::cout << std::endl; - } -} - -template <class T, int rows> -class tVector -{ -public: - tVector() - { - for (auto i = 0; i < rows; ++i) - data[i] = (T)0; - } - T &operator()(int row); - tVector operator+(tVector rhs); - void operator+=(tVector rhs); - T dotproduct(tVector rhs); - template <class U> - typename Sacado::Promote<T, U>::type dotproduct(tVector<U, rows> rhs); - tMatrix<T, rows, rows> ddotproduct(tVector rhs); - void print(); - void clean() - { - for (auto i = 0; i < rows; ++i) - data[i] = (T)0; - } - -private: - T data[rows]; - int numRows = rows; - int getRows() { return numRows; } -}; - -template <class T, int rows> -T &tVector<T, rows>::operator()(int row) -{ - return data[row]; -} - -template <class T, int rows> -tVector<T, rows> tVector<T, rows>::operator+(tVector<T, rows> rhs) -{ - tVector<T, rows> results; - for (auto i = 0; i < rows; ++i) - results(i) = data[i] + rhs(i); - return results; -} - -template <class T, int rows> -void tVector<T, rows>::operator+=(tVector<T, rows> rhs) -{ - for (auto i = 0; i < rows; ++i) - data[i] += rhs(i); -} - -template <class T, int rows> -T tVector<T, rows>::dotproduct(tVector<T, rows> rhs) -{ - T result = (T)0; - for (auto i = 0; i < rows; ++i) - result += data[i] * rhs(i); - return result; -} - -template <class T, int rows> -template <class U> -typename Sacado::Promote<T, U>::type tVector<T, rows>::dotproduct(tVector<U, rows> rhs) -{ - typename Sacado::Promote<T, U>::type result = 0; - for (auto i = 0; i < rows; ++i) - result += data[i] * rhs(i); - return result; -} - -template <class T, int rows> -tMatrix<T, rows, rows> tVector<T, rows>::ddotproduct(tVector<T, rows> rhs) -{ - tMatrix<T, rows, rows> results; - for (auto i = 0; i < rows; ++i) - for (auto j = 0; j < rows; ++j) - results(i, j) = data[i] * rhs(j); - return results; -} - -template <class T, int rows> -void tVector<T, rows>::print() -{ - for (auto i = 0; i < rows; ++i) - std::cout << data[i] << std::endl; -} - -#endif //KATOPTRON_TMATRIX_H diff --git a/katoptron/src/wContact.cpp b/katoptron/src/wContact.cpp deleted file mode 100644 index b6b78817..00000000 --- a/katoptron/src/wContact.cpp +++ /dev/null @@ -1,443 +0,0 @@ -#include "wContact.h" -#include "wProblem.h" -#include "wTag.h" -#include "wElement.h" -#include "wNode.h" -#include <algorithm> - -#include <fstream> -#include <sstream> -#include <string> - -using namespace katoptron; -using namespace tbox; - -bool searchCode(char const *code, char const *line) -{ - return !(strncmp(code, line, strlen(code))); -} - -bool searchCode(char const *code, std::string const line) -{ - return !(strncmp(code, line.c_str(), strlen(code))); -} - -bool searchCode(std::string const code, std::string const line) -{ - return line.find(code) != std::string::npos; -} - -void readGMSH(std::string const &file_name, std::string const &name, std::vector<int> &nodes) -{ - std::cout << file_name << ": start " << std::endl; - std::vector<int> nodes_tmp; - std::ifstream infile(file_name); - int tag = 0; - std::string line; - bool reading_physical_names = false; - while (std::getline(infile, line)) - { - if (reading_physical_names) - { - if (searchCode("$EndPhysicalNames", line)) - break; - - if (searchCode(name, line)) - { - std::istringstream line_stream(line); - int dim = 0, no = 0; - line_stream >> dim >> no; - tag = no; - std::cout << "tag: " << tag << std::endl; - reading_physical_names = false; - } - } - else if (searchCode("$Elements", line)) - { - std::getline(infile, line); - std::istringstream line_stream(line); - // read number of elements - int nbelm = 0; - - line_stream >> nbelm; - - for (int i = 0; i < nbelm; ++i) - { - std::getline(infile, line); - std::istringstream line_stream(line); - - // read number, type and nb of tags - int no = 0, type = 0, nbtags = 0; - int tmp; - - line_stream >> no >> type >> nbtags; - // read/create/link tags - - bool do_I_continue = true; - for (int j = 0; j < nbtags; ++j) - { - line_stream >> tmp; - if (tag == tmp) - do_I_continue = false; - } - if (do_I_continue) - continue; - - int n = 0; - // read nodes - if (type == static_cast<int>(ElType::HEX8)) // 8-node hexa - n = 8; - else if (type == static_cast<int>(ElType::QUAD4)) // 4-node quad - n = 4; - else if (type == static_cast<int>(ElType::TETRA4)) // 4-node tetra - n = 4; - else if (type == static_cast<int>(ElType::LINE2)) // 2-node line - n = 2; - else if (type == static_cast<int>(ElType::POINT1)) // 1-node point - n = 1; - else if (type == static_cast<int>(ElType::TRI3)) // 3-node triangle - n = 3; - else - { - continue; - } - int nn; - for (int j = 0; j < n; ++j) - { - line_stream >> nn; - nodes_tmp.push_back(nn - 1); - } - } - } - else if (searchCode("$EndElements", line)) - { - std::cout << "nodes_tmp.size(): " << nodes_tmp.size() << std::endl; - if (nodes_tmp.size() > 0) - { - std::sort(nodes_tmp.begin(), nodes_tmp.end()); - - nodes.push_back(nodes_tmp[0]); - - for (auto i = 1; i < nodes_tmp.size(); ++i) - if (nodes_tmp[i] != nodes_tmp[i - 1]) - nodes.push_back(nodes_tmp[i]); - } - std::cout << "nodes.size(): " << nodes.size() << std::endl; - break; - } - else if (searchCode("$PhysicalNames", line)) - { - reading_physical_names = true; - } - } -} - -/** - * @brief Contact constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> no: the ID of the slave surface of the msh, - * <li> _Contact_name: the name of new contact interface (does not have to be a nametag of the msh), - * <li> _slave_normal: the slave normal, - * <li> dg: the initial displacement along the slave normal. - * </ul> - */ -Contact::Contact(katoptron::Problem &pbl, int no, std::string _Contact_name, Eigen::Vector3d _slave_normal, double _dg) : Group(pbl.msh, no), Contact_name(_Contact_name), slave_normal(_slave_normal), dg(_dg) -{ - dg_vector = {dg}; - for (auto e : tag->elems) - slave_elems.push_back(e); -} - -/** - * @brief Contact constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> name: the name of the slave surface of the msh, - * <li> _Contact_name: the name of new contact interface (does not have to be a nametag of the msh), - * <li> _slave_normal: the slave normal, - * <li> dg: the initial displacement along the slave normal. - * </ul> - */ -Contact::Contact(katoptron::Problem &pbl, std::string const &name, std::string _Contact_name, Eigen::Vector3d _slave_normal, double _dg) : Group(pbl.msh, name), Contact_name(_Contact_name), slave_normal(_slave_normal), dg(_dg) -{ - dg_vector = {dg}; - for (auto e : tag->elems) - slave_elems.push_back(e); -} - -/** - * @brief Contact constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> no: the ID of the slave surface of the msh, - * <li> _Contact_name: the name of new contact interface (does not have to be a nametag of the msh), - * <li> _slave_normal: the slave normal, - * <li> _dg: the initial displacement along the slave normal (value can be different for the different samples). - * </ul> - */ -Contact::Contact(katoptron::Problem &pbl, int no, std::string _Contact_name, Eigen::Vector3d _slave_normal, std::vector<double> _dg) : Group(pbl.msh, no), Contact_name(_Contact_name), slave_normal(_slave_normal) -{ - dg = _dg[0]; - dg_vector = _dg; - - for (auto e : tag->elems) - slave_elems.push_back(e); -} - -/** - * @brief Contact constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> name: the name of the slave surface of the msh, - * <li> _Contact_name: the name of new contact interface (does not have to be a nametag of the msh), - * <li> _slave_normal: the slave normal, - * <li> _dg: the initial displacement along the slave normal (value can be different for the different samples). - * </ul> - */ -Contact::Contact(katoptron::Problem &pbl, std::string const &name, std::string _Contact_name, Eigen::Vector3d _slave_normal, std::vector<double> _dg) : Group(pbl.msh, name), Contact_name(_Contact_name), slave_normal(_slave_normal) -{ - dg = _dg[0]; - dg_vector = _dg; - - for (auto e : tag->elems) - slave_elems.push_back(e); -} - -/** - * @brief Set the master surface - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> no: the ID of the master surface of the msh, - * <li> _master_normal: the master normal. - * </ul> - */ -void Contact::setMaster(katoptron::Problem &pbl, int no, Eigen::Vector3d _master_normal) -{ - master_normal = _master_normal; - Group master_group(pbl.msh, no); - Tag *master_tag = master_group.tag; - for (auto e : master_tag->elems) - master_elems.push_back(e); - - pbl.Contacts.push_back(this); -} - -/** - * @brief Set the master surface - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> name: the name of the master surface of the msh, - * <li> _master_normal: the master normal. - * </ul> - */ -void Contact::setMaster(katoptron::Problem &pbl, std::string const &name, Eigen::Vector3d _master_normal) -{ - master_normal = _master_normal; - Group master_group(pbl.msh, name); - Tag *master_tag = master_group.tag; - for (auto e : master_tag->elems) - master_elems.push_back(e); - - pbl.Contacts.push_back(this); -} - -/** - * @brief Set slave boundary (optional) - * - * Arguments: - * <ul> - * <li> file_name: name of the msh file to use, - * <li> name: the name of the slave boundary of the msh. - * </ul> - */ -void Contact::setSlaveBoundary(std::string const &file_name, std::string const &name) -{ - readGMSH(file_name, name, slave_boundary_nodes); - - std::cout << "slave_boundary_nodes.size(): " << slave_boundary_nodes.size() << std::endl; -} - -/** - * @brief Set master boundary (optional) - * - * Arguments: - * <ul> - * <li> file_name: name of the msh file to use, - * <li> name: the name of the master boundary of the msh. - * </ul> - */ -void Contact::setMasterBoundary(std::string const &file_name, std::string const &name) -{ - readGMSH(file_name, name, master_boundary_nodes); - - std::cout << "master_boundary_nodes.size(): " << master_boundary_nodes.size() << std::endl; -} - -/** - * @brief Set slave Dirichlet boundary (optional) - * - * Arguments: - * <ul> - * <li> file_name: name of the msh file to use, - * <li> name: the name of the slave Dirichlet boundary of the msh. - * </ul> - */ -void Contact::setSlaveDirichlet(std::string const &file_name, std::string const &name) -{ - readGMSH(file_name, name, slave_dirichlet_nodes); - - std::cout << "slave_dirichlet_nodes.size(): " << slave_dirichlet_nodes.size() << std::endl; - for (auto i = 0; i < slave_dirichlet_nodes.size(); ++i) - std::cout << slave_dirichlet_nodes[i] << std::endl; -} - -/** - * @brief Set master Dirichlet boundary (optional) - * - * Arguments: - * <ul> - * <li> file_name: name of the msh file to use, - * <li> name: the name of the master Dirichlet boundary of the msh. - * </ul> - */ -void Contact::setMasterDirichlet(std::string const &file_name, std::string const &name) -{ - readGMSH(file_name, name, master_dirichlet_nodes); - - std::cout << "master_dirichlet_nodes.size(): " << master_dirichlet_nodes.size() << std::endl; -} - -/** - * @brief Activate all the Lagrange multipliers associated to - * the current contact interface. - */ -void Contact::setInitialyClosed() -{ - initial_closed = true; -} - -/** - * @brief Inactivate all the Lagrange multipliers associated to - * the current contact interface. - */ -void Contact::setInitialyOpen() -{ - initial_closed = false; -} - -/** - * @brief Specify to the active set strategy that this interface - * should not be updated. - */ -void Contact::setNoUpdate() -{ - no_Update = true; -} - -/** - * @brief Specify to the active set strategy that this interface - * should be updated if required. - */ -void Contact::setUpdate() -{ - no_Update = false; -} - -/** - * @brief Replace this contact interface by a mesh tying interface. - */ -void Contact::setMeshTying() -{ - mesh_tying = true; - sticking = true; - no_Update = true; -} - -/** - * @brief Specify that this interface is sticking. - */ -void Contact::setSticking() -{ - sticking = true; -} - -/** - * @brief Specify that this interface is not sticking (default). - */ -void Contact::setNoSticking() -{ - sticking = false; -} - -/** - * @brief Specify that the discretization of the Lagrange multipliers - * use standard shape functions (default). - */ -void Contact::setStandardShapeFunctions() -{ - standard_shape_functions = true; -} - -/** - * @brief Specify that the discretization of the Lagrange multipliers - * use dual shape functions. - */ -void Contact::setDualShapeFunctions() -{ - standard_shape_functions = false; -} - -/** - * @brief Specify that this interface is a Signorini contact. - */ -void Contact::setSignoriniContact() -{ - is_Signorini = true; -} - -/** - * @brief Specify that this interface is a not Signorini contact (default). - */ -void Contact::setTwoBodyContact() -{ - is_Signorini = false; -} - -/** - * @brief Specify a list of slave nodes where the Lagrange multipliers should - * be initially closed. - */ -void Contact::setInitiallyClosedNodes(std::vector<double> _initially_closed_nodes) -{ - for (auto i = 0; i < _initially_closed_nodes.size(); ++i) - initially_closed_nodes.push_back(((int)_initially_closed_nodes[i])); -} - -/** - * @brief Specify the scale. - */ -void Contact::setScale(double a) -{ - scale = a; -} - -/** - * @brief Display information. - */ -void Contact::write(std::ostream &out) const -{ - out << "Contact interface named ''" << Contact_name << "'' on " << *tag << "\n"; -} \ No newline at end of file diff --git a/katoptron/src/wContact.h b/katoptron/src/wContact.h deleted file mode 100644 index 97f2ee3e..00000000 --- a/katoptron/src/wContact.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef KATOPTRON_CONTACT_H -#define KATOPTRON_CONTACT_H - -#include "katoptron.h" -#include "wGroup.h" -#include <vector> -#include <string> -#include <Eigen/Dense> - -namespace katoptron -{ - -/** - * @brief Class used to specify in Python the different contact interfaces. - */ -class KATOPTRON_API Contact : public tbox::Group -{ -public: - std::string Contact_name; - std::vector<tbox::Element *> slave_elems; - std::vector<tbox::Element *> master_elems; - - std::vector<int> slave_boundary_nodes; - std::vector<int> master_boundary_nodes; - - std::vector<int> slave_dirichlet_nodes; - std::vector<int> master_dirichlet_nodes; - - std::vector<int> initially_closed_nodes = {}; - - bool initial_closed = true; - bool standard_shape_functions = true; - bool is_Signorini = false; - bool no_Update = false; - bool sticking = false; - bool mesh_tying = false; - - int nb_Lagrange_multipliers = 1; - - Eigen::Vector3d slave_normal; - Eigen::Vector3d master_normal; - - double dg; - - double scale = 1.; - - std::vector<double> dg_vector; - - Contact(Problem &pbl, int no, std::string _Contact_name, Eigen::Vector3d _slave_normal, double dg = 0.); - Contact(Problem &pbl, std::string const &name, std::string _Contact_name, Eigen::Vector3d _slave_normal, double dg = 0.); - Contact(Problem &pbl, int no, std::string _Contact_name, Eigen::Vector3d _slave_normal, std::vector<double> _dg); - Contact(Problem &pbl, std::string const &name, std::string _Contact_name, Eigen::Vector3d _slave_normal, std::vector<double> _dg); - - void setMaster(katoptron::Problem &pbl, int no, Eigen::Vector3d _master_normal); - void setMaster(katoptron::Problem &pbl, std::string const &name, Eigen::Vector3d _master_normal); - - void setSlaveBoundary(std::string const &file_name, std::string const &name); - void setMasterBoundary(std::string const &file_name, std::string const &name); - - void setSlaveDirichlet(std::string const &file_name, std::string const &name); - void setMasterDirichlet(std::string const &file_name, std::string const &name); - - void setInitialyClosed(); - void setInitialyOpen(); - void setNoUpdate(); - void setUpdate(); - void setMeshTying(); - void setSticking(); - void setNoSticking(); - void setStandardShapeFunctions(); - void setDualShapeFunctions(); - void setSignoriniContact(); - void setTwoBodyContact(); - void setInitiallyClosedNodes(std::vector<double> _initially_closed_nodes); - void setScale(double a); - -#ifndef SWIG - virtual void write(std::ostream &out) const; -#endif -}; - -} // namespace katoptron - -#endif //KATOPTRON_CONTACT_H diff --git a/katoptron/src/wDirichlet.cpp b/katoptron/src/wDirichlet.cpp deleted file mode 100644 index a9d6c984..00000000 --- a/katoptron/src/wDirichlet.cpp +++ /dev/null @@ -1,200 +0,0 @@ -#include "wDirichlet.h" -#include "wProblem.h" -#include "wTag.h" -#include "wElement.h" -#include "wNode.h" -#include <algorithm> -using namespace katoptron; -using namespace tbox; - -/** - * @brief Dirichlet constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> name: the name of the constrained surface of the msh, - * <li> _BC_name: the name of new Dirichlet BC (does not have to be a nametag of the msh), - * <li> _which_dof: a vector that specify which degree(s) of freedom are constrained, - * <li> _values: a vector that specify the values of the constrained degree(s) of freedom - * if they are constrained (the length of _which_dof and _values must be the same), - * <li> ensemble_size: the ensemble size. - * </ul> - */ -Dirichlet::Dirichlet(katoptron::Problem &pbl, - std::string const &name, - std::string const &_BC_name, - std::vector<int> _which_dof, - std::vector<double> _values, - size_t ensemble_size) : Group(pbl.msh, name), BC_name(_BC_name), which_dof(_which_dof), values(_values) -{ - for (auto e : tag->elems) - for (auto n : e->nodes) - nodes.push_back(n); - - x_values = {}; - y_values = {}; - z_values = {}; - T_values = {}; - for (auto i = 0; i < ensemble_size; ++i) - { - x_values.push_back(values[0]); - y_values.push_back(values[1]); - z_values.push_back(values[2]); - T_values.push_back(values[3]); - } - pbl.duBCs.push_back(this); -} - -/** - * @brief Dirichlet constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> name: the name of the constrained surface of the msh, - * <li> _BC_name: the name of new Dirichlet BC (does not have to be a nametag of the msh), - * <li> x: a int which specify whether the x displacement component is constrained, - * <li> v_x: value of the constrained degree of freedom, - * <li> y: a int which specify whether the y displacement component is constrained, - * <li> v_y: value of the constrained degree of freedom, - * <li> z: a int which specify whether the z displacement component is constrained, - * <li> v_z: value of the constrained degree of freedom, - * <li> T: a int which specify whether the temperature is constrained, - * <li> v_T: value of the constrained degree of freedom, - * <li> ensemble_size: the ensemble size. - * </ul> - */ -Dirichlet::Dirichlet(Problem &pbl, - std::string const &name, - std::string const &_BC_name, - int x, - double v_x, - int y, - double v_y, - int z, - double v_z, - int T, - double v_T, - size_t ensemble_size) : Group(pbl.msh, name), BC_name(_BC_name) -{ - for (auto e : tag->elems) - for (auto n : e->nodes) - nodes.push_back(n); - - which_dof = {}; - which_dof.push_back(x); - which_dof.push_back(y); - which_dof.push_back(z); - which_dof.push_back(T); - - values = {}; - values.push_back(v_x); - values.push_back(v_y); - values.push_back(v_z); - values.push_back(v_T); - - x_values = {}; - y_values = {}; - z_values = {}; - T_values = {}; - for (auto i = 0; i < ensemble_size; ++i) - { - x_values.push_back(v_x); - y_values.push_back(v_y); - z_values.push_back(v_z); - T_values.push_back(v_T); - } - - pbl.duBCs.push_back(this); -} - -/** - * @brief Dirichlet constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> name: the name of the constrained surface of the msh, - * <li> _BC_name: the name of new Dirichlet BC (does not have to be a nametag of the msh), - * <li> x: a int which specify whether the x displacement component is constrained, - * <li> v_x: vector of values of the constrained degree of freedom (one per sample), - * <li> y: a int which specify whether the y displacement component is constrained, - * <li> v_y: vector of values of the constrained degree of freedom (one per sample), - * <li> z: a int which specify whether the z displacement component is constrained, - * <li> v_z: vector of values of the constrained degree of freedom (one per sample), - * <li> T: a int which specify whether the temperature is constrained, - * <li> v_T: vector of values of the constrained degree of freedom (one per sample). - * </ul> - */ -Dirichlet::Dirichlet(Problem &pbl, - std::string const &name, - std::string const &_BC_name, - int x, - std::vector<double> v_x, - int y, - std::vector<double> v_y, - int z, - std::vector<double> v_z, - int T, - std::vector<double> v_T) : Group(pbl.msh, name), BC_name(_BC_name) -{ - for (auto e : tag->elems) - for (auto n : e->nodes) - nodes.push_back(n); - - std::cout << v_x[0] << std::endl; - - which_dof = {}; - which_dof.push_back(x); - which_dof.push_back(y); - which_dof.push_back(z); - which_dof.push_back(T); - - values = {}; - values.push_back(v_x[0]); - values.push_back(v_y[0]); - values.push_back(v_z[0]); - values.push_back(v_T[0]); - - x_values = {}; - y_values = {}; - z_values = {}; - T_values = {}; - for (auto i = 0; i < v_x.size(); ++i) - x_values.push_back(v_x[i]); - - for (auto i = 0; i < v_y.size(); ++i) - y_values.push_back(v_y[i]); - - for (auto i = 0; i < v_z.size(); ++i) - z_values.push_back(v_z[i]); - - for (auto i = 0; i < v_T.size(); ++i) - T_values.push_back(v_T[i]); - - pbl.duBCs.push_back(this); -} - -/** - * @brief Display information. - */ -void Dirichlet::write(std::ostream &out) const -{ - out << "Dirichlet BC on " << *tag << "\n"; - out << "With fixed values of ("; - for (auto i = 0; i < (which_dof.size() - 1); ++i) - { - if (which_dof[i] == 1) - out << values[i] << ", "; - else - out << "-, "; - } - - if (which_dof[which_dof.size() - 1] == 1) - out << values[which_dof.size() - 1] << ")\n"; - else - out << "-)\n"; - - out << "a '-' represents an unconstrained dof.\n"; -} diff --git a/katoptron/src/wDirichlet.h b/katoptron/src/wDirichlet.h deleted file mode 100644 index bf20ad02..00000000 --- a/katoptron/src/wDirichlet.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef KATOPTRON_DIRICHLET_H -#define KATOPTRON_DIRICHLET_H - -#include "katoptron.h" -#include "wGroup.h" -#include <vector> -#include <string> - -#include <Teuchos_RCP.hpp> - -namespace katoptron -{ - -/** - * @brief Class used to specify in Python the different Dirichlet boundary conditions - * (both mechanical and thermal). - */ -class KATOPTRON_API Dirichlet : public tbox::Group -{ -public: - std::string const &BC_name; - std::vector<tbox::Node *> nodes; - std::vector<int> which_dof; - std::vector<double> values; - - std::vector<double> x_values; - std::vector<double> y_values; - std::vector<double> z_values; - std::vector<double> T_values; - - Dirichlet(Problem &pbl, - std::string const &name, - std::string const &_BC_name, - std::vector<int> _which_dof, - std::vector<double> _values, - size_t ensemble_size = 1); - - Dirichlet(Problem &pbl, - std::string const &name, - std::string const &_BC_name, - int x, - double v_x, - int y, - double v_y, - int z, - double v_z, - int T = 0, - double v_T = 0, - size_t ensemble_size = 1); - - Dirichlet(Problem &pbl, - std::string const &name, - std::string const &_BC_name, - int x, - std::vector<double> v_x, - int y, - std::vector<double> v_y, - int z, - std::vector<double> v_z, - int T = 0, - std::vector<double> v_T = {}); - -#ifndef SWIG - virtual void write(std::ostream &out) const; -#endif -}; - -} // namespace katoptron - -#endif //KATOPTRON_DIRICHLET_H diff --git a/katoptron/src/wDisplayHook.cpp b/katoptron/src/wDisplayHook.cpp deleted file mode 100644 index 40ed5399..00000000 --- a/katoptron/src/wDisplayHook.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "wDisplayHook.h" - -DisplayHook::DisplayHook() -{ -} - -void DisplayHook::display(int nt, double t, std::vector<double> &u) -{ - std::cout << "DisplayHook::display()\n"; -} - -void DisplayHook::display(int nt, - double t, - std::vector<double> &u_x, - std::vector<double> &u_y, - std::vector<double> &u_z, - std::vector<double> &u_norm) -{ - std::cout << "DisplayHook::display()\n"; -} - -void DisplayHook::refresh() -{ - std::cout << "DisplayHook::refresh()\n"; -} diff --git a/katoptron/src/wDisplayHook.h b/katoptron/src/wDisplayHook.h deleted file mode 100644 index 623d746b..00000000 --- a/katoptron/src/wDisplayHook.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef KATOPTRON_DISPLAYHOOK_H -#define KATOPTRON_DISPLAYHOOK_H - -#include "katoptron.h" -#include "wObject.h" -#include <vector> - -class KATOPTRON_API DisplayHook : public fwk::wObject -{ -public: - DisplayHook(); - virtual void display(int nt, double t, std::vector<double> &u); - virtual void display(int nt, - double t, - std::vector<double> &u_x, - std::vector<double> &u_y, - std::vector<double> &u_z, - std::vector<double> &u_norm); - virtual void refresh(); -}; - -#endif //KATOPTRON_DISPLAYHOOK_H diff --git a/katoptron/src/wMedium.cpp b/katoptron/src/wMedium.cpp deleted file mode 100644 index e39d8fd3..00000000 --- a/katoptron/src/wMedium.cpp +++ /dev/null @@ -1,150 +0,0 @@ -#include "wMedium.h" -#include "wProblem.h" -#include "wTag.h" -using namespace katoptron; -using namespace tbox; - -/** - * @brief Medium constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> no: the ID of the body of the msh, - * <li> _medium_name: the name of new medium (does not have to be a nametag of the msh), - * <li> _E: a vector of values of the Young modulus \f$E\f$ (one per sample), - * <li> _nu: a vector of values of the Poisson coefficients \f$\nu\f$ (one per sample), - * <li> _k: the heat conductivity \f$k\f$ equal to zero by default, - * <li> _beta: the coefficient of thermal expansion \f$\beta\f$ equal to zero by default. - * </ul> - */ -Medium::Medium(Problem &pbl, - int no, - std::string _medium_name, - std::vector<double> _E, - std::vector<double> _nu, - std::vector<double> _k, - std::vector<double> _beta) : Group(pbl.msh, no), medium_name(_medium_name) -{ - E = _E[0]; - nu = _nu[0]; - k = _k[0]; - beta = _beta[0]; - E_vector = _E; - nu_vector = _nu; - k_vector = _k; - beta_vector = _beta; - pbl.media.push_back(this); -} - -/** - * @brief Medium constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> name: the name of the body of the msh, - * <li> _medium_name: the name of new medium (does not have to be a nametag of the msh), - * <li> _E: a vector of values of the Young modulus \f$E\f$ (one per sample), - * <li> _nu: a vector of values of the Poisson coefficients \f$\nu\f$ (one per sample), - * <li> _k: the heat conductivity \f$k\f$ equal to zero by default, - * <li> _beta: the coefficient of thermal expansion \f$\beta\f$ equal to zero by default. - * </ul> - */ -Medium::Medium(Problem &pbl, - std::string const &name, - std::string _medium_name, - std::vector<double> _E, - std::vector<double> _nu, - std::vector<double> _k, - std::vector<double> _beta) : Group(pbl.msh, name), medium_name(_medium_name) -{ - E = _E[0]; - nu = _nu[0]; - k = _k[0]; - beta = _beta[0]; - E_vector = _E; - nu_vector = _nu; - k_vector = _k; - beta_vector = _beta; - pbl.media.push_back(this); -} - -/** - * @brief Medium constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> no: the ID of the body of the msh, - * <li> _medium_name: the name of new medium (does not have to be a nametag of the msh), - * <li> _E: a vector of values of the Young modulus \f$E\f$ (one per sample), - * <li> _nu: a vector of values of the Poisson coefficients \f$\nu\f$ (one per sample), - * <li> _k: a vector of values of the heat conductivity \f$k\f$ (one per sample), - * <li> _beta: a vector of values of the coefficient of thermal expansion \f$\beta\f$ (one per sample). - * </ul> - */ -Medium::Medium(Problem &pbl, - int no, - std::string _medium_name, - std::vector<double> _E, - std::vector<double> _nu, - double _k, - double _beta) : Group(pbl.msh, no), medium_name(_medium_name) -{ - E = _E[0]; - nu = _nu[0]; - k = _k; - beta = _beta; - E_vector = _E; - nu_vector = _nu; - std::vector<double> vect_k(E_vector.size(), _k); - k_vector = vect_k; - std::vector<double> vect_beta(E_vector.size(), _beta); - beta_vector = vect_beta; - pbl.media.push_back(this); -} - -/** - * @brief Medium constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> name: the name of the body of the msh, - * <li> _medium_name: the name of new medium (does not have to be a nametag of the msh), - * <li> _E: a vector of values of the Young modulus \f$E\f$ (one per sample), - * <li> _nu: a vector of values of the Poisson coefficients \f$\nu\f$ (one per sample), - * <li> _k: a vector of values of the heat conductivity \f$k\f$ (one per sample), - * <li> _beta: a vector of values of the coefficient of thermal expansion \f$\beta\f$ (one per sample). - * </ul> - */ -Medium::Medium(Problem &pbl, - std::string const &name, - std::string _medium_name, - std::vector<double> _E, - std::vector<double> _nu, - double _k, - double _beta) : Group(pbl.msh, name), medium_name(_medium_name) -{ - E = _E[0]; - nu = _nu[0]; - k = _k; - beta = _beta; - E_vector = _E; - nu_vector = _nu; - std::vector<double> vect_k(E_vector.size(), _k); - k_vector = vect_k; - std::vector<double> vect_beta(E_vector.size(), _beta); - beta_vector = vect_beta; - pbl.media.push_back(this); -} - -/** - * @brief Display information. - */ -void Medium::write(std::ostream &out) const -{ - out << "Medium " << medium_name << " on " << *tag << " with E=" << this->E - << ", nu=" << this->nu << ", k=" << this->k << " and beta=" << this->beta; -} diff --git a/katoptron/src/wMedium.h b/katoptron/src/wMedium.h deleted file mode 100644 index ec41f8fa..00000000 --- a/katoptron/src/wMedium.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef KATOPTRON_MEDIUM_H -#define KATOPTRON_MEDIUM_H - -#include "katoptron.h" -#include "wGroup.h" -#include <string> -#include <vector> - -namespace katoptron -{ - -/** - * @brief Class used to specify in Python the different media. - */ -class KATOPTRON_API Medium : public tbox::Group -{ -public: - std::string medium_name; - double E; - double nu; - double k; - double beta; - std::vector<double> E_vector; - std::vector<double> nu_vector; - std::vector<double> k_vector; - std::vector<double> beta_vector; - - Medium(Problem &pbl, - int no, - std::string _medium_name, - std::vector<double> _E, - std::vector<double> _nu, - double _k = 0., - double _beta = 0.); - - Medium(Problem &pbl, - std::string const &name, - std::string _medium_name, - std::vector<double> _E, - std::vector<double> _nu, - double _k = 0., - double _beta = 0.); - - Medium(Problem &pbl, - int no, - std::string _medium_name, - std::vector<double> _E, - std::vector<double> _nu, - std::vector<double> _k, - std::vector<double> _beta); - - Medium(Problem &pbl, - std::string const &name, - std::string _medium_name, - std::vector<double> _E, - std::vector<double> _nu, - std::vector<double> _k, - std::vector<double> _beta); - -#ifndef SWIG - virtual void write(std::ostream &out) const; -#endif -}; - -} // namespace katoptron - -#endif //KATOPTRON_MEDIUM_H diff --git a/katoptron/src/wNeumann.cpp b/katoptron/src/wNeumann.cpp deleted file mode 100644 index 7673235a..00000000 --- a/katoptron/src/wNeumann.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include "wNeumann.h" -#include "wProblem.h" -#include "wTag.h" -#include "wElement.h" -#include "wNode.h" -#include <algorithm> -using namespace katoptron; -using namespace tbox; - -/** - * @brief Neumann constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> name: the name of the loaded surface of the msh, - * <li> _BC_name: the name of new Neumann BC (does not have to be a nametag of the msh), - * <li> _which_dof: a vector that specify which degree(s) of freedom are loaded, - * <li> _values: a vector that specify the values of the loads. - * </ul> - */ -Neumann::Neumann(katoptron::Problem &pbl, - std::string const &name, - std::string const &_BC_name, - std::vector<int> _which_dof, - std::vector<double> _values) : Group(pbl.msh, name), BC_name(_BC_name), which_dof(_which_dof), values(_values) -{ - for (auto e : tag->elems) - for (auto n : e->nodes) - nodes.push_back(n); - - pbl.nBCs.push_back(this); -} - -/** - * @brief Neumann constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> name: the name of the loaded surface of the msh, - * <li> _BC_name: the name of new Neumann BC (does not have to be a nametag of the msh), - * <li> x: a int which specify whether the x displacement component is loaded, - * <li> v_x: value of the load, - * <li> y: a int which specify whether the y displacement component is loaded, - * <li> v_y: value of the load, - * <li> z: a int which specify whether the z displacement component is loaded, - * <li> v_z: value of the load, - * <li> T: a int which specify whether the temperature is loaded, - * <li> v_T: value of the load, - * <li> ensemble_size: the ensemble size. - * </ul> - */ -Neumann::Neumann(Problem &pbl, - std::string const &name, - std::string const &_BC_name, - int x, - std::vector<double> v_x, - int y, - std::vector<double> v_y, - int z, - std::vector<double> v_z, - int T, - std::vector<double> v_T, - size_t ensemble_size) : Group(pbl.msh, name), BC_name(_BC_name) -{ - for (auto e : tag->elems) - for (auto n : e->nodes) - nodes.push_back(n); - - which_dof = {}; - which_dof.push_back(x); - which_dof.push_back(y); - which_dof.push_back(z); - which_dof.push_back(T); - - values = {}; - for (auto i = 0; i < ensemble_size; ++i) - values.push_back(v_x[i]); - for (auto i = 0; i < ensemble_size; ++i) - values.push_back(v_y[i]); - for (auto i = 0; i < ensemble_size; ++i) - values.push_back(v_z[i]); - for (auto i = 0; i < ensemble_size; ++i) - values.push_back(v_T[i]); - - pbl.nBCs.push_back(this); -} - -/** - * @brief Display information. - */ -void Neumann::write(std::ostream &out) const -{ - out << "Neumann BC on " << *tag << "\n"; - out << "With applied load of ("; - for (auto i = 0; i < (which_dof.size() - 1); ++i) - { - if (which_dof[i] == 1) - out << values[i] << ", "; - else - out << "0, "; - } - - if (which_dof[which_dof.size() - 1] == 1) - out << values[which_dof.size() - 1] << ")\n"; - else - out << "0)\n"; -} diff --git a/katoptron/src/wNeumann.h b/katoptron/src/wNeumann.h deleted file mode 100644 index 7b7af949..00000000 --- a/katoptron/src/wNeumann.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef KATOPTRON_NEUMANN_H -#define KATOPTRON_NEUMANN_H - -#include "katoptron.h" -#include "wGroup.h" -#include <vector> -#include <string> - -namespace katoptron -{ - -/** - * @brief Class used to specify in Python the different Neumann boundary conditions - * (both mechanical and thermal). - */ -class KATOPTRON_API Neumann : public tbox::Group -{ -public: - std::string const &BC_name; - std::vector<tbox::Node *> nodes; - std::vector<int> which_dof; - std::vector<double> values; - - Neumann(Problem &pbl, - std::string const &name, - std::string const &_BC_name, - std::vector<int> _which_dof, - std::vector<double> _values); - - Neumann(Problem &pbl, - std::string const &name, - std::string const &_BC_name, - int x, - std::vector<double> v_x, - int y, - std::vector<double> v_y, - int z, - std::vector<double> v_z, - int T, - std::vector<double> v_T, - size_t ensemble_size); - -#ifndef SWIG - virtual void write(std::ostream &out) const; -#endif -}; - -} // namespace katoptron - -#endif //KATOPTRON_NEUMANN_H diff --git a/katoptron/src/wProblem.cpp b/katoptron/src/wProblem.cpp deleted file mode 100644 index 420d7731..00000000 --- a/katoptron/src/wProblem.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "wProblem.h" -#include "wMshData.h" - -#include "wDirichlet.h" -#include "wNeumann.h" -#include "wSource.h" -using namespace katoptron; -using namespace tbox; - -/** - * @brief Problem constructor - * - * Arguments: - * <ul> - * <li> _msh: a shared pointer to the mesh, - * <li> _comm: the used MPI communicator. - * </ul> - */ -Problem::Problem(std::shared_ptr<MshData> _msh, MPI_Comm _comm) : msh(_msh), comm(_comm) -{ -} - -/** - * @brief Add a random variable. - */ -void Problem::add(std::shared_ptr<RandomVariable> r) -{ - RandomVariables.push_back(r); -} - -/** - * @brief Display information. - */ -void Problem::write(std::ostream &out) const -{ - out << "katoptron::Problem:\n"; - out << " + mesh:\n"; - out << *msh; //wMshData.h - - out << " + dBC:\n"; - for (auto b : duBCs) - out << *b << '\n'; - out << " + nBC:\n"; - for (auto b : nBCs) - out << *b << '\n'; - out << " + Source:\n"; - for (auto b : Sources) - out << *b << '\n'; -} \ No newline at end of file diff --git a/katoptron/src/wProblem.h b/katoptron/src/wProblem.h deleted file mode 100644 index 9fd940b3..00000000 --- a/katoptron/src/wProblem.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef KATOPTRON_PROBLEM_H -#define KATOPTRON_PROBLEM_H - -#include "katoptron.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <string> -#include <memory> - -#include <mpi.h> - -namespace katoptron -{ - -/** - * @brief Class which is used to specify in Python the thermomechanical to solve. - */ -class KATOPTRON_API Problem : public fwk::wSharedObject -{ -public: - std::shared_ptr<tbox::MshData> msh; ///< Mesh structure - - MPI_Comm comm; -#ifndef SWIG - std::vector<Medium *> media = {}; ///< Materials - std::vector<Dirichlet *> duBCs = {}; ///< mechanical Dirichlet boundary conditions - std::vector<Neumann *> nBCs = {}; - std::vector<Contact *> Contacts = {}; - std::vector<Source *> Sources = {}; - std::vector<std::shared_ptr<RandomVariable>> RandomVariables = {}; - std::vector<Weight *> Weights = {}; -#endif - Problem(std::shared_ptr<tbox::MshData> _msh, MPI_Comm _comm); - ~Problem() { std::cout << "~Problem()\n"; } - - void add(std::shared_ptr<RandomVariable> r); -#ifndef SWIG - virtual void write(std::ostream &out) const; -#endif -}; - -} // namespace katoptron - -#endif //KATOPTRON_PROBLEM_H diff --git a/katoptron/src/wRandomField.h b/katoptron/src/wRandomField.h deleted file mode 100644 index cfa85ee2..00000000 --- a/katoptron/src/wRandomField.h +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef KATOPTRON_RANDOMFIELD_H -#define KATOPTRON_RANDOMFIELD_H - -#include "Stokhos_Sacado_Kokkos_MP_Vector.hpp" -#include "Stokhos_KL_ExponentialRandomField.hpp" -#include "EnsembleTraits.h" -#include "wSpectralApproach.h" - -template <typename Scalar, typename Device> -class RandomField -{ -public: - typedef Kokkos::View<Scalar *, Kokkos::LayoutLeft, Device> RandomVariableView; - typedef typename RandomVariableView::size_type size_type; - - typedef typename Teuchos::ScalarTraits<Scalar>::coordinateType MeshScalar; - typedef Stokhos::KL::ExponentialRandomField<MeshScalar, Device> rf_type; - typedef Teuchos::ScalarTraits<MeshScalar> MST; - typedef typename EnsembleTraits<Scalar>::value_type mean_type; - - bool isRandom = false; - bool isExpRandom = true; - rf_type m_rf; // Exponential random field - RandomVariableView m_rv; // KL random variables - mean_type g; // Mean - mean_type delta; // Dispersion level - mean_type a, b; - int num_rv; - int ndim = 3; // Dimension of the physical domain - Teuchos::RCP<SpectralApproach<Scalar, Device>> sa; - - RandomField(Teuchos::RCP<Teuchos::ParameterList> randomParams, Kokkos::View<Scalar *, Kokkos::LayoutLeft, Device> _m_rv) - { - isRandom = randomParams->get("Is random", false); - if (isRandom) - { - g = randomParams->get("Mean", MST::one()); - delta = randomParams->get("Dispersion level", MST::zero()); - a = log(g / (sqrt(1 + delta * delta))); - b = sqrt(log(1 + delta * delta)); - - isExpRandom = randomParams->get("Is exp", true); - if (isExpRandom) - { - const MeshScalar BeginX = randomParams->get("Begin X", MST::zero()); - const MeshScalar BeginY = randomParams->get("Begin Y", MST::zero()); - const MeshScalar BeginZ = randomParams->get("Begin Z", MST::zero()); - const MeshScalar EndX = randomParams->get("End X", MST::one()); - const MeshScalar EndY = randomParams->get("End Y", MST::one()); - const MeshScalar EndZ = randomParams->get("End Z", MST::one()); - num_rv = randomParams->get("Number random variables", 0); - const MeshScalar correlation_lengthX = randomParams->get("Correlation length X", MST::one()); - const MeshScalar correlation_lengthY = randomParams->get("Correlation length Y", MST::one()); - const MeshScalar correlation_lengthZ = randomParams->get("Correlation length Z", MST::one()); - - if (correlation_lengthZ == 0) - ndim = 2; - - const int num_KL_X = randomParams->get("Number of KL Terms X", 0); - const int num_KL_Y = randomParams->get("Number of KL Terms Y", 0); - const int num_KL_Z = randomParams->get("Number of KL Terms Z", 0); - - mean_type eps = randomParams->get("Bound Perturbation Size", 1e-6); - mean_type tol = randomParams->get("Nonlinear Solver Tolerance", 1e-10); - int max_it = randomParams->get("Maximum Nonlinear Solver Iterations", 100); - - Teuchos::ParameterList solverParams; - solverParams.set("Number of KL Terms", num_rv); - solverParams.set("Mean", MST::zero()); - solverParams.set("Standard Deviation", MST::one()); - solverParams.set("Bound Perturbation Size", eps); - solverParams.set("Nonlinear Solver Tolerance", tol); - solverParams.set("Maximum Nonlinear Solver Iterations", max_it); - Teuchos::Array<MeshScalar> domain_upper(ndim, 1.0), - domain_lower(ndim, 0.0), - correlation_lengths(ndim, correlation_lengthX); - Teuchos::Array<int> num_KL_per_dim(ndim, 1.0); - - domain_upper[0] = EndX; - domain_upper[1] = EndY; - if (ndim == 3) - domain_upper[2] = EndZ; - - domain_lower[0] = BeginX; - domain_lower[1] = BeginY; - if (ndim == 3) - domain_lower[2] = BeginZ; - - correlation_lengths[0] = correlation_lengthX; - correlation_lengths[1] = correlation_lengthY; - if (ndim == 3) - correlation_lengths[2] = correlation_lengthZ; - - if (num_KL_X != 0 && num_KL_Y != 0 && num_KL_Z != 0) - { - num_KL_per_dim[0] = num_KL_X; - num_KL_per_dim[1] = num_KL_Y; - if (ndim == 3) - num_KL_per_dim[2] = num_KL_Z; - solverParams.set("Number of KL Terms per dimension", num_KL_per_dim); - } - - solverParams.set("Domain Upper Bounds", domain_upper); - solverParams.set("Domain Lower Bounds", domain_lower); - solverParams.set("Correlation Lengths", correlation_lengths); - - m_rf = rf_type(solverParams); - m_rv = _m_rv; - - std::ofstream outputfile_solverParams; - std::ofstream outputfile_m_rv; - - outputfile_solverParams.open("RandomFieldParams.txt"); - outputfile_m_rv.open("RandomVariables.txt"); - - outputfile_solverParams << solverParams << std::endl; - - for (size_t i = 0; i < m_rv.extent(0); ++i) - outputfile_m_rv << m_rv(i) << std::endl; - - outputfile_solverParams.close(); - outputfile_m_rv.close(); - } - else - { - MeshScalar a = randomParams->get("Correlation length", MST::one()); - MeshScalar r = randomParams->get("Wavenumber cutoff", MST::one()); - size_t muw = randomParams->get("Wavenumber discretization points", 40); - bool gauss = randomParams->get("Gaussian field", true); - - unsigned long seed_Z = randomParams->get("Z seed", 42); - unsigned long seed_Phi = randomParams->get("Phi seed", 186); - - size_t wait_Z = randomParams->get("Number Z of previously drawn samples", 0); - size_t wait_Phi = randomParams->get("Number Phi of previously drawn samples", 0); - - Kokkos::View<Scalar **, Kokkos::LayoutLeft, Device> Z; - Kokkos::View<Scalar **, Kokkos::LayoutLeft, Device> Phi; - - Z = construct_Z<Scalar, Device>(muw, seed_Z, wait_Z); - Phi = construct_Phi<Scalar, Device>(muw, seed_Phi, wait_Phi); - - sa = Teuchos::rcp(new SpectralApproach<Scalar, Device>(Z, Phi, a, r, muw, gauss)); - } - } - } - - KOKKOS_INLINE_FUNCTION - Scalar operator()(const MeshScalar x, const MeshScalar y, const MeshScalar z) const - { - if (isRandom) - { - Scalar Xi = 0.; - if (isExpRandom) - { - if (ndim == 3) - { - const MeshScalar point[3] = {x, y, z}; - Xi = m_rf.evaluate(point, m_rv); - } - else - { - const MeshScalar point[2] = {x, y}; - Xi = m_rf.evaluate(point, m_rv); - } - } - else - Xi = sa->operator()(x, y); - - return exp(a + b * Xi); - } - else - return Teuchos::ScalarTraits<Scalar>::one(); - } -}; - -#endif //KATOPTRON_RANDOMFIELD_H diff --git a/katoptron/src/wRandomVariable.h b/katoptron/src/wRandomVariable.h deleted file mode 100644 index 5c73febd..00000000 --- a/katoptron/src/wRandomVariable.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef KATOPTRON_RANDOMVARIABLE_H -#define KATOPTRON_RANDOMVARIABLE_H - -#include "katoptron.h" -#include <vector> - -namespace katoptron -{ - -/** - * @brief Class containing the realisations of the random Gaussian variables. - */ -class KATOPTRON_API RandomVariable -{ -public: - std::vector<double> values; - size_t sizex; - size_t sizey; - double *arr; - - RandomVariable(std::vector<double> const &_values) : values(_values){}; -}; -} // namespace katoptron - -#endif //KATOPTRON_RANDOMVARIABLE_H diff --git a/katoptron/src/wSource.cpp b/katoptron/src/wSource.cpp deleted file mode 100644 index 7b2d35b9..00000000 --- a/katoptron/src/wSource.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "wSource.h" -#include "wProblem.h" -#include "wTag.h" -#include "wElement.h" -#include "wNode.h" -#include <algorithm> -using namespace katoptron; -using namespace tbox; - -/** - * @brief Source constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> name: the name of the constrained surface of the msh, - * <li> _Source_name: the name of new Source (does not have to be a nametag of the msh), - * <li> v_T: value of the volumetric heat source. - * </ul> - */ -Source::Source(Problem &pbl, - std::string const &name, - std::string const &_Source_name, - double v_T) : Group(pbl.msh, name), Source_name(_Source_name), value(v_T) -{ - for (auto e : tag->elems) - for (auto n : e->nodes) - nodes.push_back(n); - - pbl.Sources.push_back(this); -} - -/** - * @brief Display information. - */ -void Source::write(std::ostream &out) const -{ - out << "Source on " << *tag << "\n"; - out << "Value " << value << "\n"; -} diff --git a/katoptron/src/wSource.h b/katoptron/src/wSource.h deleted file mode 100644 index 11f74950..00000000 --- a/katoptron/src/wSource.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef KATOPTRON_SOURCE_H -#define KATOPTRON_SOURCE_H - -#include "katoptron.h" -#include "wGroup.h" -#include <vector> -#include <string> - -namespace katoptron -{ - -/** - * @brief Class used to specify in Python the different volumetric heat sources. - */ -class KATOPTRON_API Source : public tbox::Group -{ -public: - std::string const &Source_name; - std::vector<tbox::Node *> nodes; - double value; - - Source(Problem &pbl, - std::string const &name, - std::string const &_Source_name, - double v_T); -#ifndef SWIG - virtual void write(std::ostream &out) const; -#endif -}; - -} // namespace katoptron - -#endif //KATOPTRON_SOURCE_H diff --git a/katoptron/src/wSpectralApproach.h b/katoptron/src/wSpectralApproach.h deleted file mode 100644 index d52e70be..00000000 --- a/katoptron/src/wSpectralApproach.h +++ /dev/null @@ -1,115 +0,0 @@ -#ifndef KATOPTRON_SPECTRALAPPROACH_H -#define KATOPTRON_SPECTRALAPPROACH_H - -#include "EnsembleTraits.h" -#include <cmath> -#include <random> - -/** - * @brief A function which computes a random matrix \f$\boldsymbol{Z}\f$ starting at a given seed. - * - * This matrix is used to generate a random field based on the spectral approach - */ -template <typename Scalar, typename Device> -Kokkos::View<Scalar **, Kokkos::LayoutLeft, Device> construct_Z(size_t muw, unsigned long seed_Z, size_t wait = 0) -{ - Kokkos::View<Scalar **, Kokkos::LayoutLeft, Device> Z = Kokkos::View<Scalar **, Kokkos::LayoutLeft, Device>("Z", muw, muw); - - std::default_random_engine generator; - generator.seed(seed_Z); - std::uniform_real_distribution<double> distribution(0.0, 1.0); - // Redraw the data related to the previous samples to start at the good place - for (size_t i = 0; i < wait; ++i) - distribution(generator); - - for (size_t ell = 0; ell < EnsembleTraits<Scalar>::size; ++ell) - for (size_t i = 0; i < muw; ++i) - for (size_t j = 0; j < muw; ++j) - EnsembleTraits<Scalar>::coeff(Z(i, j), ell) = sqrt(-log(distribution(generator))); - - return Z; -} - -/** - * @brief A function which computes a random matrix \f$\boldsymbol{\Phi}\f$ starting at a given seed. - * - * This matrix is used to generate a random field based on the spectral approach - */ -template <typename Scalar, typename Device> -Kokkos::View<Scalar **, Kokkos::LayoutLeft, Device> construct_Phi(size_t muw, unsigned long seed_Phi, size_t wait = 0) -{ - Kokkos::View<Scalar **, Kokkos::LayoutLeft, Device> Phi = Kokkos::View<Scalar **, Kokkos::LayoutLeft, Device>("Phi", muw, muw); - - std::default_random_engine generator; - generator.seed(seed_Phi); - std::uniform_real_distribution<double> distribution(0.0, 1.0); - // Redraw the data related to the previous samples to start at the good place - for (size_t i = 0; i < wait; ++i) - distribution(generator); - - for (size_t ell = 0; ell < EnsembleTraits<Scalar>::size; ++ell) - for (size_t i = 0; i < muw; ++i) - for (size_t j = 0; j < muw; ++j) - EnsembleTraits<Scalar>::coeff(Phi(i, j), ell) = 2. * M_PI * distribution(generator); - - return Phi; -} - -/** - * @brief A class that constructs realization(s) of Gaussian or exponential - * scalar random field based on the spectral approach. - */ -template <typename Scalar, typename Device> -class SpectralApproach -{ -public: - typedef typename Teuchos::ScalarTraits<Scalar>::coordinateType MeshScalar; - - Kokkos::View<Scalar **, Kokkos::LayoutLeft, Device> Z; // Z=sqrt(-log(rand(muw,muw))); - Kokkos::View<Scalar **, Kokkos::LayoutLeft, Device> Phi; // Phi=2*pi*rand(muw,muw); - Kokkos::View<MeshScalar *, Kokkos::LayoutLeft, Device> w; - Kokkos::View<MeshScalar *, Kokkos::LayoutLeft, Device> S; - - MeshScalar a, r, Dw; - size_t muw; - - SpectralApproach(Kokkos::View<Scalar **, Kokkos::LayoutLeft, Device> _Z, - Kokkos::View<Scalar **, Kokkos::LayoutLeft, Device> _Phi, - MeshScalar _a = 20, MeshScalar _r = 8, size_t _muw = 512, - bool Gaussian = true) : Z(_Z), Phi(_Phi), a(_a), r(_r), muw(_muw) - { - MeshScalar wL = M_PI / a * r; - Dw = 2 * wL / muw; - - w = Kokkos::View<MeshScalar *, Kokkos::LayoutLeft, Device>("w", muw); - S = Kokkos::View<MeshScalar *, Kokkos::LayoutLeft, Device>("w", muw); - - for (size_t i = 0; i < muw; ++i) - w(i) = -wL + (i + 0.5) * Dw; - - if (Gaussian) - for (size_t i = 0; i < muw; ++i) - S(i) = a / sqrt(2. * M_PI) * exp(-pow(a * w(i), 2) / 2.); - else - for (size_t i = 0; i < muw; ++i) - S(i) = a / (M_PI * (1 + pow(a, 2) * pow(w(i), 2))); - } - - KOKKOS_INLINE_FUNCTION - Scalar operator()(const MeshScalar x, const MeshScalar y) const - { - //Teuchos::TimeMonitor LocalTimer (*Random_field_eval); - - Scalar output = 0.; - - for (size_t i = 0; i < muw; ++i) - for (size_t j = 0; j < muw; ++j) - output += sqrt(S(i) * S(j)) * Z(i, j) * cos(Phi(i, j) + w(i) * x + w(j) * y); - - output *= sqrt(2) * Dw; - - return output; - } -}; - -#endif //KATOPTRON_SPECTRALAPPROACH_H diff --git a/katoptron/src/wVtkExport_KIM2CLEAN.cpp b/katoptron/src/wVtkExport_KIM2CLEAN.cpp deleted file mode 100644 index dcba910b..00000000 --- a/katoptron/src/wVtkExport_KIM2CLEAN.cpp +++ /dev/null @@ -1,400 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wVtkExport_KIM2CLEAN.h" -#include "wMshData.h" -#include "wTag.h" -#include "wElement.h" -#include "wNode.h" -#include "wResults.h" - -#include <vtkVersion.h> -#include <vtkSmartPointer.h> -#include <vtkTetra.h> -#include <vtkHexahedron.h> -#include <vtkCellArray.h> -#include <vtkXMLUnstructuredGridReader.h> - -#include <vtkXMLUnstructuredGridWriter.h> -#include "vtkXMLPUnstructuredGridWriter.h" -#include <vtkUnstructuredGrid.h> -#include <vtkPointData.h> -#include <vtkDoubleArray.h> -#include "vtkCellArray.h" -#include "vtkCellData.h" -#include <vtkVertexGlyphFilter.h> - -#ifdef VTK_HAS_MPI -#include <mpi.h> -#include "vtkMPIController.h" -#endif - -using namespace tbox; -using namespace tboxVtk; - -VtkExport_KIM2CLEAN::VtkExport_KIM2CLEAN(std::shared_ptr<MshData> _msh) : msh(_msh) -{ -} - -/** - * @brief Save results defined at all the slave contact nodes ONLY. - * Those datas are Lagrange multipliers and can only be scalar or vectors. - */ - -void VtkExport_KIM2CLEAN::save_MPI(std::string const &fname, Results const &r, std::vector<int> contactElementID, std::map<int, int> lagrange_LO_to_nodes_GO, std::map<int, int> nodes_GO_to_lagrange_LO) const -{ -#ifdef VTK_HAS_MPI - vtkSmartPointer<vtkPoints> points = - vtkSmartPointer<vtkPoints>::New(); - - points->SetNumberOfPoints(lagrange_LO_to_nodes_GO.size()); - - for (int ii = 0; ii < lagrange_LO_to_nodes_GO.size(); ++ii) - points->InsertPoint(ii, msh->nodes[lagrange_LO_to_nodes_GO[ii]]->pos(0), msh->nodes[lagrange_LO_to_nodes_GO[ii]]->pos(1), msh->nodes[lagrange_LO_to_nodes_GO[ii]]->pos(2)); - - int CellArraySize = 0; - int numberOfCells = 0; - int numberOfElems = contactElementID.size(); - bool isQuad = true; - for (int ii = 0; ii < numberOfElems; ++ii) - { - int elemID = contactElementID[ii]; - if (msh->elems[elemID]->type() == ElType::QUAD4) - { - CellArraySize += ((msh->elems[elemID]->nodes.size()) + 1); - ++numberOfCells; - } - else if (msh->elems[elemID]->type() == ElType::TRI3) - { - CellArraySize += ((msh->elems[elemID]->nodes.size()) + 1); - ++numberOfCells; - isQuad = false; - } - } - - vtkIdType *vtkCells = NULL; - vtkCells = new vtkIdType[CellArraySize]; - - int CellOffset = 0; - for (int ii = 0; ii < numberOfElems; ++ii) - { - int elemID = contactElementID[ii]; - if (msh->elems[elemID]->type() == ElType::QUAD4) - { - vtkCells[CellOffset++] = msh->elems[elemID]->nodes.size(); - for (int jj = 0; jj < msh->elems[elemID]->nodes.size(); ++jj) - vtkCells[CellOffset++] = nodes_GO_to_lagrange_LO[msh->elems[elemID]->nodes[jj]->row]; - } - else if (msh->elems[elemID]->type() == ElType::TRI3) - { - vtkCells[CellOffset++] = msh->elems[elemID]->nodes.size(); - for (int jj = 0; jj < msh->elems[elemID]->nodes.size(); ++jj) - vtkCells[CellOffset++] = nodes_GO_to_lagrange_LO[msh->elems[elemID]->nodes[jj]->row]; - } - } - vtkSmartPointer<vtkIdTypeArray> Conn = vtkSmartPointer<vtkIdTypeArray>::New(); - Conn->SetArray(vtkCells, CellArraySize, 1); - - vtkSmartPointer<vtkCellArray> cellArray = - vtkSmartPointer<vtkCellArray>::New(); - cellArray->SetCells(numberOfCells, Conn); - - vtkSmartPointer<vtkUnstructuredGrid> unstructuredGrid = - vtkSmartPointer<vtkUnstructuredGrid>::New(); - unstructuredGrid->SetPoints(points); - if (isQuad) - unstructuredGrid->SetCells(VTK_QUAD, cellArray); - else - unstructuredGrid->SetCells(VTK_TRIANGLE, cellArray); - - for (auto &p : r.scalars_at_nodes) - { - vtkSmartPointer<vtkDoubleArray> scalar = - vtkSmartPointer<vtkDoubleArray>::New(); - - scalar->SetNumberOfComponents(1); - scalar->SetNumberOfTuples(lagrange_LO_to_nodes_GO.size()); - scalar->SetName(p.first.c_str()); - - for (int ii = 0; ii < lagrange_LO_to_nodes_GO.size(); ++ii) - { - scalar->SetValue(ii, (*(p.second))[ii]); - } - - unstructuredGrid->GetPointData()->AddArray(scalar); - } - for (auto &p : r.vectors_at_nodes) - { - vtkSmartPointer<vtkDoubleArray> vector = - vtkSmartPointer<vtkDoubleArray>::New(); - - vector->SetNumberOfComponents(3); - vector->SetNumberOfTuples(lagrange_LO_to_nodes_GO.size()); - vector->SetName(p.first.c_str()); - - for (int ii = 0; ii < lagrange_LO_to_nodes_GO.size(); ++ii) - { - Eigen::Vector3d const &v = (*(p.second))[ii]; - vector->SetTuple3(ii, v(0), v(1), v(2)); - } - - unstructuredGrid->GetPointData()->AddArray(vector); - } - - vtkSmartPointer<vtkXMLUnstructuredGridWriter> writer = - vtkSmartPointer<vtkXMLUnstructuredGridWriter>::New(); - writer->SetFileName(fname.c_str()); - writer->SetInputData(unstructuredGrid); - writer->Write(); - - delete[] vtkCells; -#endif -} - -/** - * @brief Save results defined at all nodes and 3D elements, those values can scalar, vector or tensors. - */ - -void VtkExport_KIM2CLEAN::save_MPI(std::string const &fname, Results const &r, std::map<int, int> nodesWO_LO_to_GO, std::map<int, int> nodesWO_GO_to_LO, std::map<int, int> elements_GO_to_LO) const -{ -#ifdef VTK_HAS_MPI - - int n_procs = 0, rank = 0; - MPI_Comm_size(MPI_COMM_WORLD, &n_procs); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - vtkMPIController *controller = vtkMPIController::New(); - controller->Initialize(0, 0, 1); - controller->SetGlobalController(controller); - - vtkSmartPointer<vtkPoints> points = - vtkSmartPointer<vtkPoints>::New(); - - points->SetNumberOfPoints(nodesWO_LO_to_GO.size()); - - for (int ii = 0; ii < nodesWO_LO_to_GO.size(); ++ii) - points->InsertPoint(ii, msh->nodes[nodesWO_LO_to_GO[ii]]->pos(0), msh->nodes[nodesWO_LO_to_GO[ii]]->pos(1), msh->nodes[nodesWO_LO_to_GO[ii]]->pos(2)); - - int CellArraySize = 0; - int numberOfCells = 0; - int numberOfElems = msh->elems.size(); - bool isAHexahedron = true; - - std::map<int, int> elems_GO_to_3D; - std::map<int, int> elems_3D_to_LO; - - for (int ii = 0; ii < numberOfElems; ++ii) - { - if (msh->elems[ii]->type() == ElType::HEX8) - { - CellArraySize += ((msh->elems[ii]->nodes.size()) + 1); - - elems_GO_to_3D[msh->elems[ii]->no - 1] = numberOfCells; - elems_3D_to_LO[numberOfCells] = ii; - - ++numberOfCells; - } - else if (msh->elems[ii]->type() == ElType::TETRA4) - { - CellArraySize += ((msh->elems[ii]->nodes.size()) + 1); - - elems_GO_to_3D[msh->elems[ii]->no - 1] = numberOfCells; - elems_3D_to_LO[numberOfCells] = ii; - - ++numberOfCells; - - isAHexahedron = false; - } - } - - vtkIdType *vtkCells = NULL; - vtkCells = new vtkIdType[CellArraySize]; - - int CellOffset = 0; - for (int ii = 0; ii < numberOfElems; ++ii) - { - if (msh->elems[ii]->type() == ElType::HEX8) - { - vtkCells[CellOffset++] = msh->elems[ii]->nodes.size(); - for (int jj = 0; jj < msh->elems[ii]->nodes.size(); ++jj) - vtkCells[CellOffset++] = nodesWO_GO_to_LO[msh->elems[ii]->nodes[jj]->row]; - } - else if (msh->elems[ii]->type() == ElType::TETRA4) - { - vtkCells[CellOffset++] = msh->elems[ii]->nodes.size(); - for (int jj = 0; jj < msh->elems[ii]->nodes.size(); ++jj) - vtkCells[CellOffset++] = nodesWO_GO_to_LO[msh->elems[ii]->nodes[jj]->row]; - } - } - vtkSmartPointer<vtkIdTypeArray> Conn = vtkSmartPointer<vtkIdTypeArray>::New(); - Conn->SetArray(vtkCells, CellArraySize, 1); - - vtkSmartPointer<vtkCellArray> cellArray = - vtkSmartPointer<vtkCellArray>::New(); - - cellArray->SetCells(numberOfCells, Conn); - - vtkSmartPointer<vtkUnstructuredGrid> unstructuredGrid = - vtkSmartPointer<vtkUnstructuredGrid>::New(); - unstructuredGrid->SetPoints(points); - if (isAHexahedron) - unstructuredGrid->SetCells(VTK_HEXAHEDRON, cellArray); - else - unstructuredGrid->SetCells(VTK_TETRA, cellArray); - - for (auto &p : r.scalars_at_nodes) - { - vtkSmartPointer<vtkDoubleArray> scalar = - vtkSmartPointer<vtkDoubleArray>::New(); - - scalar->SetNumberOfComponents(1); - scalar->SetNumberOfTuples(nodesWO_LO_to_GO.size()); - scalar->SetName(p.first.c_str()); - - for (int ii = 0; ii < nodesWO_LO_to_GO.size(); ++ii) - scalar->SetValue(ii, (*(p.second))[ii]); - - unstructuredGrid->GetPointData()->AddArray(scalar); - } - for (auto &p : r.vectors_at_nodes) - { - vtkSmartPointer<vtkDoubleArray> vector = - vtkSmartPointer<vtkDoubleArray>::New(); - - vector->SetNumberOfComponents(3); - vector->SetNumberOfTuples(nodesWO_LO_to_GO.size()); - vector->SetName(p.first.c_str()); - - for (int ii = 0; ii < nodesWO_LO_to_GO.size(); ++ii) - { - Eigen::Vector3d const &v = (*(p.second))[ii]; - vector->SetTuple3(ii, v(0), v(1), v(2)); - } - - unstructuredGrid->GetPointData()->AddArray(vector); - } - for (auto &p : r.tensors_at_nodes) - { - vtkSmartPointer<vtkDoubleArray> tensors = - vtkSmartPointer<vtkDoubleArray>::New(); - - tensors->SetNumberOfComponents(9); - tensors->SetNumberOfTuples(nodesWO_LO_to_GO.size()); - tensors->SetName(p.first.c_str()); - - for (int ii = 0; ii < nodesWO_LO_to_GO.size(); ++ii) - { - Eigen::MatrixXd const &v = (*(p.second))[ii]; - tensors->SetTuple9(ii, v(0, 0), v(0, 1), v(0, 2), v(1, 0), v(1, 1), v(1, 2), v(2, 0), v(2, 1), v(2, 2)); - } - - unstructuredGrid->GetPointData()->AddArray(tensors); - } - - for (auto &p : r.scalars_at_elems) - { - vtkSmartPointer<vtkDoubleArray> scalar = - vtkSmartPointer<vtkDoubleArray>::New(); - - scalar->SetNumberOfComponents(1); - scalar->SetNumberOfTuples(numberOfCells); - scalar->SetName(p.first.c_str()); - - for (int ii = 0; ii < numberOfCells; ++ii) - { - scalar->SetValue(ii, (*(p.second))[elems_3D_to_LO[ii]]); - } - - unstructuredGrid->GetCellData()->AddArray(scalar); - } - for (auto &p : r.vectors_at_elems) - { - vtkSmartPointer<vtkDoubleArray> vector = - vtkSmartPointer<vtkDoubleArray>::New(); - - vector->SetNumberOfComponents(3); - vector->SetNumberOfTuples(numberOfCells); - vector->SetName(p.first.c_str()); - - for (int ii = 0; ii < numberOfCells; ++ii) - { - Eigen::Vector3d const &v = (*(p.second))[ii]; - vector->SetTuple3(ii, v(0), v(1), v(2)); - } - - unstructuredGrid->GetCellData()->AddArray(vector); - } - for (auto &p : r.tensors_at_elems) - { - vtkSmartPointer<vtkDoubleArray> tensors = - vtkSmartPointer<vtkDoubleArray>::New(); - - tensors->SetNumberOfComponents(9); - tensors->SetNumberOfTuples(numberOfCells); - tensors->SetName(p.first.c_str()); - - for (int ii = 0; ii < numberOfCells; ++ii) - { - Eigen::MatrixXd const &v = (*(p.second))[elems_3D_to_LO[ii]]; - tensors->SetTuple9(ii, v(0, 0), v(0, 1), v(0, 2), v(1, 0), v(1, 1), v(1, 2), v(2, 0), v(2, 1), v(2, 2)); - } - - unstructuredGrid->GetCellData()->AddArray(tensors); - } - - vtkSmartPointer<vtkIntArray> elem_proc_id = vtkSmartPointer<vtkIntArray>::New(); - elem_proc_id->SetName("processor_id"); - elem_proc_id->SetNumberOfComponents(1); - elem_proc_id->SetNumberOfTuples(numberOfCells); - - for (int ii = 0; ii < numberOfCells; ++ii) - elem_proc_id->SetValue(ii, rank); - - unstructuredGrid->GetCellData()->AddArray(elem_proc_id); - - vtkSmartPointer<vtkIntArray> volume_id = vtkSmartPointer<vtkIntArray>::New(); - volume_id->SetName("volume_id"); - volume_id->SetNumberOfComponents(1); - volume_id->SetNumberOfTuples(numberOfElems); - - for (auto &ptag : msh->ptags) - { - if (ptag.second->dim == 3) - { - for (int ii = 0; ii < ptag.second->elems.size(); ++ii) - { - volume_id->SetValue(elems_GO_to_3D[ptag.second->elems[ii]->no - 1], ptag.second->no); - } - } - } - unstructuredGrid->GetCellData()->AddArray(volume_id); - - vtkSmartPointer<vtkXMLPUnstructuredGridWriter> writer = - vtkSmartPointer<vtkXMLPUnstructuredGridWriter>::New(); - - writer->SetGhostLevel(1); - writer->SetNumberOfPieces(n_procs); - writer->SetStartPiece(rank); - writer->SetEndPiece(rank); - - writer->SetFileName(fname.c_str()); - writer->SetInputData(unstructuredGrid); - writer->Write(); - - delete[] vtkCells; - - controller->Finalize(1); -#endif -} diff --git a/katoptron/src/wVtkExport_KIM2CLEAN.h b/katoptron/src/wVtkExport_KIM2CLEAN.h deleted file mode 100644 index 8dbfcbe0..00000000 --- a/katoptron/src/wVtkExport_KIM2CLEAN.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WVTKEXPORT_KIM2CLEAN_H -#define WVTKEXPORT_KIM2CLEAN_H - -#include "katoptron.h" -#include <string> -#include <memory> -#include <vector> -#include <map> - -#ifndef SWIG - -namespace tboxVtk -{ - -/** - * @brief Save routines of Kim - * @authors Kim Liegeois - * @todo those functions have to be removed and wVtkExport has to be used instead. - * However, there are currently two difficulties. - * - Each save_MPI function save on different meshes, a contact mesh has to be created and given to one of the - * VtkExport. - * - wVtkExport do not support MPI for now and some #ifdef VTK_HAS_MPI are currently unwanted in wVtkExport. - * At the end of the day, instead of using element[i]->no-1 it will be required to use a map to translate - * the global mesh id to local ones, those map will be trivial for one proc cases, and more complex when MPI - * is used. This will allow each proc to write only the data that it has computed. Moreover, Vtk MPI initialization - * and finalization will have to be used. Those can be done using some unwanted #ifdef VTK_HAS_MPI or using more - * elegant strategies or requiring VTK binaries that support MPI. - */ -class KATOPTRON_API VtkExport_KIM2CLEAN -{ -public: - std::shared_ptr<tbox::MshData> msh; - - VtkExport_KIM2CLEAN(std::shared_ptr<tbox::MshData> _msh); - virtual ~VtkExport_KIM2CLEAN() {} - - void save_MPI(std::string const &fname, - tbox::Results const &r, - std::map<int, int> nodeWO_LO_to_GO, - std::map<int, int> nodeWO_GO_to_LO, - std::map<int, int> elements_GO_to_LO) const; - void save_MPI(std::string const &fname, - tbox::Results const &r, - std::vector<int> contactElementID, - std::map<int, int> nodeWO_LO_to_GO, - std::map<int, int> nodeWO_GO_to_LO) const; -}; - -} // namespace tboxVtk - -#endif - -#endif //WVTKUTILS_KIMTOCLEAN_H diff --git a/katoptron/src/wWeight.cpp b/katoptron/src/wWeight.cpp deleted file mode 100644 index cd5ab844..00000000 --- a/katoptron/src/wWeight.cpp +++ /dev/null @@ -1,177 +0,0 @@ -#include "wWeight.h" -#include "wProblem.h" -#include "wTag.h" -#include "wElement.h" -#include "wNode.h" -#include <algorithm> -using namespace katoptron; - -/** - * @brief Weight constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> name: the name of the weighted domain of the msh, - * <li> _which_dof: a vector that specify which degree(s) of freedom are weighted, - * <li> _values: a vector that specify the values of the weights - * (the length of _which_dof and _values must be the same), - * <li> ensemble_size: the ensemble size. - * </ul> - */ -Weight::Weight(katoptron::Problem &pbl, - std::string const &name, - std::vector<int> _which_dof, - std::vector<double> _values, - size_t ensemble_size) : Group(pbl.msh, name), which_dof(_which_dof), values(_values) -{ - for (auto e : tag->elems) - for (auto n : e->nodes) - nodes.push_back(n); - - x_values = {}; - y_values = {}; - z_values = {}; - T_values = {}; - for (auto i = 0; i < ensemble_size; ++i) - { - x_values.push_back(values[0]); - y_values.push_back(values[1]); - z_values.push_back(values[2]); - T_values.push_back(values[3]); - } - pbl.Weights.push_back(this); -} - -/** - * @brief Weight constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> name: the name of the weighted domain of the msh, - * <li> x: a int which specify whether the x displacement component is weighted, - * <li> v_x: value of the weight, - * <li> y: a int which specify whether the y displacement component is weighted, - * <li> v_y: value of the weight, - * <li> z: a int which specify whether the z displacement component is weighted, - * <li> v_z: value of the weight, - * <li> T: a int which specify whether the temperature is constrained, - * <li> v_T: value of the weight, - * <li> ensemble_size: the ensemble size. - * </ul> - */ -Weight::Weight(Problem &pbl, - std::string const &name, - int x, - double v_x, - int y, - double v_y, - int z, - double v_z, - int T, - double v_T, - size_t ensemble_size) : Group(pbl.msh, name) -{ - for (auto e : tag->elems) - for (auto n : e->nodes) - nodes.push_back(n); - - which_dof = {}; - which_dof.push_back(x); - which_dof.push_back(y); - which_dof.push_back(z); - which_dof.push_back(T); - - values = {}; - values.push_back(v_x); - values.push_back(v_y); - values.push_back(v_z); - values.push_back(v_T); - - x_values = {}; - y_values = {}; - z_values = {}; - T_values = {}; - for (auto i = 0; i < ensemble_size; ++i) - { - x_values.push_back(v_x); - y_values.push_back(v_y); - z_values.push_back(v_z); - T_values.push_back(v_T); - } - - pbl.Weights.push_back(this); -} - -/** - * @brief Weight constructor - * - * Arguments: - * <ul> - * <li> pbl: a Problem object, - * <li> name: the name of the weighted domain of the msh, - * <li> x: a int which specify whether the x displacement component is weighted, - * <li> v_x: vector of values of the weight (one per sample), - * <li> y: a int which specify whether the y displacement component is weighted, - * <li> v_y: vector of values of the weight (one per sample), - * <li> z: a int which specify whether the z displacement component is weighted, - * <li> v_z: vector of values of the weight (one per sample), - * <li> T: a int which specify whether the temperature is constrained, - * <li> v_T: vector of values of the weight (one per sample), - * <li> ensemble_size: the ensemble size. - * </ul> - */ -Weight::Weight(Problem &pbl, - std::string const &name, - int x, - std::vector<double> v_x, - int y, - std::vector<double> v_y, - int z, - std::vector<double> v_z, - int T, - std::vector<double> v_T) : Group(pbl.msh, name) -{ - for (auto e : tag->elems) - for (auto n : e->nodes) - nodes.push_back(n); - - which_dof = {}; - which_dof.push_back(x); - which_dof.push_back(y); - which_dof.push_back(z); - which_dof.push_back(T); - - values = {}; - values.push_back(v_x[0]); - values.push_back(v_y[0]); - values.push_back(v_z[0]); - values.push_back(v_T[0]); - - x_values = {}; - y_values = {}; - z_values = {}; - T_values = {}; - for (auto i = 0; i < v_x.size(); ++i) - x_values.push_back(v_x[i]); - - for (auto i = 0; i < v_y.size(); ++i) - y_values.push_back(v_y[i]); - - for (auto i = 0; i < v_z.size(); ++i) - z_values.push_back(v_z[i]); - - for (auto i = 0; i < v_T.size(); ++i) - T_values.push_back(v_T[i]); - - pbl.Weights.push_back(this); -} - -/** - * @brief Display information. - */ -void Weight::write(std::ostream &out) const -{ - out << "Weights on " << *tag << "\n"; -} diff --git a/katoptron/src/wWeight.h b/katoptron/src/wWeight.h deleted file mode 100644 index b1009a84..00000000 --- a/katoptron/src/wWeight.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef KATOPTRON_WEIGHT_H -#define KATOPTRON_WEIGHT_H - -#include "katoptron.h" -#include "wGroup.h" -#include <vector> -#include <string> - -#include <Teuchos_RCP.hpp> -using namespace tbox; - -namespace katoptron -{ - -/** - * @brief Class used to specify in Python the different weights used for - * the computation of the weighted residual of the GMRES. - */ -class KATOPTRON_API Weight : public Group -{ -public: - std::vector<Node *> nodes; - std::vector<int> which_dof; - std::vector<double> values; - - std::vector<double> x_values; - std::vector<double> y_values; - std::vector<double> z_values; - std::vector<double> T_values; - - Weight(Problem &pbl, - std::string const &name, - std::vector<int> _which_dof, - std::vector<double> _values, - size_t ensemble_size = 1); - - Weight(Problem &pbl, - std::string const &name, - int x, - double v_x, - int y, - double v_y, - int z, - double v_z, - int T = 0, - double v_T = 0, - size_t ensemble_size = 1); - - Weight(Problem &pbl, - std::string const &name, - int x, - std::vector<double> v_x, - int y, - std::vector<double> v_y, - int z, - std::vector<double> v_z, - int T = 0, - std::vector<double> v_T = {}); - -#ifndef SWIG - virtual void write(std::ostream &out) const; -#endif -}; - -} // namespace katoptron - -#endif //KATOPTRON_WEIGHT_H diff --git a/katoptron/tests/1_cube.geo b/katoptron/tests/1_cube.geo deleted file mode 100644 index 99d07474..00000000 --- a/katoptron/tests/1_cube.geo +++ /dev/null @@ -1,39 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - -C1 = 10; -nC1 = 4; - -lc = 1; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { C1, 0, 0, lc}; -Point(3) = { C1, 0, C1, lc}; -Point(4) = { 0, 0, C1, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Transfinite Line {1,2,3,4} = nC1+1 Using Progression 1; - -Line Loop(11) = {1,2,3,4}; -Plane Surface(12) = {11}; -Transfinite Surface {12}; -Recombine Surface {12}; - -Extrude {0, C1, 0} -{ - Surface{12}; Layers{nC1}; Recombine; -} - -// physical entities - -Physical Volume("Body 1") = {1}; - -Physical Surface("Surf 1 1") = {-21}; -Physical Surface("Surf 1 2") = {-29}; - -Physical Point("Measure point 1") = {4}; -Physical Point("Measure point 2") = {1}; diff --git a/katoptron/tests/1_cube.py b/katoptron/tests/1_cube.py deleted file mode 100644 index a5951ffb..00000000 --- a/katoptron/tests/1_cube.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -from fwk.testing import * - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '1_cube.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - E = 1. * np.ones(ensemble_size) - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - - hf = 1 * np.ones(ensemble_size) - zero = np.zeros(ensemble_size) - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., - 1, 0., 1, 0., 1, 10., ensemble_size) - m.Neumann(pbl, "Surf 1 2", "heat fluxes", 0, zero, - 0, zero, 0, zero, 1, hf, ensemble_size) - - dx = np.zeros(ensemble_size) - dy = 2. * np.ones(ensemble_size) - dz = np.zeros(ensemble_size) - dT = 10. * np.ones(ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 4 - mueluParams['max levels'] = 1 - mueluParams['smoother: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "Symmetric Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 1 - mueluParamsSub2['relaxation: damping factor'] = 0.9 - - mueluParams['verbosity'] = "low" - - mueluParams['smoother: params'] = mueluParamsSub2 - - solverList['mueluParams'] = mueluParams - solverList['Write txt files'] = True - - slv = m.IterativeSolver(pbl, solverList, 4, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - u.Finalize_Kokkos() - - tag_name = "Measure point 1" - which_pos = 0 - which_dof = 3 - DOFperNode = 4 - name_sol = "x_mm.txt" - - pos_1, sol_1 = u.extract(msh, tag_name, DOFperNode, - which_pos, which_dof, ensemble_size, name_sol) - - tag_name = "Measure point 2" - - pos_2, sol_2 = u.extract(msh, tag_name, DOFperNode, - which_pos, which_dof, ensemble_size, name_sol) - - tests = CTests() - measured_T_1 = sol_1[0] - tests.add(CTest('Temperature 1', measured_T_1, 97.7193, 5e-5)) - - measured_T_2 = sol_2[0] - tests.add(CTest('Temperature 2', measured_T_2, 10., 5e-5)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/1_cube_conv.py b/katoptron/tests/1_cube_conv.py deleted file mode 100644 index f853b4f1..00000000 --- a/katoptron/tests/1_cube_conv.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -from PyTrilinos import Teuchos -import shlex -import subprocess -import os -import numpy as np -import tarfile -import glob -from fwk.wutils import parseargs -from fwk.testing import * -from katoptron.readers import read_Belos - - -def model(msh, - E, - p, - ensemble_size): - comm, rank, size = m.utilities.import_MPI() - - pbl = m.Problem(msh, comm) - - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - - zero = np.zeros(ensemble_size) - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., 1, 0., 1, 0., 1, 0., - ensemble_size) - m.Neumann(pbl, "Surf 1 2", "heat fluxes", 0, zero, 0, zero, 1, p, 0, zero, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 100 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = False - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['Write txt files'] = True - solverList['Write matrix and vectors'] = True - - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - slv.start() - - -def main(): - comm, rank, size = u.import_MPI() - - useER = m.UseEnsembleReduction() - - geo_name = '1_cube.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - E_mean = 1. - E_min = 0.75 - E_max = 1.25 - - E_min_2 = 0.95 - E_max_2 = 1.05 - - E_min_3 = 1.2 - E_max_3 = 1.3 - - p_mean = 0.1 - p_min = 0.075 - p_max = 0.125 - - ensemble_size = 8 - E = np.linspace(E_min, E_max, ensemble_size) - p = p_mean * np.ones(ensemble_size) - - nThreads = u.Initialize_Kokkos() - model(msh, E, p, ensemble_size) - - u.Finalize_Kokkos() - - if rank == 0: - if useER: - iter_indices, residuals = read_Belos(work_dir+'/belos_out.txt', 1) - - tests = CTests() - nIterations = iter_indices[-1] - nExpectedIterations = 75 - tests.add(CTest('Number of iterations with ensemble reduction', - nIterations, nExpectedIterations, 0.)) - tests.run() - else: - iter_indices, residuals = read_Belos( - work_dir+'/belos_out.txt', ensemble_size) - - tests = CTests() - nIterations = iter_indices[-1] - nExpectedIterations = 35 - tests.add(CTest('Number of iterations without ensemble reduction', - nIterations, nExpectedIterations, 0.)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/1_cube_k.py b/katoptron/tests/1_cube_k.py deleted file mode 100644 index 05105c35..00000000 --- a/katoptron/tests/1_cube_k.py +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -from fwk.testing import * - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - import shlex - import subprocess - import os - import numpy as np - - geo_name = '1_cube.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - E = 1. * np.ones(ensemble_size) - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - - hf = 1 * np.ones(ensemble_size) - zero = np.zeros(ensemble_size) - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., - 1, 0., 1, 0., 1, 10., ensemble_size) - m.Neumann(pbl, "Surf 1 2", "heat fluxes", 0, zero, - 0, zero, 0, zero, 1, hf, ensemble_size) - - dx = np.zeros(ensemble_size) - dy = 2. * np.ones(ensemble_size) - dz = np.zeros(ensemble_size) - dT = 10. * np.ones(ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 2 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 4 - mueluParams['max levels'] = 1 - mueluParams['coarse: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "MT Symmetric Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 1 - mueluParamsSub2['relaxation: damping factor'] = 0.9 - - mueluParams['verbosity'] = "low" - - mueluParams['coarse: params'] = mueluParamsSub2 - - solverList['mueluParams'] = mueluParams - solverList['Write txt files'] = True - - m.Kokkos_Initialize(2) - slv = m.IterativeSolver( - pbl, solverList, 4, ensemble_size) - slv.start() - - m.Kokkos_Finalize() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/1_cube_rf.py b/katoptron/tests/1_cube_rf.py deleted file mode 100644 index 310170c5..00000000 --- a/katoptron/tests/1_cube_rf.py +++ /dev/null @@ -1,140 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -from fwk.testing import * - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '1_cube.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - E = 1. * np.ones(ensemble_size) - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - - hf = 1 * np.ones(ensemble_size) - zero = np.zeros(ensemble_size) - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - - num_random_variables = 10 - - rand = np.random.normal(0, 1, 10*ensemble_size) - - for i in range(0, num_random_variables): - pbl.add(m.RandomVariable(rand[i*ensemble_size:(i+1)*ensemble_size])) - - randomParams = Teuchos.ParameterList() - - randomParams['Is random'] = True - randomParams['Begin X'] = 0. - randomParams['Begin Y'] = 0. - randomParams['Begin Z'] = 0. - randomParams['End X'] = 10. - randomParams['End Y'] = 10. - randomParams['End Z'] = 10. - randomParams['Number random variables'] = num_random_variables - randomParams['Correlation length X'] = 1. - randomParams['Correlation length Y'] = 2. - randomParams['Correlation length Z'] = 1. - - randomParams['Mean'] = (1. / (2.*(1.+0.2))) - randomParams['Dispersion level'] = 0.1 - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., - 1, 0., 1, 0., 1, 10., ensemble_size) - m.Neumann(pbl, "Surf 1 2", "heat fluxes", 0, zero, - 0, zero, 0, zero, 1, hf, ensemble_size) - - dx = np.zeros(ensemble_size) - dy = 2. * np.ones(ensemble_size) - dz = np.zeros(ensemble_size) - dT = 10. * np.ones(ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['randomParams'] = randomParams - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 4 - mueluParams['max levels'] = 1 - mueluParams['smoother: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "Symmetric Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 1 - mueluParamsSub2['relaxation: damping factor'] = 0.9 - - mueluParams['verbosity'] = "low" - - mueluParams['smoother: params'] = mueluParamsSub2 - - solverList['mueluParams'] = mueluParams - solverList['Write txt files'] = True - - nThreads = u.Initialize_Kokkos() - - slv = m.IterativeSolver(pbl, solverList, 4, ensemble_size) - - slv.start() - - u.Finalize_Kokkos() - - tag_name = "Measure point 1" - which_pos = 0 - which_dof = 3 - DOFperNode = 4 - name_sol = "x_mm.txt" - - pos_1, sol_1 = u.extract(msh, tag_name, DOFperNode, - which_pos, which_dof, ensemble_size, name_sol) - - tag_name = "Measure point 2" - - pos_2, sol_2 = u.extract(msh, tag_name, DOFperNode, - which_pos, which_dof, ensemble_size, name_sol) - - tests = CTests() - measured_T_1 = sol_1[0] - measured_T_2 = sol_2[0] - tests.add(CTest('Temperature 1', measured_T_1, 97.7193, 5e-5)) - tests.add(CTest('Temperature 2', measured_T_2, 10., 5e-5)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/1_cube_tet.geo b/katoptron/tests/1_cube_tet.geo deleted file mode 100644 index 1b4fe8a1..00000000 --- a/katoptron/tests/1_cube_tet.geo +++ /dev/null @@ -1,38 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - -C1 = 10; -nC1 = 4; - -lc = 1; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { C1, 0, 0, lc}; -Point(3) = { C1, 0, C1, lc}; -Point(4) = { 0, 0, C1, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Transfinite Line {1,2,3,4} = nC1+1 Using Progression 1; - -Line Loop(11) = {1,2,3,4}; -Plane Surface(12) = {11}; -Transfinite Surface {12}; - -Extrude {0, C1, 0} -{ - Surface{12}; Layers{nC1}; //Recombine; -} - -// physical entities - -Physical Volume("Body 1") = {1}; - -Physical Surface("Surf 1 1") = {-21}; -Physical Surface("Surf 1 2") = {-29}; - -Physical Point("Measure point 1") = {4}; -Physical Point("Measure point 2") = {1}; diff --git a/katoptron/tests/1_cube_tet.py b/katoptron/tests/1_cube_tet.py deleted file mode 100644 index ec36a4ca..00000000 --- a/katoptron/tests/1_cube_tet.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -from fwk.testing import * - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '1_cube.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - E = 1. * np.ones(ensemble_size) - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - - hf = 1 * np.ones(ensemble_size) - zero = np.zeros(ensemble_size) - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., - 1, 0., 1, 0., 1, 10., ensemble_size) - m.Neumann(pbl, "Surf 1 2", "heat fluxes", 0, zero, - 0, zero, 0, zero, 1, hf, ensemble_size) - - dx = np.zeros(ensemble_size) - dy = 2. * np.ones(ensemble_size) - dz = np.zeros(ensemble_size) - dT = 10. * np.ones(ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 4 - mueluParams['max levels'] = 1 - mueluParams['smoother: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "Symmetric Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 1 - mueluParamsSub2['relaxation: damping factor'] = 0.9 - - mueluParams['verbosity'] = "low" - - mueluParams['smoother: params'] = mueluParamsSub2 - - solverList['mueluParams'] = mueluParams - solverList['Write txt files'] = True - - slv = m.IterativeSolver(pbl, solverList, 4, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - u.Finalize_Kokkos() - - tag_name = "Measure point 1" - which_pos = 0 - which_dof = 3 - DOFperNode = 4 - name_sol = "x_mm.txt" - - pos_1, sol_1 = u.extract(msh, tag_name, DOFperNode, - which_pos, which_dof, ensemble_size, name_sol) - - tag_name = "Measure point 2" - - pos_2, sol_2 = u.extract(msh, tag_name, DOFperNode, - which_pos, which_dof, ensemble_size, name_sol) - - tests = CTests() - measured_T_1 = sol_1[0] - measured_T_2 = sol_2[0] - tests.add(CTest('Temperature 1', measured_T_1, 97.7193, 5e-5)) - tests.add(CTest('Temperature 2', measured_T_2, 10., 5e-5)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/1_cube_tet_block.py b/katoptron/tests/1_cube_tet_block.py deleted file mode 100644 index 1275b43b..00000000 --- a/katoptron/tests/1_cube_tet_block.py +++ /dev/null @@ -1,127 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -from fwk.testing import * -import os - - -def test(msh, xml_file_name, rank, nThreads): - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - E = 1. * np.ones(ensemble_size) - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - - hf = 1 * np.ones(ensemble_size) - zero = np.zeros(ensemble_size) - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., 1, 0., 1, 0., 1, 10., - ensemble_size) - m.Neumann(pbl, "Surf 1 2", "heat fluxes", 0, zero, 0, zero, 0, zero, 1, hf, - ensemble_size) - - m.Weight(pbl, "Surf 1 2", 1, 1., 1, 1., 1, 1., 1, 2.5, ensemble_size) - - dx = np.zeros(ensemble_size) - dy = 2. * np.ones(ensemble_size) - dz = np.zeros(ensemble_size) - dT = 10. * np.ones(ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Ensemble Convergence Tolerance'] = 10**(-4) - - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Merge block matrix'] = False - solverList['Use blocked status test'] = True - solverList['Use blocked status test: x'] = True - solverList['Use blocked status test: T'] = True - solverList['Ensemble Convergence Tolerance: x'] = 10**(-7) - solverList['Ensemble Convergence Tolerance: T'] = 10**(-7) - solverList['Use weighted status test'] = True - solverList['Ensemble Convergence Tolerance: weights'] = 10**(-7) - - solverList['Write txt files'] = True - solverList['Write matrix and vectors'] = True - - solverList["use xml file"] = True - solverList[ - "MueLu xml file name"] = file_dir + '/../preconditioners/' + xml_file_name - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - slv = m.IterativeSolver(pbl, solverList, 4, ensemble_size) - - slv.start() - - tag_name = "Measure point 1" - which_pos = 0 - which_dof = 3 - DOFperNode = 4 - name_sol = "x_mm.txt" - - pos_1, sol_1 = u.extract(msh, tag_name, DOFperNode, which_pos, which_dof, - ensemble_size, name_sol) - - tag_name = "Measure point 2" - - pos_2, sol_2 = u.extract(msh, tag_name, DOFperNode, which_pos, which_dof, - ensemble_size, name_sol) - - tests = CTests() - measured_T_1 = sol_1[0] - measured_T_2 = sol_2[0] - tests.add(CTest('Temperature 1', measured_T_1, 97.7193, 5e-5)) - tests.add(CTest('Temperature 2', measured_T_2, 10., 5e-5)) - tests.run() - - -if __name__ == "__main__": - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import numpy as np - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - geo_name = '1_cube_tet.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - nThreads = u.Initialize_Kokkos() - directory = '1' - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - test(msh, 'AMG_BGS_gs_gs.xml', rank, nThreads) - os.chdir('..') - - directory = '2' - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - test(msh, 'blockdirect.xml', rank, nThreads) - - u.Finalize_Kokkos() diff --git a/katoptron/tests/2_cubes.geo b/katoptron/tests/2_cubes.geo deleted file mode 100644 index 58dcf0b4..00000000 --- a/katoptron/tests/2_cubes.geo +++ /dev/null @@ -1,77 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - -C1 = 10; -C2 = 9; -nC1 = 4; -nC2 = 5; - -theta = 0*Pi/4; -dx = 0; -dy = 0; -dz = 0.1; -lc = 1; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { C1, 0, 0, lc}; -Point(3) = { C1, 0, C1, lc}; -Point(4) = { 0, 0, C1, lc}; - -Point(5) = { 0, 0, C1+dz, lc}; -Point(6) = { C2, 0, C1+dz, lc}; -Point(7) = { C2, 0, C1+C2+dz, lc}; -Point(8) = { 0, 0, C1+C2+dz, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line(5) = {5, 6}; -Line(6) = {6, 7}; -Line(7) = {7, 8}; -Line(8) = {8, 5}; - -Transfinite Line {1,2,3,4} = nC1+1 Using Progression 1; -Transfinite Line {5,6,7,8} = nC2+1 Using Progression 1; - -Line Loop(11) = {1,2,3,4}; -Plane Surface(12) = {11}; -Transfinite Surface {12}; -Recombine Surface {12}; - -Extrude {0, C1, 0} -{ - Surface{12}; Layers{nC1}; Recombine; -} - -Line Loop(13) = {5,6,7,8}; -Plane Surface(14) = {13}; -Transfinite Surface {14}; -Recombine Surface {14}; - -Rotate {{0,0,1}, {0,0,0}, theta}{Surface{14};} - -Extrude {-C2*Sin(theta), C2*Cos(theta), 0} -{ - Surface{14}; Layers{nC2}; Recombine; -} - -Translate {dx,dy,0} { Volume{2};} - -// physical entities - -Physical Volume("Body 1") = {1}; -Physical Volume("Body 2") = {2}; - -Physical Surface("Surf 1 1") = {-21}; -Physical Surface("Surf 1 2") = {-29}; - -Physical Surface("Surf 2 1") = {-43}; -Physical Surface("Surf 2 2") = {-51}; - -Physical Point("T measure") = {20}; - -Mesh.Partitioner = 2; -Mesh.MetisAlgorithm = 2; -Mesh.MshFilePartitioned = 0; diff --git a/katoptron/tests/2_cubes.py b/katoptron/tests/2_cubes.py deleted file mode 100644 index 6a16393c..00000000 --- a/katoptron/tests/2_cubes.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -#import matplotlib.pyplot as plt - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '2_cubes.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - #E = np.linspace(0.5,1.5,ensemble_size) - E = 1. * np.ones(ensemble_size) - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., - 1, 0., 1, 0., 1, 10., ensemble_size) - m.Dirichlet(pbl, "Surf 2 2", "Clamped", 1, 0., - 1, 0., 1, 2., 1, 20., ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Surf 1 2", "contact", norm) - # cont.setInitialyOpen() - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Surf 2 1", norm) - - dx = np.zeros(ensemble_size) - dy = 2. * np.ones(ensemble_size) - dz = np.zeros(ensemble_size) - dT = 10. * np.ones(ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList["MueLu xml file name"] = file_dir + '/multigrid_2_lvls_3_1.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - u.Finalize_Kokkos() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/2_cubes_fused.geo b/katoptron/tests/2_cubes_fused.geo deleted file mode 100644 index bb37ea4b..00000000 --- a/katoptron/tests/2_cubes_fused.geo +++ /dev/null @@ -1,72 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - -SetFactory("OpenCASCADE"); - -C1 = 10; -C2 = 10; -nC1 = 4; -nC2 = 4; - -theta = 0*Pi/4; -dx = 0; -dy = 0; -dz = 0.; -lc = 1; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { C1, 0, 0, lc}; -Point(3) = { C1, 0, C1, lc}; -Point(4) = { 0, 0, C1, lc}; - -Point(5) = { 0, 0, C1+dz, lc}; -Point(6) = { C2, 0, C1+dz, lc}; -Point(7) = { C2, 0, C1+C2+dz, lc}; -Point(8) = { 0, 0, C1+C2+dz, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line(5) = {5, 6}; -Line(6) = {6, 7}; -Line(7) = {7, 8}; -Line(8) = {8, 5}; - -Transfinite Line {1,2,3,4} = nC1+1 Using Progression 1; -Transfinite Line {5,6,7,8} = nC2+1 Using Progression 1; - -Line Loop(11) = {1,2,3,4}; -Plane Surface(12) = {11}; -Transfinite Surface {12}; -//Recombine Surface {12}; - -Line Loop(13) = {5,6,7,8}; -Plane Surface(14) = {13}; -Transfinite Surface {14}; -//Recombine Surface {14}; - -Extrude {0, C1, 0} -{ - Surface{12}; Layers{nC1}; //Recombine; -} - -Extrude {0, C2, 0} -{ - Surface{14}; Layers{nC2}; //Recombine; -} - -BooleanFragments{ Volume{1,2}; Delete; }{} - -// physical entities - -Physical Volume("Body 1") = {1}; -Physical Volume("Body 2") = {2}; - -Physical Surface("Surf 1 1") = {1}; - -Physical Surface("Surf 2 2") = {8}; - -Physical Point("Pts 1 x") = {1,3}; -Physical Point("Pts 1 y") = {1,2}; diff --git a/katoptron/tests/2_cubes_heat.py b/katoptron/tests/2_cubes_heat.py deleted file mode 100644 index 979fc56c..00000000 --- a/katoptron/tests/2_cubes_heat.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -from fwk.testing import * -from katoptron.readers import read_Belos - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '2_cubes.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - #E = np.linspace(0.5,1.5,ensemble_size) - E = 1. * np.ones(ensemble_size) - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., 1, 0., 1, 0., 1, 10., - ensemble_size) - m.Dirichlet(pbl, "Surf 2 2", "Clamped", 1, 0., 1, 0., 1, -2., 1, 20., - ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Surf 1 2", "contact", norm) - cont.setInitialyOpen() - cont.setMaster(pbl, "Surf 2 1", norm) - - dx = np.zeros(ensemble_size) - dy = 2. * np.ones(ensemble_size) - dz = np.zeros(ensemble_size) - dT = 10. * np.ones(ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList["MueLu xml file name"] = file_dir + '/direct_solver.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 3 - - solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - slv = m.IterativeSolver(pbl, solverList, 4, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - u.Finalize_Kokkos() - - tests = CTests() - measured_total_CPU_cost = slv.getTimers()["total"].read().getReal().sec() - - non_zero_CPU_cost = (measured_total_CPU_cost > 0.) - tests.add(CTest('non zero total CPU cost', non_zero_CPU_cost, True)) - - iter_indices, residuals = read_Belos(work_dir + '/belos_out.txt', 1) - - nIterations = iter_indices[-1] - has_converged = (solverList['Maximum Iterations'] > nIterations) - tests.add(CTest('Has converged', has_converged, True)) - - tag_name = "T measure" - which_pos = 0 - which_dof = 3 - DOFperNode = 4 - name_sol = "x_mm.txt" - - pos_1, sol_1 = u.extract(msh, tag_name, DOFperNode, which_pos, which_dof, - ensemble_size, name_sol) - - measured_T_1 = sol_1[0] - tests.add(CTest('Temperature 1', measured_T_1, 14.170731, 5e-5)) - - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/2_cubes_no_contact.py b/katoptron/tests/2_cubes_no_contact.py deleted file mode 100644 index 1d121172..00000000 --- a/katoptron/tests/2_cubes_no_contact.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '2_cubes.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - E = 1. * np.ones(ensemble_size) - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., - 1, 0., 1, 0., 1, 10., ensemble_size) - m.Dirichlet(pbl, "Surf 2 2", "Clamped", 1, 0., - 1, 0., 1, 2., 1, 20., ensemble_size) - - dx = np.zeros(ensemble_size) - dy = 2. * np.ones(ensemble_size) - dz = np.zeros(ensemble_size) - dT = 10. * np.ones(ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 4 - mueluParams['max levels'] = 1 - mueluParams['smoother: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "Symmetric Gauss-Seidel" - mueluParamsSub2['relaxation: sweeps'] = 1 - mueluParamsSub2['relaxation: damping factor'] = 0.9 - - mueluParams['verbosity'] = "low" - - mueluParams['smoother: params'] = mueluParamsSub2 - - solverList['mueluParams'] = mueluParams - - slv = m.IterativeSolver(pbl, solverList, 4, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - u.Finalize_Kokkos() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/2_cubes_patch.geo b/katoptron/tests/2_cubes_patch.geo deleted file mode 100644 index 5e03a0f5..00000000 --- a/katoptron/tests/2_cubes_patch.geo +++ /dev/null @@ -1,149 +0,0 @@ -C = 10; -dC = 2; -nC1 = 4; -nC2 = 5; - -dz = 0; - -lc = 1; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { C, 0, 0, lc}; -Point(3) = { C, 0, C, lc}; -Point(4) = { 0, 0, C-dC, lc}; - -Point(5) = { 0, C, 0, lc}; -Point(6) = { C, C, 0, lc}; -Point(7) = { C, C, C+dC, lc}; -Point(8) = { 0, C, C, lc}; - -Point(9) = { 0, 0, 2*C+dz, lc}; -Point(10) = { C, 0, 2*C+dz, lc}; -Point(11) = { C, 0, C+dz, lc}; -Point(12) = { 0, 0, C-dC+dz, lc}; - -Point(13) = { 0, C, 2*C+dz, lc}; -Point(14) = { C, C, 2*C+dz, lc}; -Point(15) = { C, C, C+dC+dz, lc}; -Point(16) = { 0, C, C+dz, lc}; - - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line(5) = {5, 6}; -Line(6) = {6, 7}; -Line(7) = {7, 8}; -Line(8) = {8, 5}; - -Line(9) = {1, 5}; -Line(10) = {2, 6}; - -Line(11) = {3, 7}; -Line(12) = {4, 8}; - -Transfinite Line {1,2,3,4,5,6,7,8,9,10,11,12} = nC1+1 Using Progression 1; - -Line Loop(11) = {1,2,3,4}; -Plane Surface(12) = {11}; -Transfinite Surface {12}; -Recombine Surface {12}; - -Line Loop(13) = {-8,-7,-6,-5}; -Plane Surface(14) = {13}; -Transfinite Surface {14}; -Recombine Surface {14}; - -Line Loop(15) = {-9,-4,12,8}; -Plane Surface(16) = {15}; -Transfinite Surface {16}; -Recombine Surface {16}; - -Line Loop(17) = {10,6,-11,-2}; -Plane Surface(18) = {17}; -Transfinite Surface {18}; -Recombine Surface {18}; - -Line Loop(19) = {9,5,-10,-1}; -Plane Surface(20) = {19}; -Transfinite Surface {20}; -Recombine Surface {20}; - -Line Loop(21) = {-12,-3,11,7}; -Plane Surface(22) = {21}; -Transfinite Surface {22}; -Recombine Surface {22}; - -Surface Loop(1) = {22, 16, 20, 14, 18, 12}; -Volume(1) = {1}; - -Line(23) = {9, 10}; -Line(24) = {10, 11}; -Line(25) = {11, 12}; -Line(26) = {12, 9}; - -Line(27) = {13, 14}; -Line(28) = {14, 15}; -Line(29) = {15, 16}; -Line(30) = {16, 13}; - -Line(31) = {9, 13}; -Line(32) = {10, 14}; - -Line(33) = {11, 15}; -Line(34) = {12, 16}; - -Transfinite Line {23,24,25,26,27,28,29,30,31,32,33,34} = nC2+1 Using Progression 1; - -Line Loop(35) = {-26,-25,-24,-23}; -Plane Surface(36) = {35}; -Transfinite Surface {36}; -Recombine Surface {36}; - -Line Loop(37) = {27,28,29,30}; -Plane Surface(38) = {37}; -Transfinite Surface {38}; -Recombine Surface {38}; - -Line Loop(39) = {24,33,-28,-32}; -Plane Surface(40) = {39}; -Transfinite Surface {40}; -Recombine Surface {40}; - -Line Loop(41) = {-33,25,34,-29}; -Plane Surface(42) = {41}; -Transfinite Surface {42}; -Recombine Surface {42}; - -Line Loop(43) = {-34,26,31,-30}; -Plane Surface(44) = {43}; -Transfinite Surface {44}; -Recombine Surface {44}; - -Line Loop(45) = {-31,-27,32,23}; -Plane Surface(46) = {45}; -Transfinite Surface {46}; -Recombine Surface {46}; - -Surface Loop(2) = {36, 38, 40, 42, 44, 46}; -Volume(2) = {2}; -Recombine Volume {1}; -Recombine Volume {2}; - -Transfinite Volume{1,2}; -//+ -Physical Volume("Body 1") = {1}; -//+ -Physical Volume("Body 2") = {2}; -//+ -Physical Surface("Clamped") = {20}; -//+ -Physical Surface("Contact 1") = {22}; -//+ -Physical Surface("Contact 2") = {42}; -//+ -Physical Surface("Load") = {46}; -//+ -Physical Point("Clamped xy") = {1}; diff --git a/katoptron/tests/2_cubes_patch.py b/katoptron/tests/2_cubes_patch.py deleted file mode 100644 index 5d2a8e6b..00000000 --- a/katoptron/tests/2_cubes_patch.py +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -#import matplotlib.pyplot as plt - -from katoptron.eigenvalues import * -from katoptron.convergence import * -from katoptron.readers import read_Belos -from fwk.testing import * - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '2_cubes_patch.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - #E = np.linspace(0.5,1.5,ensemble_size) - E = 10. * np.ones(ensemble_size) - nu = 0.4 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Clamped", "Clamped", 1, 0., 1, 0., 1, 0., 0, 0., - ensemble_size) - #m.Dirichlet(pbl, "Clamped xy", "Clamped",1,0.,1,0.,1,0.,0,0.,ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Contact 2", "contact", norm) - cont.setMeshTying() - cont.setMaster(pbl, "Contact 1", norm) - - zero = np.zeros(ensemble_size) - p = -0.2 * np.ones(ensemble_size) - - m.Neumann(pbl, "Load", "Load 1", 0, zero, 0, zero, 1, p, 0, zero, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList["MueLu xml file name"] = file_dir + '/direct_solver.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - solverList['Create Preconditioned Matrix'] = True - - if ensemble_size > 1: - slv = m.IterativeSolver(pbl, solverList, 3, True, ensemble_size) - else: - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - u.Finalize_Kokkos() - - iter_indices, residuals = read_Belos(work_dir + '/belos_out.txt', 1) - - tests = CTests() - nIterations = iter_indices[-1] - has_converged = (solverList['Maximum Iterations'] > nIterations) - tests.add(CTest('Has converged', has_converged, True)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/2_cubes_patch_2_lvls.py b/katoptron/tests/2_cubes_patch_2_lvls.py deleted file mode 100644 index c1c9082d..00000000 --- a/katoptron/tests/2_cubes_patch_2_lvls.py +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -#import matplotlib.pyplot as plt - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '2_cubes_patch.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - #E = np.linspace(0.5,1.5,ensemble_size) - E = 10. * np.ones(ensemble_size) - nu = 0.4 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Clamped", "Clamped", 1, 0., - 1, 0., 1, 0., 0, 0., ensemble_size) - #m.Dirichlet(pbl, "Clamped xy", "Clamped",1,0.,1,0.,1,0.,0,0.,ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Contact 2", "contact", norm) - cont.setMeshTying() - cont.setMaster(pbl, "Contact 1", norm) - - zero = np.zeros(ensemble_size) - p = -0.2 * np.ones(ensemble_size) - - m.Neumann(pbl, "Load", "Load 1", 0, zero, 0, - zero, 1, p, 0, zero, ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList["MueLu xml file name"] = file_dir + \ - '/../preconditioners/SIMPLE_direct_2_lvls.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - if ensemble_size > 1: - slv = m.IterativeSolver(pbl, solverList, - 3, True, ensemble_size) - else: - slv = m.IterativeSolver(pbl, solverList, - 3, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - u.Finalize_Kokkos() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/2_cubes_patch_BraessSarazin.py b/katoptron/tests/2_cubes_patch_BraessSarazin.py deleted file mode 100644 index a1d6d206..00000000 --- a/katoptron/tests/2_cubes_patch_BraessSarazin.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -#import matplotlib.pyplot as plt -from katoptron.readers import read_Belos -from fwk.testing import * - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '2_cubes_patch.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - #E = np.linspace(0.5,1.5,ensemble_size) - E = 10. * np.ones(ensemble_size) - nu = 0.4 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Clamped", "Clamped", 1, 0., 1, 0., 1, 0., 0, 0., - ensemble_size) - #m.Dirichlet(pbl, "Clamped xy", "Clamped",1,0.,1,0.,1,0.,0,0.,ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Contact 2", "contact", norm) - cont.setMeshTying() - cont.setMaster(pbl, "Contact 1", norm) - - zero = np.zeros(ensemble_size) - p = -0.2 * np.ones(ensemble_size) - - m.Neumann(pbl, "Load", "Load 1", 0, zero, 0, zero, 1, p, 0, zero, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 5000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList["MueLu xml file name"] = file_dir + \ - '/../preconditioners/BraessSarazin_mtgs.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['gamma'] = 1. - #solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - if ensemble_size > 1: - slv = m.IterativeSolver(pbl, solverList, 3, True, ensemble_size) - else: - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - u.Finalize_Kokkos() - - iter_indices, residuals = read_Belos(work_dir + '/belos_out.txt', 1) - - tests = CTests() - nIterations = iter_indices[-1] - has_converged = (solverList['Maximum Iterations'] > nIterations) - tests.add(CTest('Has converged', has_converged, True)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/2_cubes_patch_IndefBlockDiagonal.py b/katoptron/tests/2_cubes_patch_IndefBlockDiagonal.py deleted file mode 100644 index 925d9d81..00000000 --- a/katoptron/tests/2_cubes_patch_IndefBlockDiagonal.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -#import matplotlib.pyplot as plt -from katoptron.readers import read_Belos -from fwk.testing import * - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '2_cubes_patch.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - #E = np.linspace(0.5,1.5,ensemble_size) - E = 10. * np.ones(ensemble_size) - nu = 0.4 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Clamped", "Clamped", 1, 0., 1, 0., 1, 0., 0, 0., - ensemble_size) - #m.Dirichlet(pbl, "Clamped xy", "Clamped",1,0.,1,0.,1,0.,0,0.,ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Contact 2", "contact", norm) - cont.setMeshTying() - cont.setMaster(pbl, "Contact 1", norm) - - zero = np.zeros(ensemble_size) - p = -0.2 * np.ones(ensemble_size) - - m.Neumann(pbl, "Load", "Load 1", 0, zero, 0, zero, 1, p, 0, zero, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 5000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList["MueLu xml file name"] = file_dir + \ - '/../preconditioners/IndefiniteBlockDiagonal_mtgs.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['gamma'] = 1. - #solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - if ensemble_size > 1: - slv = m.IterativeSolver(pbl, solverList, 3, True, ensemble_size) - else: - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - u.Finalize_Kokkos() - - iter_indices, residuals = read_Belos(work_dir + '/belos_out.txt', 1) - - tests = CTests() - nIterations = iter_indices[-1] - has_converged = (solverList['Maximum Iterations'] > nIterations) - tests.add(CTest('Has converged', has_converged, True)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/2_cubes_patch_SIMPLE.py b/katoptron/tests/2_cubes_patch_SIMPLE.py deleted file mode 100644 index 95b1aeaa..00000000 --- a/katoptron/tests/2_cubes_patch_SIMPLE.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -#import matplotlib.pyplot as plt -from katoptron.readers import read_Belos -from fwk.testing import * - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '2_cubes_patch.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - #E = np.linspace(0.5,1.5,ensemble_size) - E = 10. * np.ones(ensemble_size) - nu = 0.4 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Clamped", "Clamped", 1, 0., 1, 0., 1, 0., 0, 0., - ensemble_size) - #m.Dirichlet(pbl, "Clamped xy", "Clamped",1,0.,1,0.,1,0.,0,0.,ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Contact 2", "contact", norm) - cont.setMeshTying() - cont.setMaster(pbl, "Contact 1", norm) - - zero = np.zeros(ensemble_size) - p = -0.2 * np.ones(ensemble_size) - - m.Neumann(pbl, "Load", "Load 1", 0, zero, 0, zero, 1, p, 0, zero, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 5000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['gamma'] = 1. - - solverList["MueLu xml file name"] = file_dir + \ - '/../preconditioners/SIMPLE_direct.xml' - solverList["Create Preconditioned Matrix"] = True - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['gamma'] = 1. - #solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - if ensemble_size > 1: - slv = m.IterativeSolver(pbl, solverList, 3, True, ensemble_size) - else: - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - u.Finalize_Kokkos() - - iter_indices, residuals = read_Belos(work_dir + '/belos_out.txt', 1) - - tests = CTests() - nIterations = iter_indices[-1] - has_converged = (solverList['Maximum Iterations'] > nIterations) - tests.add(CTest('Has converged', has_converged, True)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/2_cubes_patch_SIMPLEC.py b/katoptron/tests/2_cubes_patch_SIMPLEC.py deleted file mode 100644 index b2e47b1b..00000000 --- a/katoptron/tests/2_cubes_patch_SIMPLEC.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -#import matplotlib.pyplot as plt -from katoptron.readers import read_Belos -from fwk.testing import * - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '2_cubes_patch.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - #E = np.linspace(0.5,1.5,ensemble_size) - E = 10. * np.ones(ensemble_size) - nu = 0.4 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Clamped", "Clamped", 1, 0., 1, 0., 1, 0., 0, 0., - ensemble_size) - #m.Dirichlet(pbl, "Clamped xy", "Clamped",1,0.,1,0.,1,0.,0,0.,ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Contact 2", "contact", norm) - cont.setMeshTying() - cont.setMaster(pbl, "Contact 1", norm) - - zero = np.zeros(ensemble_size) - p = -0.2 * np.ones(ensemble_size) - - m.Neumann(pbl, "Load", "Load 1", 0, zero, 0, zero, 1, p, 0, zero, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 5000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList["MueLu xml file name"] = file_dir + \ - '/../preconditioners/SIMPLEC_mtgs.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['gamma'] = 1. - #solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - if ensemble_size > 1: - slv = m.IterativeSolver(pbl, solverList, 3, True, ensemble_size) - else: - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - u.Finalize_Kokkos() - - iter_indices, residuals = read_Belos(work_dir + '/belos_out.txt', 1) - - tests = CTests() - nIterations = iter_indices[-1] - has_converged = (solverList['Maximum Iterations'] > nIterations) - tests.add(CTest('Has converged', has_converged, True)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/2_cubes_patch_Uzawa.py b/katoptron/tests/2_cubes_patch_Uzawa.py deleted file mode 100644 index 1af73294..00000000 --- a/katoptron/tests/2_cubes_patch_Uzawa.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -#import matplotlib.pyplot as plt -from katoptron.readers import read_Belos -from fwk.testing import * - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '2_cubes_patch.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - #E = np.linspace(0.5,1.5,ensemble_size) - E = 10. * np.ones(ensemble_size) - nu = 0.4 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Clamped", "Clamped", 1, 0., 1, 0., 1, 0., 0, 0., - ensemble_size) - #m.Dirichlet(pbl, "Clamped xy", "Clamped",1,0.,1,0.,1,0.,0,0.,ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Contact 2", "contact", norm) - cont.setMeshTying() - cont.setMaster(pbl, "Contact 1", norm) - - zero = np.zeros(ensemble_size) - p = -0.2 * np.ones(ensemble_size) - - m.Neumann(pbl, "Load", "Load 1", 0, zero, 0, zero, 1, p, 0, zero, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 5000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList["MueLu xml file name"] = file_dir + \ - '/../preconditioners/Uzawa_mtgs.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['gamma'] = 1. - #solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - if ensemble_size > 1: - slv = m.IterativeSolver(pbl, solverList, 3, True, ensemble_size) - else: - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - u.Finalize_Kokkos() - - iter_indices, residuals = read_Belos(work_dir + '/belos_out.txt', 1) - - tests = CTests() - nIterations = iter_indices[-1] - has_converged = (solverList['Maximum Iterations'] > nIterations) - tests.add(CTest('Has converged', has_converged, True)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/2_cubes_sticking.geo b/katoptron/tests/2_cubes_sticking.geo deleted file mode 100644 index aa71ad54..00000000 --- a/katoptron/tests/2_cubes_sticking.geo +++ /dev/null @@ -1,72 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - -SetFactory("OpenCASCADE"); - -C1 = 10; -C2 = 10; -nC1 = 4; -nC2 = 4; - -theta = 0*Pi/4; -dx = 0; -dy = 0; -dz = 0.; -lc = 1; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { C1, 0, 0, lc}; -Point(3) = { C1, 0, C1, lc}; -Point(4) = { 0, 0, C1, lc}; - -Point(5) = { 0, 0, C1+dz, lc}; -Point(6) = { C2, 0, C1+dz, lc}; -Point(7) = { C2, 0, C1+C2+dz, lc}; -Point(8) = { 0, 0, C1+C2+dz, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line(5) = {5, 6}; -Line(6) = {6, 7}; -Line(7) = {7, 8}; -Line(8) = {8, 5}; - -Transfinite Line {1,2,3,4} = nC1+1 Using Progression 1; -Transfinite Line {5,6,7,8} = nC2+1 Using Progression 1; - -Line Loop(11) = {1,2,3,4}; -Plane Surface(12) = {11}; -Transfinite Surface {12}; -Recombine Surface {12}; - -Line Loop(13) = {5,6,7,8}; -Plane Surface(14) = {13}; -Transfinite Surface {14}; -Recombine Surface {14}; - -Extrude {0, C1, 0} -{ - Surface{12}; Layers{nC1}; Recombine; -} - -Extrude {0, C2, 0} -{ - Surface{14}; Layers{nC2}; Recombine; -} - -// physical entities - -Physical Volume("Body 1") = {1}; -Physical Volume("Body 2") = {2}; - -Physical Surface("Surf 1 1") = {15}; -Physical Surface("Surf 1 2") = {17}; - -Physical Surface("Surf 2 1") = {20}; -Physical Surface("Surf 2 2") = {22}; - -Physical Point("Pts 1 x") = {1,3}; -Physical Point("Pts 1 y") = {1,2}; diff --git a/katoptron/tests/2_cubes_sticking.py b/katoptron/tests/2_cubes_sticking.py deleted file mode 100644 index 93ed3fbf..00000000 --- a/katoptron/tests/2_cubes_sticking.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -#import matplotlib.pyplot as plt - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '2_cubes.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - E = 1. * np.ones(ensemble_size) - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., - 1, 0., 1, 0., 1, 10., ensemble_size) - m.Dirichlet(pbl, "Surf 2 2", "Clamped", 1, 2., - 1, 2., 1, -2., 1, 20., ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Surf 1 2", "contact", norm) - # cont.setInitialyOpen() - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Surf 2 1", norm) - - dx = np.zeros(ensemble_size) - dy = 2. * np.ones(ensemble_size) - dz = np.zeros(ensemble_size) - dT = 10. * np.ones(ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList["MueLu xml file name"] = file_dir + '/direct_solver.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - #solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - u.Finalize_Kokkos() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/2_cubes_tet.geo b/katoptron/tests/2_cubes_tet.geo deleted file mode 100644 index 5bde791c..00000000 --- a/katoptron/tests/2_cubes_tet.geo +++ /dev/null @@ -1,75 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - -C1 = 10; -C2 = 10; -nC1 = 4; -nC2 = 4; - -theta = 0.1*Pi/4; -dx = 0; -dy = 0; -dz = 0.1; -lc = 1; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { C1, 0, 0, lc}; -Point(3) = { C1, 0, C1, lc}; -Point(4) = { 0, 0, C1, lc}; - -Point(5) = { 0, 0, C1+dz, lc}; -Point(6) = { C2, 0, C1+dz, lc}; -Point(7) = { C2, 0, C1+C2+dz, lc}; -Point(8) = { 0, 0, C1+C2+dz, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line(5) = {5, 6}; -Line(6) = {6, 7}; -Line(7) = {7, 8}; -Line(8) = {8, 5}; - -Transfinite Line {1,2,3,4} = nC1+1 Using Progression 1; -Transfinite Line {5,6,7,8} = nC2+1 Using Progression 1; - -Line Loop(11) = {1,2,3,4}; -Plane Surface(12) = {11}; -Transfinite Surface {12}; -//Recombine Surface {12}; - -Extrude {0, C1, 0} -{ - Surface{12}; Layers{nC1}; //Recombine; -} - -Line Loop(13) = {5,6,7,8}; -Plane Surface(14) = {13}; -Transfinite Surface {14}; -//Recombine Surface {14}; - -Rotate {{0,0,1}, {0,0,0}, theta}{Surface{14};} - -Extrude {-C2*Sin(theta), C2*Cos(theta), 0} -{ - Surface{14}; Layers{nC2}; //Recombine; -} - -Translate {dx,dy,0} { Volume{2};} - -// physical entities - -Physical Volume("Body 1") = {1}; -Physical Volume("Body 2") = {2}; - -Physical Surface("Surf 1 1") = {-21}; -Physical Surface("Surf 1 2") = {-29}; - -Physical Surface("Surf 2 1") = {-43}; -Physical Surface("Surf 2 2") = {-51}; - -//Mesh.Partitioner = 2; -//Mesh.MetisAlgorithm = 2; -//Mesh.MshFilePartitioned = 0; diff --git a/katoptron/tests/2_cubes_tet.py b/katoptron/tests/2_cubes_tet.py deleted file mode 100644 index acb1c293..00000000 --- a/katoptron/tests/2_cubes_tet.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -#import matplotlib.pyplot as plt - - -def main(): - comm, rank, size = u.import_MPI() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '2_cubes_tet.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - #E = np.linspace(0.5,1.5,ensemble_size) - E = 1. * np.ones(ensemble_size) - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., - 1, 0., 1, 0., 1, 10., ensemble_size) - m.Dirichlet(pbl, "Surf 2 2", "Clamped", 1, 0., - 1, 0., 1, 2., 1, 20., ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Surf 1 2", "contact", norm) - # cont.setInitialyOpen() - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Surf 2 1", norm) - - dx = np.zeros(ensemble_size) - dy = 2. * np.ones(ensemble_size) - dz = np.zeros(ensemble_size) - dT = 10. * np.ones(ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList["MueLu xml file name"] = file_dir + '/multigrid_2_lvls_3_1.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - u.Finalize_Kokkos() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/3_cubes.geo b/katoptron/tests/3_cubes.geo deleted file mode 100644 index 30d5eecd..00000000 --- a/katoptron/tests/3_cubes.geo +++ /dev/null @@ -1,107 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - -C1 = 10; -C2 = 9; -C3 = 10; -nC1 = 4; -nC2 = 5; -nC3 = 6; - -theta1 = 0.1*Pi/4; -theta2 = -0.1*Pi/4; - -dx1 = 0; -dy1 = 0; -dz1 = 0.1; -dx2 = 0; -dy2 = 0; -dz2 = 0.1; -lc = 1; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { C1, 0, 0, lc}; -Point(3) = { C1, 0, C1, lc}; -Point(4) = { 0, 0, C1, lc}; - -Point(5) = { 0, 0, C1+dz1, lc}; -Point(6) = { C2, 0, C1+dz1, lc}; -Point(7) = { C2, 0, C1+C2+dz1, lc}; -Point(8) = { 0, 0, C1+C2+dz1, lc}; - -Point(9) = { 0, 0, C1+C2+dz1+dz2, lc}; -Point(10) = { C3, 0, C1+C2+dz1+dz2, lc}; -Point(11) = { C3, 0, C1+C2+C3+dz1+dz2, lc}; -Point(12) = { 0, 0, C1+C2+C3+dz1+dz2, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line(5) = {5, 6}; -Line(6) = {6, 7}; -Line(7) = {7, 8}; -Line(8) = {8, 5}; - -Line(9) = {9, 10}; -Line(10) = {10, 11}; -Line(11) = {11, 12}; -Line(12) = {12, 9}; - -Transfinite Line {1,2,3,4} = nC1+1 Using Progression 1; -Transfinite Line {5,6,7,8} = nC2+1 Using Progression 1; -Transfinite Line {9,10,11,12} = nC3+1 Using Progression 1; - -Line Loop(13) = {1,2,3,4}; -Plane Surface(14) = {13}; -Transfinite Surface {14}; -Recombine Surface {14}; - -Extrude {0, C1, 0} -{ - Surface{14}; Layers{nC1}; Recombine; -} - -Line Loop(15) = {5,6,7,8}; -Plane Surface(16) = {15}; -Transfinite Surface {16}; -Recombine Surface {16}; - -Rotate {{0,0,1}, {0,0,0}, theta1}{Surface{16};} - -Extrude {-C2*Sin(theta1), C2*Cos(theta1), 0} -{ - Surface{16}; Layers{nC2}; Recombine; -} - -Translate {dx1,dy1,0} { Volume{2};} - -Line Loop(17) = {9,10,11,12}; -Plane Surface(18) = {17}; -Transfinite Surface {18}; -Recombine Surface {18}; - -Rotate {{0,0,1}, {0,0,0}, theta2}{Surface{18};} - -Extrude {-C3*Sin(theta2), C3*Cos(theta2), 0} -{ - Surface{18}; Layers{nC3}; Recombine; -} - -Translate {dx2,dy2,0} { Volume{3};} - -// physical entities - -Physical Volume("Body 1") = {1}; -Physical Volume("Body 2") = {2}; -Physical Volume("Body 3") = {3}; - -Physical Surface("Surf 1 1") = {-23}; -Physical Surface("Surf 1 2") = {-31}; - -Physical Surface("Surf 2 1") = {-45}; -Physical Surface("Surf 2 2") = {-53}; - -Physical Surface("Surf 3 1") = {-67}; -Physical Surface("Surf 3 2") = {-75}; diff --git a/katoptron/tests/3_cubes_partial_sticking.py b/katoptron/tests/3_cubes_partial_sticking.py deleted file mode 100644 index 7e05beac..00000000 --- a/katoptron/tests/3_cubes_partial_sticking.py +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -#import matplotlib.pyplot as plt - - -def main(): - comm, rank, size = u.import_MPI() - - nThreads = u.Initialize_Kokkos() - - from PyTrilinos import Teuchos - - import shlex - import subprocess - import os - import numpy as np - - geo_name = '3_cubes.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - #E = np.linspace(0.5,1.5,ensemble_size) - E = 1. * np.ones(ensemble_size) - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - m.Medium(pbl, "Body 2", "test", E, nu, k, d) - m.Medium(pbl, "Body 3", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., - 1, 0., 1, 0., 1, 10., ensemble_size) - m.Dirichlet(pbl, "Surf 3 2", "Clamped", 1, 2., - 1, 2., 1, -2., 1, 20., ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Surf 1 2", "contact", norm) - # cont.setInitialyOpen() - # cont.setNoUpdate() - # cont.setSticking() - cont.setMaster(pbl, "Surf 2 1", norm) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "Surf 2 2", "contact", norm) - # cont.setInitialyOpen() - cont.setNoUpdate() - cont.setSticking() - cont.setMaster(pbl, "Surf 3 1", norm) - - dx = np.zeros(ensemble_size) - dy = 2. * np.ones(ensemble_size) - #dy = np.linspace(0.5,1.5,ensemble_size) - dz = np.zeros(ensemble_size) - dT = 10. * np.ones(ensemble_size) - #m.Dirichlet(pbl, "Surf 2", "Moved",0,dx,1,dy,0,dz,1,dT) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 1000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList["MueLu xml file name"] = file_dir + '/direct_solver.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 5 - - #solverList['Print Teuchos timers'] = True - solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - if ensemble_size > 1: - slv = m.IterativeSolver(pbl, solverList, - 3, True, ensemble_size) - else: - slv = m.IterativeSolver(pbl, solverList, - 3, ensemble_size) - - slv.start() - - u.Finalize_Kokkos() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/L_shape.py b/katoptron/tests/L_shape.py deleted file mode 100644 index 6a80366f..00000000 --- a/katoptron/tests/L_shape.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -#import matplotlib.pyplot as plt - -import katoptron.utilities as u - - -def main(): - comm, rank, size = u.import_MPI() - - from fwk.wutils import parseargs - args = parseargs() - - from PyTrilinos import Teuchos - import os - import numpy as np - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh = u.fuse_meshes('L_shape_1.geo', 'L_shape_1', 'L_shape_2.geo', - 'L_shape_2', 'L_shape_fused', file_dir, work_dir, comm, rank, size) - - ensemble_size = 1 - - pbl = m.Problem(msh, comm) - - E = 10. * np.ones(ensemble_size) - nu = 0.4 * np.ones(ensemble_size) - k = 0.114 - d = 0. - m.Medium(pbl, "body", "test", E, nu, k, d) - - m.Dirichlet(pbl, "clamping", "Clamped", 1, 0., - 1, 0., 1, 0., 0, 0., ensemble_size) - #m.Dirichlet(pbl, "load", "Clamped",1,0.,1,2.,1,0.,0,0.,ensemble_size) - - norm = tbox.Vector3d(0, 0, -1) - cont = m.Contact(pbl, "outer part boundary 1", "contact", norm) - cont.setMeshTying() - cont.setMaster(pbl, "inner edge boundary 1", norm) - cont1 = m.Contact(pbl, "inner edge boundary 2", "contact", norm) - cont1.setMeshTying() - cont1.setMaster(pbl, "outer part boundary 2", norm) - cont2 = m.Contact(pbl, "outer part boundary 3", "contact", norm) - cont2.setMeshTying() - cont2.setMaster(pbl, "inner edge boundary 3", norm) - cont3 = m.Contact(pbl, "inner edge boundary 4", "contact", norm) - cont3.setMeshTying() - cont3.setMaster(pbl, "outer part boundary 4", norm) - f = -0.002 * np.ones(ensemble_size) - zero = np.zeros(ensemble_size) - - m.Neumann(pbl, "load", "load", 0, zero, 1, - f, 0, zero, 0, zero, ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 10 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList["MueLu xml file name"] = file_dir + '/direct_solver.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - #solverList['Write matrix and vectors'] = True - solverList['Write txt files'] = True - - nThreads = u.Initialize_Kokkos() - - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - slv.start() - - u.Finalize_Kokkos() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/L_shape_1.geo b/katoptron/tests/L_shape_1.geo deleted file mode 100644 index faef02ea..00000000 --- a/katoptron/tests/L_shape_1.geo +++ /dev/null @@ -1,95 +0,0 @@ -SetFactory("OpenCASCADE"); - -LX = 10; -lx = 2; -LY = 10; -ly = 2; -LZ = 2; -lix = 1; -liy = 1; - -nlix = 11; -nliy = 11; - -nloiy = 4; -nloix = 4; -nloey = 4; -nloex = 4; - -nLX = 8; -nLY = 8; - -nZ1 = 8; -nZ2 = 5; - -lc = 1; - -Point(1) = { lx, ly, 0., lc}; -Point(2) = { lx+lix, ly, 0., lc}; -Point(3) = { lx+lix, ly-liy, 0., lc}; -Point(4) = { lx, ly-liy, 0., lc}; -Point(5) = { lx-lix, ly-liy, 0., lc}; -Point(6) = { lx-lix, ly, 0., lc}; -Point(7) = { lx-lix, ly+liy, 0., lc}; -Point(8) = { lx, ly+liy, 0., lc}; -//+ -Line(1) = {1, 2}; -//+ -Line(2) = {2, 3}; -//+ -Line(3) = {3, 4}; -//+ -Line(4) = {4, 5}; -//+ -Line(5) = {5, 6}; -//+ -Line(6) = {6, 7}; -//+ -Line(7) = {7, 8}; -//+ -Line(8) = {8, 1}; -//+ -Line(9) = {1, 6}; -//+ -Line(10) = {1, 4}; -//+ -Line Loop(1) = {1, 2, 3, -10}; -//+ -Plane Surface(1) = {1}; -//+ -Line Loop(2) = {10, 4, 5, -9}; -//+ -Plane Surface(2) = {2}; -//+ -Line Loop(3) = {9, 6, 7, 8}; -//+ -Plane Surface(3) = {3}; -//+ -Transfinite Line {7, 9, 4, 3, 1} = nlix Using Progression 1; -//+ -Transfinite Line {6, 5, 8, 10, 2} = nliy Using Progression 1; -//+ -Transfinite Surface {2}; -Recombine Surface {2}; -//+ -Transfinite Surface {3}; -Recombine Surface {3}; -//+ -Transfinite Surface {1}; -Recombine Surface {1}; - - -Extrude {0, 0, LZ} -{ - Surface{1,2,3}; Layers{nZ1}; Recombine; -} - - -Physical Volume("body") = {1,2,3}; -//+ -Physical Surface("inner edge boundary 1") = {14}; -Physical Surface("inner edge boundary 2") = {13,10}; -Physical Surface("inner edge boundary 3") = {9,6}; -Physical Surface("inner edge boundary 4") = {5}; -//+ -Physical Line("slave Dirichlet") = {24, 19, 14}; diff --git a/katoptron/tests/L_shape_2.geo b/katoptron/tests/L_shape_2.geo deleted file mode 100644 index 8edb92cd..00000000 --- a/katoptron/tests/L_shape_2.geo +++ /dev/null @@ -1,167 +0,0 @@ -SetFactory("OpenCASCADE"); - -LX = 10; -lx = 2; -LY = 10; -ly = 2; -LZ = 2; -lix = 1; -liy = 1; - -nlix = 10; -nliy = 10; - -nloiy = 4; -nloix = 4; -nloey = 4; -nloex = 4; - -nLX = 16; -nLY = 16; - -nZ1 = 8; -nZ2 = 5; - -lc = 1; - -dx = 0.; - -Point(9) = { lx+lix+dx, ly, 0., lc}; -Point(10) = { LX, ly, 0., lc}; -Point(11) = { LX, 0, 0., lc}; -Point(12) = { lx+lix+dx, 0, 0., lc}; -Point(13) = { 0, 0, 0., lc}; -Point(14) = { 0, ly-liy-dx, 0., lc}; -Point(15) = { 0, ly+liy+dx, 0., lc}; -Point(16) = { 0, LY, 0., lc}; -Point(17) = { lx, LY, 0., lc}; -Point(18) = { lx, ly+liy+dx, 0., lc}; -Point(19) = { lx-lix-dx, ly+liy+dx, 0., lc}; -Point(20) = { lx-lix-dx, ly-liy-dx, 0., lc}; -Point(21) = { lx+lix+dx, ly-liy-dx, 0., lc}; - -Point(22) = { LX, ly-liy-dx, 0., lc}; -Point(23) = { lx-lix-dx, 0, 0., lc}; -Point(24) = { lx-lix-dx, LY, 0., lc}; -//+ -Line(11) = {21, 9}; -//+ -Line(12) = {21, 12}; -//+ -Line(13) = {11, 22}; -//+ -Line(14) = {22, 10}; -//+ -Line(15) = {23, 20}; -//+ -Line(16) = {13, 14}; -//+ -Line(17) = {18, 17}; -//+ -Line(18) = {24, 19}; -//+ -Line(19) = {15, 16}; -//+ -Line(20) = {18, 19}; -//+ -Line(21) = {19, 15}; -//+ -Line(22) = {15, 14}; -//+ -Line(23) = {14, 20}; -//+ -Line(24) = {20, 19}; -//+ -Line(25) = {13, 23}; -//+ -Line(26) = {23, 12}; -//+ -Line(27) = {21, 20}; -//+ -Line(28) = {9, 10}; -//+ -Line(29) = {22, 21}; -//+ -Line(30) = {12, 11}; -//+ -Line(31) = {24, 17}; -//+ -Line(32) = {24, 16}; -//+ -Line Loop(4) = {19, -32, 18, 21}; -//+ -Plane Surface(4) = {4}; -//+ -Line Loop(5) = {17, -31, 18, -20}; -//+ -Plane Surface(5) = {5}; -//+ -Line Loop(6) = {24, 21, 22, 23}; -//+ -Plane Surface(6) = {6}; -//+ -Line Loop(7) = {16, 23, -15, -25}; -//+ -Plane Surface(7) = {7}; -//+ -Line Loop(8) = {26, -12, 27, -15}; -//+ -Plane Surface(8) = {8}; -//+ -Line Loop(9) = {12, 30, 13, 29}; -//+ -Plane Surface(9) = {9}; -//+ -Line Loop(10) = {11, 28, -14, 29}; -//+ -Plane Surface(10) = {10}; -//+ -Transfinite Line {19, 18, 17} = nLY Using Progression 1; -//+ -Transfinite Line {28, 29, 30} = nLX Using Progression 1; -//+ -Transfinite Line {11, 14} = nloiy Using Progression 1; -//+ -Transfinite Line {13, 12, 15, 16} = nloey Using Progression 1; -//+ -Transfinite Line {25, 23, 21, 32} = nloex Using Progression 1; -//+ -Transfinite Line {20, 31} = nloix Using Progression 1; -//+ -Transfinite Line {27, 26} = 2*nloix Using Progression 1; -//+ -Transfinite Line {24, 22} = 2*nloiy Using Progression 1; - - -Transfinite Surface {4}; -Transfinite Surface {5}; -Transfinite Surface {6}; -Transfinite Surface {7}; -Transfinite Surface {8}; -Transfinite Surface {9}; -Transfinite Surface {10}; - -Recombine Surface {4}; -Recombine Surface {5}; -Recombine Surface {6}; -Recombine Surface {7}; -Recombine Surface {8}; -Recombine Surface {9}; -Recombine Surface {10}; - - -Extrude {0, 0, LZ} -{ - Surface{4,5,6,7,8,9,10}; Layers{nZ2}; Recombine; -} - -Physical Volume("body") = {1,2,3,4,5,6,7}; -//+ -Physical Surface("outer part boundary 1") = {18}; -Physical Surface("outer part boundary 2") = {20}; -Physical Surface("outer part boundary 3") = {30}; -Physical Surface("outer part boundary 4") = {36}; -//+ -Physical Surface("clamping") = {12, 17}; -//+ -Physical Surface("load") = {38, 33}; diff --git a/katoptron/tests/L_shape_curv_1.geo b/katoptron/tests/L_shape_curv_1.geo deleted file mode 100644 index 3d9aa49e..00000000 --- a/katoptron/tests/L_shape_curv_1.geo +++ /dev/null @@ -1,134 +0,0 @@ -SetFactory("OpenCASCADE"); - -LX = 10; -lx = 2; -LY = 10; -ly = 2; -LZ = 2; - -nR1 = 5; - -R = 0.999; -R2 = 1.; -R_in_1 = 0.4; -R_in_2 = 0.5; - -nR = 14; -nT1 = 9; - -nZ1 = 5; - -nZ2 = 4; -nl = 7; -nLX=5; -nLY=10; -nR2=5; - -PI = Acos (-1.); - -dtheta = 0.001*PI; - -lc = 1; - -Point(1) = { lx, ly, 0., lc}; -Point(2) = { lx+R*Cos(0*PI+dtheta), ly+R*Sin(0*PI+dtheta), 0., lc}; -Point(3) = { lx+R*Cos(-1*PI/4+dtheta), ly+R*Sin(-1*PI/4+dtheta), 0., lc}; -Point(4) = { lx+R*Cos(-2*PI/4+dtheta), ly+R*Sin(-2*PI/4+dtheta), 0., lc}; -Point(5) = { lx+R*Cos(-3*PI/4+dtheta), ly+R*Sin(-3*PI/4+dtheta), 0., lc}; -Point(6) = { lx+R*Cos(-4*PI/4+dtheta), ly+R*Sin(-4*PI/4+dtheta), 0., lc}; -Point(7) = { lx+R*Cos(-5*PI/4+dtheta), ly+R*Sin(-5*PI/4+dtheta), 0., lc}; -Point(8) = { lx+R*Cos(-6*PI/4+dtheta), ly+R*Sin(-6*PI/4+dtheta), 0., lc}; - -Point(9) = { lx+R_in_1*Cos(0*PI+dtheta), ly+R_in_1*Sin(0*PI+dtheta), 0., lc}; -Point(10) = { lx+R_in_2*Cos(-1*PI/4+dtheta), ly+R_in_2*Sin(-1*PI/4+dtheta), 0., lc}; -Point(11) = { lx+R_in_1*Cos(-2*PI/4+dtheta), ly+R_in_1*Sin(-2*PI/4+dtheta), 0., lc}; -Point(12) = { lx+R_in_2*Cos(-3*PI/4+dtheta), ly+R_in_2*Sin(-3*PI/4+dtheta), 0., lc}; -Point(13) = { lx+R_in_1*Cos(-4*PI/4+dtheta), ly+R_in_1*Sin(-4*PI/4+dtheta), 0., lc}; -Point(14) = { lx+R_in_2*Cos(-5*PI/4+dtheta), ly+R_in_2*Sin(-5*PI/4+dtheta), 0., lc}; -Point(15) = { lx+R_in_1*Cos(-6*PI/4+dtheta), ly+R_in_1*Sin(-6*PI/4+dtheta), 0., lc}; - -Circle(101) = {2, 1, 3}; -Circle(102) = {3, 1, 4}; -Circle(103) = {4, 1, 5}; -Circle(104) = {5, 1, 6}; -Circle(105) = {6, 1, 7}; -Circle(106) = {7, 1, 8}; - -Line(201) = {9, 10}; -Line(202) = {10,11}; -Line(203) = {11,12}; -Line(204) = {12,13}; -Line(205) = {13,14}; -Line(206) = {14,15}; - - -Line(151) = {2, 9}; -Line(152) = {3,10}; -Line(153) = {4,11}; -Line(154) = {5,12}; -Line(155) = {6,13}; -Line(156) = {7,14}; -Line(157) = {8,15}; - -Line(251) = {9, 1}; -Line(252) = {11,1}; -Line(253) = {13,1}; -Line(254) = {15,1}; - -Transfinite Line {204, 203, 253, 205, 206, 254, 252, 251, 202, 201, 101, 102, 103, 104, 105, 106} = nT1 Using Progression 1; -Transfinite Line {157, 156, 155, 154, 153, 152, 151} = nR Using Progression 1; - -Line Loop(1) = {151, 201, -152, -101}; -Plane Surface(1) = {1}; -Transfinite Surface {1}; -Recombine Surface {1}; - -Line Loop(2) = {152, 202, -153, -102}; -Plane Surface(2) = {2}; -Transfinite Surface {2}; -Recombine Surface {2}; - -Line Loop(3) = {153, 203, -154, -103}; -Plane Surface(3) = {3}; -Transfinite Surface {3}; -Recombine Surface {3}; - -Line Loop(4) = {154, 204, -155, -104}; -Plane Surface(4) = {4}; -Transfinite Surface {4}; -Recombine Surface {4}; - -Line Loop(5) = {155, 205, -156, -105}; -Plane Surface(5) = {5}; -Transfinite Surface {5}; -Recombine Surface {5}; - -Line Loop(6) = {156, 206, -157, -106}; -Plane Surface(6) = {6}; -Transfinite Surface {6}; -Recombine Surface {6}; - -Line Loop(7) = {251, -252, -202, -201}; -Plane Surface(7) = {7}; -Transfinite Surface {7}; -Recombine Surface {7}; - -Line Loop(8) = {252, -253, -204, -203}; -Plane Surface(8) = {8}; -Transfinite Surface {8}; -Recombine Surface {8}; - -Line Loop(9) = {254, -253, 205, 206}; -Plane Surface(9) = {9}; -Transfinite Surface {9}; -Recombine Surface {9}; - -Extrude {0, 0, LZ} -{ - Surface{1,2,3,4,5,6,7,8,9}; Layers{nZ1}; Recombine; -} - -Physical Volume("body") = {1,2,3,4,5,6,7,8,9}; -//+ -Physical Surface("inner edge boundary") = {33, 29, 25, 21, 17, 13}; -//Physical Surface("inner edge boundary") = {33}; diff --git a/katoptron/tests/L_shape_curv_2.geo b/katoptron/tests/L_shape_curv_2.geo deleted file mode 100644 index 68fa8cda..00000000 --- a/katoptron/tests/L_shape_curv_2.geo +++ /dev/null @@ -1,163 +0,0 @@ -SetFactory("OpenCASCADE"); - -LX = 10; -lx = 2; -LY = 10; -ly = 2; -LZ = 2; - -nR1 = 5; - -R = 1.; -R2 = 1.; -R_in_1 = 0.4; -R_in_2 = 0.5; - -nR = 14; -nT1 = 7; - -nZ1 = 5; - -nZ2 = 4; -nl = 5; -nLX=5; -nLY=10; -nR2=5; - -PI = Acos (-1.); - -dtheta = 0.1*PI; - -lc = 1; -Point(1) = { lx, ly, 0., lc}; -Point(16) = { 0, 0, 0, lc}; -Point(17) = { lx, 0, 0, lc}; -Point(18) = { 2*lx, 0, 0, lc}; -Point(19) = { LX, 0, 0, lc}; -Point(20) = { LX, ly, 0, lc}; -Point(21) = { 2*lx, ly, 0, lc}; -Point(22) = { lx+R2*Cos(0*PI), ly+R2*Sin(0*PI), 0, lc}; -Point(23) = { lx+R2*Cos(-1*PI/4+dtheta), ly+R2*Sin(-1*PI/4+dtheta), 0, lc}; -Point(24) = { lx+R2*Cos(-2*PI/4+dtheta), ly+R2*Sin(-2*PI/4+dtheta), 0, lc}; -Point(25) = { lx+R2*Cos(-3*PI/4+dtheta), ly+R2*Sin(-3*PI/4+dtheta), 0, lc}; -Point(26) = { lx+R2*Cos(-4*PI/4-dtheta), ly+R2*Sin(-4*PI/4-dtheta), 0, lc}; -Point(27) = { lx+R2*Cos(-5*PI/4-dtheta), ly+R2*Sin(-5*PI/4-dtheta), 0, lc}; -Point(28) = { lx+R2*Cos(-6*PI/4), ly+R2*Sin(-6*PI/4), 0, lc}; -Point(29) = { lx, 2*ly, 0, lc}; -Point(30) = { lx, LY, 0, lc}; -Point(31) = { 0, LY, 0, lc}; -Point(32) = { 0, 2*ly, 0, lc}; -Point(33) = { 0, ly, 0, lc}; - - -//+ -Line(255) = {16, 17}; -//+ -Line(256) = {17, 18}; -//+ -Line(257) = {18, 19}; -//+ -Line(258) = {19, 20}; -//+ -Line(259) = {20, 21}; -//+ -Line(260) = {16, 33}; -//+ -Line(261) = {33, 32}; -//+ -Line(262) = {32, 31}; -//+ -Line(263) = {31, 30}; -//+ -Line(264) = {30, 29}; -//+ -Line(265) = {17, 24}; -//+ -Line(266) = {16, 25}; -//+ -Line(267) = {18, 23}; -//+ -Line(268) = {22, 21}; -//+ -Line(269) = {26, 33}; -//+ -Line(270) = {27, 32}; -//+ -Line(271) = {28, 29}; -//+ -Circle(272) = {22, 1, 23}; -//+ -Circle(273) = {23, 1, 24}; -//+ -Circle(274) = {24, 1, 25}; -//+ -Circle(275) = {25, 1, 26}; -//+ -Circle(276) = {26, 1, 27}; -//+ -Circle(277) = {27, 1, 28}; -//+ -Line(278) = {18, 21}; -//+ -Line(279) = {29, 32}; - -Transfinite Line {263, 279, 277, 258, 278, 272, 273, 256, 255, 274, 260, 275, 276, 261} = nl Using Progression 1; -Transfinite Line {271, 270, 269, 266, 265, 267, 268} = nR2 Using Progression 1; -Transfinite Line {257, 259} = nLX Using Progression 1; -Transfinite Line {264, 262} = nLY Using Progression 1; - - -Line Loop(10) = {277, 271, 279, -270}; -Plane Surface(10) = {10}; - -Transfinite Surface {10}; -Recombine Surface {10}; - -Line Loop(11) = {276, 270, -261, -269}; -Plane Surface(11) = {11}; -Transfinite Surface {11}; -Recombine Surface {11}; - -Line Loop(12) = {266, 275, 269, -260}; -Plane Surface(12) = {12}; -Transfinite Surface {12}; -Recombine Surface {12}; - -Line Loop(13) = {266, -274, -265, -255}; -Plane Surface(13) = {13}; -Transfinite Surface {13}; -Recombine Surface {13}; - -Line Loop(14) = {265, -273, -267, -256}; -Plane Surface(14) = {14}; -Transfinite Surface {14}; -Recombine Surface {14}; - -Line Loop(15) = {267, -272, 268, -278}; -Plane Surface(15) = {15}; -Transfinite Surface {15}; -Recombine Surface {15}; - -Line Loop(16) = {278, -259, -258, -257}; -Plane Surface(16) = {16}; -Transfinite Surface {16}; -Recombine Surface {16}; - -Line Loop(17) = {279, 262, 263, 264}; -Plane Surface(17) = {17}; -Transfinite Surface {17}; -Recombine Surface {17}; - -Extrude {0, 0, LZ} -{ - Surface{10,11,12,13,14,15,16,17}; Layers{nZ2}; Recombine; -} - -Physical Volume("body") = {1,2,3,4,5,6,7,8}; -//+ -Physical Surface("clamping") = {48}; -//+ -Physical Surface("load") = {44}; -//+ -Physical Surface("outer part boundary") = {18, 23, 28, 31, 39, 35}; -//Physical Surface("outer part boundary") = {18}; diff --git a/katoptron/tests/M1_optic_test.py b/katoptron/tests/M1_optic_test.py deleted file mode 100644 index 156c5c0a..00000000 --- a/katoptron/tests/M1_optic_test.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron.utilities as u -import numpy as np -import os -from fwk.testing import * - - -def rigid_body_mode(dz, theta_x, theta_y, x, y, x_c, y_c): - dz_test = np.zeros(x.shape) - dz_test = -np.sin(theta_x)*(y-y_c)+np.cos(theta_x)*dz_test - dz_test = -np.sin(theta_y)*(x-x_c)+np.cos(theta_y)*dz_test - dz_test = dz_test + dz - return dz_test - - -def main(): - file_dir = os.path.dirname(__file__) - - npzfile = np.load(file_dir+'/mirror_data.npz') - x = npzfile['x'] - y = npzfile['y'] - z = np.zeros(x.shape) - tri = npzfile['tri'] - dz = npzfile['dz'] - - dz_1 = 0 - dz_2 = (0.5 / 1000) - dz_3 = (0.87 / 1000) - dz_4 = (-2.1 / 1000) - - theta_x_1 = 0 - theta_x_2 = 0.0015 - theta_x_3 = -0.0005 - theta_x_4 = -0.0002 - - theta_y_1 = -0.2 - theta_y_2 = -0.0005 - theta_y_3 = 0.0015 - theta_y_4 = 0.0008 - - passed_1 = 0 - passed_2 = 1 - passed_3 = 1 - passed_4 = 0 - - dz_test_1 = rigid_body_mode(dz_1, theta_x_1, theta_y_1, x, y, 0.069, 0.04) - dz_test_2 = rigid_body_mode(dz_2, theta_x_2, theta_y_2, x, y, 0.069, 0.04) - dz_test_3 = rigid_body_mode(dz_3, theta_x_3, theta_y_3, x, y, 0.069, 0.04) - dz_test_4 = rigid_body_mode(dz_4, theta_x_4, theta_y_4, x, y, 0.069, 0.04) - - optical_coefficients_1, dz_residual_1 = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz_test_1, "m", np.array([0.069, 0.04])) - - optical_coefficients_2, dz_residual_2 = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz_test_2, "m", np.array([0.069, 0.04])) - - optical_coefficients_3, dz_residual_3 = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz_test_3, "m", np.array([0.069, 0.04])) - - optical_coefficients_4, dz_residual_4 = u.compute_RBM_Curvature_Irreg( - x, y, z, tri, dz_test_4, "m", np.array([0.069, 0.04])) - - tests = CTests() - measured_dz_1 = optical_coefficients_1[0] - tests.add(CTest('piston mode test 1', measured_dz_1, dz_1*1000, 0.05)) - measured_dz_2 = optical_coefficients_2[0] - tests.add(CTest('piston mode test 2', measured_dz_2, dz_2*1000, 0.05)) - measured_dz_3 = optical_coefficients_3[0] - tests.add(CTest('piston mode test 3', measured_dz_3, dz_3*1000, 0.05)) - measured_dz_4 = optical_coefficients_4[0] - tests.add(CTest('piston mode test 4', measured_dz_4, dz_4*1000, 0.05)) - - measured_ry_1 = optical_coefficients_1[1] - tests.add(CTest('y rotation test 1', measured_ry_1, theta_y_1, 0.05)) - measured_ry_2 = optical_coefficients_2[1] - tests.add(CTest('y rotation test 2', measured_ry_2, theta_y_2, 0.05)) - measured_ry_3 = optical_coefficients_3[1] - tests.add(CTest('y rotation test 3', measured_ry_3, theta_y_3, 0.05)) - measured_ry_4 = optical_coefficients_4[1] - tests.add(CTest('y rotation test 4', measured_ry_4, theta_y_4, 0.05)) - - measured_rx_1 = optical_coefficients_1[2] - tests.add(CTest('x rotation test 1', measured_rx_1, theta_x_1, 0.05)) - measured_rx_2 = optical_coefficients_2[2] - tests.add(CTest('x rotation test 2', measured_rx_2, theta_x_2, 0.05)) - measured_rx_3 = optical_coefficients_3[2] - tests.add(CTest('x rotation test 3', measured_rx_3, theta_x_3, 0.05)) - measured_rx_4 = optical_coefficients_4[2] - tests.add(CTest('x rotation test 4', measured_rx_4, theta_x_4, 0.05)) - - measured_cur_1 = optical_coefficients_1[3] - tests.add(CTest('curvature change test 1', measured_cur_1, 0., 1e-10)) - measured_cur_2 = optical_coefficients_2[3] - tests.add(CTest('curvature change test 2', measured_cur_2, 0., 1e-10)) - measured_cur_3 = optical_coefficients_3[3] - tests.add(CTest('curvature change test 3', measured_cur_3, 0., 1e-10)) - measured_cur_4 = optical_coefficients_4[3] - tests.add(CTest('curvature change test 4', measured_cur_4, 0., 1e-10)) - - measured_irr_1 = optical_coefficients_1[4] - tests.add(CTest('irregularity change test 1', measured_irr_1, 0., 1e-10)) - measured_irr_2 = optical_coefficients_2[4] - tests.add(CTest('irregularity change test 2', measured_irr_2, 0., 1e-10)) - measured_irr_3 = optical_coefficients_3[4] - tests.add(CTest('irregularity change test 3', measured_irr_3, 0., 1e-10)) - measured_irr_4 = optical_coefficients_4[4] - tests.add(CTest('irregularity change test 4', measured_irr_4, 0., 1e-10)) - - blurred_1 = u.check_optical_tolerance(optical_coefficients_1, 'mm') - blurred_2 = u.check_optical_tolerance(optical_coefficients_2, 'mm') - blurred_3 = u.check_optical_tolerance(optical_coefficients_3, 'mm') - blurred_4 = u.check_optical_tolerance(optical_coefficients_4, 'mm') - tests.add(CTest('checl optical tolerance test 1', blurred_1, passed_1)) - tests.add(CTest('checl optical tolerance test 2', blurred_2, passed_2)) - tests.add(CTest('checl optical tolerance test 3', blurred_3, passed_3)) - tests.add(CTest('checl optical tolerance test 4', blurred_4, passed_4)) - - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/beam.geo b/katoptron/tests/beam.geo deleted file mode 100644 index 71c4c0a7..00000000 --- a/katoptron/tests/beam.geo +++ /dev/null @@ -1,114 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - - -//L = 50.; -//W = 1.; -//H = 5.; -//d = 1.; - -//L = 50.; -//W = 5.; -//H = 5.; -H_rigid = 1.; -//d = 1.; - -hW = W/2; -hH = H/2; - -//n_L = 60; -//n_hW = 3; -//n_hH = 3; - -n_L_rigid = 1; -n_W_rigid = 1; -n_H_rigid = 1; - - -lc = 1; - -delta_H = hH+d; - -Point(101) = { 0, -hW, d, lc}; -Point(102) = { 0, 0, d, lc}; -Point(103) = { 0, hW, d, lc}; -Point(104) = { L, hW, d, lc}; -Point(105) = { L, 0, d, lc}; -Point(106) = { L, -hW, d, lc}; - -Point(205) = { 0, -hW, 0, lc}; -Point(206) = { 0, hW, 0, lc}; -Point(207) = { L, hW, 0, lc}; -Point(208) = { L, -hW, 0, lc}; - -Line(101) = {101, 102}; -Line(102) = {102, 103}; -Line(103) = {103, 104}; -Line(104) = {104, 105}; -Line(105) = {105, 106}; -Line(106) = {106, 101}; -Line(107) = {105, 102}; - -Line(205) = {205, 206}; -Line(206) = {206, 207}; -Line(207) = {207, 208}; -Line(208) = {208, 205}; - -Transfinite Line {101,102,104,105} = n_hW+1 Using Progression 1; -Transfinite Line {103,106,107} = n_L+1 Using Progression 1; - -Transfinite Line {205,207} = n_W_rigid+1 Using Progression 1; -Transfinite Line {206,208} = n_L_rigid+1 Using Progression 1; - -Line Loop(101) = {101,-107,105,106}; -Plane Surface(101) = {101}; -Transfinite Surface {101}; -Recombine Surface {101}; - -Line Loop(102) = {102,103,104,107}; -Plane Surface(102) = {102}; -Transfinite Surface {102}; -Recombine Surface {102}; - -Line Loop(202) = {-208,-207,-206,-205}; -Plane Surface(202) = {202}; -Transfinite Surface {202}; -Recombine Surface {202}; - -Extrude {0, 0, hH} -{ - Surface{101,102}; Layers{n_hH}; Recombine; -} - -Extrude {0, 0, hH} -{ - Surface{230,252}; Layers{n_hH}; Recombine; -} - -Extrude {0, 0, -H_rigid} -{ - Surface{202}; Layers{n_H_rigid}; Recombine; -} - - - -Physical Volume("Rigid body") = {5}; -Physical Surface("Rigid surface") = {202}; -Physical Surface("Rigid clamped surface") = {309}; -Physical Line("Rigid surface boundary") = {205, 206, 207, 208}; - -Physical Volume("Beam") = {1,2,3,4}; -Physical Surface("Clamped end") = {217,239,261,283,317}; -Physical Surface("Loaded surface") = {274,296}; -Physical Surface("Beam contact zone") = {101,102}; -Physical Surface("Free end") = {269,247,225,291}; -Physical Line("Beam contact boundary") = {104,105,106,101,102,103}; -Physical Line("Beam contact Dirichlet") = {101,102}; - -Physical Line("Center of cross section") = {211}; - -Physical Line("Center of contact surface") = {107}; - -Mesh.Partitioner = 2; -Mesh.MetisAlgorithm = 2; -Mesh.MshFilePartitioned = 0; diff --git a/katoptron/tests/beam.py b/katoptron/tests/beam.py deleted file mode 100644 index e2086c7a..00000000 --- a/katoptron/tests/beam.py +++ /dev/null @@ -1,222 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -#import matplotlib2tikz -# import katoptron.viewer as katv # Error occurs after that - - -def analytical(E, nu, L, W, H, d, p, x): - - EI = ((E * W * H**3) / 12.) - q = p * W - q_1 = 24*EI*d/L**4 - q_2 = 72*EI*d/L**4 - a = (72*EI*d/q)**(0.25) - - print(a) - - print(E) - print(nu) - print(L) - print(W) - print(H) - print(d) - print(p) - - if q < q_1: - case_id = 1 - sol = -((q / (24.*EI)))*(x**4-4.*L*x**3+4.*L**2*x**2) - if q >= q_1: - case_id = 2 - sol = -((q / (24.*EI)))*(x**4-2.*L*x**3+L**2*x**2) + \ - 2.*d*x**3/(L**3)-3.*d*x**2/(L**2) - if q >= q_2: - case_id = 3 - sol = -((q / (24.*EI))) * \ - (x**4-((8. / 3.))*a*x**3+2.*a**2*x**2) - for i in range(0, len(x)): - if x[i] >= a: - sol[i] = -d - - print("q") - print(q) - print(q_1) - print(q_2) - - return case_id, sol - - -def analytical_ensemble(E, nu, L, W, H, d, p, x, ensemble_size): - - import numpy as np - - case_id = np.empty([ensemble_size, 1]) - sol = np.empty([len(x), ensemble_size]) - - for i in range(0, ensemble_size): - case_id[i], sol[:, i] = analytical(E[i], nu[i], L, W, H, d, p[i], x) - - return case_id, sol - - -def main(): - comm, rank, size = u.import_MPI() - - from fwk.wutils import parseargs - args = parseargs() - - from PyTrilinos import Teuchos - import numpy as np - #import matplotlib.pyplot as plt - - DOFperNode = 3 - - display = True - - # Mesh - - geo_name = 'beam.geo' - mesh_name = 'beam.msh' - partitioned_mesh_name = 'beam_k.msh' - - par = {} - par['L'] = 50. - par['W'] = 5. - par['H'] = 5. - par['d'] = 1. - par['n_L'] = 20 - par['n_hW'] = 2 - par['n_hH'] = 2 - - ensemble_size = 8 - - import shlex - import subprocess - import os - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - pars = {'L': par['L'], 'W': par['W'], 'H': par['H'], 'd': par['d'], - 'n_L': par['n_L'], 'n_hW': par['n_hW'], 'n_hH': par['n_hH']} - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size, pars) - - for n1 in msh.nodes: - n1.row = n1.no-1 - - # Problem - - #msh = gmsh.MeshLoader(mesh_name,work_dir).execute() - - pbl = m.Problem(msh, comm) - - E = 21000 * np.ones(ensemble_size) - nu = 0.29 * np.ones(ensemble_size) - k = 0 - d = 0 - - # for i in range(0,ensemble_size): - # E[i] = 21000+i*5000 - - m.Medium(pbl, "Beam", "Mat 1", E, nu, k, d) - m.Medium(pbl, "Rigid body", "Mat 1", E, nu, k, d) - - dx = np.zeros(ensemble_size) - dy = np.zeros(ensemble_size) - dy2 = np.linspace(0, -2., ensemble_size) - dz = 0*np.linspace(0, -2., ensemble_size) - dz2 = np.zeros(ensemble_size) - dT = np.zeros(ensemble_size) - m.Dirichlet(pbl, "Rigid clamped surface", - "Clamped 1", 1, dx, 1, dy, 1, dz, 0, dT) - m.Dirichlet(pbl, "Clamped end", "Clamped 1", 1, dx, 1, dy, 1, dz2, 0, dT) - m.Dirichlet(pbl, "Free end", "Clamped 1", 1, 0., - 0, 0., 0, 0., 0, 0., ensemble_size) - - #p = 0.82* np.ones(ensemble_size) - - #p = np.linspace(0.1, 0.835, num=ensemble_size) - # np.linspace(1.2, 0., num=ensemble_size) # 3.6 * np.ones(ensemble_size) #np.linspace(1.5, 2., num=ensemble_size) - p = 0.9 * np.ones(ensemble_size) - for i in range(0, ensemble_size): - p[i] = 1.7+(7-i)*0.025 - - p[0] = 2.5 - - zero = np.zeros(ensemble_size) - - m.Neumann(pbl, "Loaded surface", "Load 1", 0, zero, - 0, zero, 1, -p, 0, zero, ensemble_size) - - norm1 = tbox.Vector3d(0, 0, -1) - norm2 = tbox.Vector3d(0, 0, 1) - dg = 0*np.linspace(0., 1., num=ensemble_size) - - dg[0] = 0. - - a = 49.5 - initiallyClosedNodesList = np.array([], dtype=np.float) - #tag_name = "Center of cross section" - for el in msh.ntags["Beam contact zone"].elems: - for n1 in el.nodes: - node_id = n1.no-1 - if msh.nodes[node_id].pos[0] >= a: - initiallyClosedNodesList = np.append( - initiallyClosedNodesList, node_id) - - cont1 = m.Contact(pbl, "Beam contact zone", "contact", norm1, dg) - #cont1.setSlaveBoundary(work_dir+"/"+partitioned_mesh_name, "Beam contact boundary") - #cont1.setMasterBoundary(work_dir+"/"+partitioned_mesh_name, "Rigid surface boundary") - cont1.setInitialyOpen() - cont1.setInitiallyClosedNodes(initiallyClosedNodesList) - cont1.setDualShapeFunctions() - cont1.setSlaveDirichlet( - work_dir+"/"+partitioned_mesh_name, "Beam contact Dirichlet") - cont1.setSignoriniContact() - cont1.setMaster(pbl, "Rigid surface", norm2) - - # Solver - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 100000 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList["MueLu xml file name"] = file_dir + '/multigrid_2_lvls_3_1.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 4 - solverList['Write txt files'] = True - slv = m.IterativeSolver(pbl, solverList, - DOFperNode, ensemble_size) - - nThreads = u.Initialize_Kokkos() - - slv.start() - - active_set_iteration = slv.active_set_iteration - - u.Finalize_Kokkos() - - if rank == 0: - import fwk.testing as tst - tests = tst.CTests() - tests.add(tst.CTest('Number of active set iterations', - active_set_iteration, 3)) - tests.run() - - -if __name__ == "__main__": - main() diff --git a/katoptron/tests/direct_solver.xml b/katoptron/tests/direct_solver.xml deleted file mode 100644 index 7375e732..00000000 --- a/katoptron/tests/direct_solver.xml +++ /dev/null @@ -1,116 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 4 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 4 }"/> - </ParameterList> - - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - </ParameterList> - - - <!-- BLOCK SMOOTHERS --> - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="1"/> - <!--<Parameter name="relaxation: damping factor" type="double" value="0.9"/>--> - </ParameterList> - </ParameterList> - - - <!-- block smoother for block A_{00} --> - - <ParameterList name="mySmooFact2"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <Parameter name="overlap" type="int" value="0"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="1"/> - <!--<Parameter name="relaxation: damping factor" type="double" value="0.9"/>--> - </ParameterList> - </ParameterList> - - <!-- Use BGS --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="BlockedGaussSeidelSmoother"/> - <Parameter name="Sweeps" type="int" value="1"/> - <!--<Parameter name="Damping factor" type="double" value="1.0"/> --> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Smoother" type="string" value="mySmooFact2"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="verbosity" type="string" value="Extreme"/> - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockDirectSolver"/> - <!--<Parameter name="CoarseSolver" type="string" value="myBlockSmoother"/>--> - <Parameter name="A" type="string" value="NoFactory"/> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/tests/mirror_data.npz b/katoptron/tests/mirror_data.npz deleted file mode 100644 index 73e77d11b405902a973af9e39464026fb9c34c9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 327176 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 z%0A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 diff --git a/katoptron/tests/multigrid_2_lvls_3_1.xml b/katoptron/tests/multigrid_2_lvls_3_1.xml deleted file mode 100644 index 2d82c0a1..00000000 --- a/katoptron/tests/multigrid_2_lvls_3_1.xml +++ /dev/null @@ -1,257 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - - <!-- Factory collection --> - <ParameterList name="Factories"> - - <!-- Note that ParameterLists must be defined prior to being used --> - - <!-- sub block factories --> - - - <!-- BLOCK 1 (for submatrix A_{00}) Navier Stokes 4 DOFs per node --> - <ParameterList name="mySubBlockAFactory1"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="0"/> - <Parameter name="block col" type="int" value="0"/> - <Parameter name="Range map: Striding info" type="string" value="{ 3 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 3 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 4 DOFs per node on the coarse levels --> - <ParameterList name="myCoarseMap1"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myAggFact1"> - <Parameter name="factory" type="string" value="UncoupledAggregationFactory"/> - <Parameter name="aggregation: min agg size" type="int" value="5"/> - <Parameter name="aggregation: max selected neighbors" type="int" value="1"/> - </ParameterList> - - <ParameterList name="myTentativePFact1"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <ParameterList name="myRFact1"> - <Parameter name="factory" type="string" value="TransPFactory"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- We have to use Nullspace1 here. If "Nullspace1" is not set the - Factory creates the default null space containing of constant - vectors --> - <ParameterList name="myNspFact1"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace1"/> - <Parameter name="Nullspace1" type="string" value="myTentativePFact1"/> - </ParameterList> - - <!-- BLOCK 2 (for submatrix A_{22}) MAXWELL PART--> - <ParameterList name="mySubBlockAFactory2"> - <Parameter name="factory" type="string" value="SubBlockAFactory"/> - <Parameter name="block row" type="int" value="1"/> - <Parameter name="block col" type="int" value="1"/> - <Parameter name="Range map: Striding info" type="string" value="{ 1 }"/> - <Parameter name="Domain map: Striding info" type="string" value="{ 1 }"/> - </ParameterList> - - <!-- tell the tenative prolongator that we have 1 DOF per node on the coarse levels --> - <!-- We use the factory "CoarseMapFactory" which always creates a standard coarse - level map starting with GIDs at 0. This is ok as we use Thyra like numbering - for the block operators. To obtain unique GIDs one would use the - BlockedCoarseMapFactory (see below) --> - <ParameterList name="myCoarseMap2"> - <Parameter name="factory" type="string" value="CoarseMapFactory"/> - <Parameter name="Striding info" type="string" value="{ 3 }"/> - <Parameter name="Strided block id" type="int" value="-1"/> - </ParameterList> - - <ParameterList name="myInterfaceMappingFact"> - <Parameter name="factory" type="string" value="InterfaceMappingTransferFactory"/> - </ParameterList> - - <ParameterList name="myInterfaceAggs2"> - <Parameter name="factory" type="string" value="InterfaceAggregationFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> <!-- use aggregates from velocity block! --> - <Parameter name="number of DOFs per dual node" type="int" value="1"/> - <Parameter name="DualNodeID2PrimalNodeID" type="string" value="myInterfaceMappingFact" /> - </ParameterList> - - <ParameterList name="myInterfaceMappingFactDeps" > - <Parameter name="dependency for" type="string" value="myInterfaceMappingFact" /> - <Parameter name="CoarseDualNodeID2PrimalNodeID" type="string" value="myInterfaceAggs2" /> - </ParameterList> - - <ParameterList name="myTentativePFact2"> - <Parameter name="factory" type="string" value="TentativePFactory"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- We have to use Nullspace2 here. If "Nullspace2" is not set the - Factory creates the default null space containing of constant - vectors (here only one constant vector) --> - <ParameterList name="myNspFact2"> - <Parameter name="factory" type="string" value="NullspaceFactory"/> - <Parameter name="Fine level nullspace" type="string" value="Nullspace2"/> - <Parameter name="Nullspace2" type="string" value="myTentativePFact2"/> - </ParameterList> - - <!-- FACTORY MANAGERS --> - - <!-- Multigrid setup for velocity block (A_{00}) --> - <ParameterList name="myFirstGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="P" type="string" value="myTentativePFact1"/> - <Parameter name="R" type="string" value="myRFact1"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="Nullspace" type="string" value="myNspFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList> - - <!-- Multigrid setup for pressure block (A_{11}) --> - <ParameterList name="mySecondGroup"> - <Parameter name="group" type="string" value="FactoryManager"/> - <Parameter name="A" type="string" value="mySubBlockAFactory2"/> - <Parameter name="P" type="string" value="myTentativePFact2"/> - <Parameter name="Aggregates" type="string" value="myInterfaceAggs2"/> - <Parameter name="Nullspace" type="string" value="myNspFact2"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap2"/> - </ParameterList> - - <!-- BLOCK TRANSFER operators --> - - <!-- define block prolongation operator using above blocks --> - <ParameterList name="myBlockedPFact"> - <Parameter name="factory" type="string" value="BlockedPFactory"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="group" type="string" value="myFirstGroup"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="group" type="string" value="mySecondGroup"/> - </ParameterList> - </ParameterList> - - <!-- define block restriction operator using above blocks --> - <!-- The block restriction operator is usually always of type - GenericRFactory since we want to be able to combine, e.g., - SmoothedAggregation for block A_{00} with e.g. tentative - prolongation for block A_{11} (or any other kind of transfer - strategy for the subblocks --> - <ParameterList name="myBlockedRFact"> - <Parameter name="factory" type="string" value="GenericRFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - </ParameterList> - - <!--<ParameterList name="myTransferCoordinatesFact"> - <Parameter name="factory" type="string" value="CoordinatesTransferFactory"/> - <Parameter name="Aggregates" type="string" value="myAggFact1"/> - <Parameter name="CoarseMap" type="string" value="myCoarseMap1"/> - </ParameterList>--> - - <ParameterList name="myBlockedRAPFact"> - <Parameter name="factory" type="string" value="BlockedRAPFactory"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <ParameterList name="TransferFactories"> - <!--<Parameter name="For Coordinates" type="string" value="myTransferCoordinatesFact"/>--> - <Parameter name="DoTransferSpecialMappingForAggregates" type="string" value="myInterfaceMappingFact"/> - </ParameterList> - </ParameterList> - - <!-- REBALANCING --> - - - <!-- BLOCK SMOOTHERS --> - - - <ParameterList name="mySmooFact1"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="1"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Build Schur Complement factory (for being used in SIMPLE type block smoother)--> - <ParameterList name="mySchurCompFact"> - <Parameter name="factory" type="string" value="SchurComplementFactory"/> - <Parameter name="omega" type="double" value="1.0"/> - <Parameter name="lumping" type="bool" value="true"/> - </ParameterList> - - <!-- block smoother for block A_{11} respective the Schur complement operator --> - <ParameterList name="mySchurSmooFact"> - <Parameter name="factory" type="string" value="TrilinosSmoother"/> - <Parameter name="type" type="string" value="RELAXATION"/> - <ParameterList name="ParameterList"> - <Parameter name="relaxation: type" type="string" value="Symmetric Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="1"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - </ParameterList> - - <!-- Use SIMPLE: --> - <!-- User has to define two blocks with each containing a smoother for - the corresponding sub-block matrix (see above) --> - <ParameterList name="myBlockSmoother"> - <Parameter name="factory" type="string" value="SimpleSmoother"/> - <Parameter name="Sweeps" type="int" value="2"/> - <Parameter name="Damping factor" type="double" value="0.9"/> - <Parameter name="UseSIMPLEC" type="bool" value="false"/> - <!-- factory manager for block 1 --> - <ParameterList name="block1"> - <Parameter name="A" type="string" value="mySubBlockAFactory1"/> - <Parameter name="Smoother" type="string" value="mySmooFact1"/> - </ParameterList> - <!-- factory manager for block 2 --> - <ParameterList name="block2"> - <Parameter name="A" type="string" value="mySchurCompFact"/> - <Parameter name="Smoother" type="string" value="mySchurSmooFact"/> - </ParameterList> - </ParameterList> - - <ParameterList name="myBlockDirectSolver"> - <Parameter name="factory" type="string" value="BlockedDirectSolver"/> - </ParameterList> - - </ParameterList> - <!-- end Factories --> - - <!-- Definition of the multigrid preconditioner --> - <ParameterList name="Hierarchy"> - - <Parameter name="max levels" type="int" value="2"/> - <Parameter name="coarse: max size" type="int" value="2500"/> - <Parameter name="verbosity" type="string" value="High"/> - <Parameter name="aggregation: export visualization data" type="bool" value="true"/> - - <ParameterList name="AllLevel"> - <Parameter name="startLevel" type="int" value="0"/> - <Parameter name="Smoother" type="string" value="myBlockSmoother"/> - <Parameter name="CoarseSolver" type="string" value="myBlockDirectSolver"/> - <Parameter name="P" type="string" value="myBlockedPFact"/> - <Parameter name="R" type="string" value="myBlockedRFact"/> - <Parameter name="A" type="string" value="myBlockedRAPFact"/> - <!--<Parameter name="Coordinates" type="string" value="myRebBlockedPFact"/>--> - </ParameterList> - - </ParameterList> - -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/tests/plate.py b/katoptron/tests/plate.py deleted file mode 100644 index 8e5c971c..00000000 --- a/katoptron/tests/plate.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - - - -from katoptron.CMAME import model - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np - -from fwk.wutils import parseargs - -from PyTrilinos import Teuchos - -import katoptron.utilities as u - -from katoptron.readers import read_Belos -from fwk.testing import * - - -def main(): - """ - This loads the mesh and define the case ids and ensemble sizes - """ - comm, rank, size = m.utilities.import_MPI() - - if size == 1: - args = parseargs() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - # Units in the meshes are in mm - msh = u.fuse_meshes('plate_1.geo', 'plate_1_tmp', 'plate_2.geo', - 'plate_2_tmp', 'plate_fused', - file_dir + '/../CMAME/mesh', work_dir, comm, rank, - size) - - np.random.seed(42) - N = 1 - num_random_variables = 20 - randomVariable = np.zeros((N, num_random_variables)) - - p = model.get_parameters(0, 0) - p['Write txt files'] = True - p['MueLu xml template file name'] = '/../preconditioners/SIMPLE_gs_direct_lvl.xml.in' - - ensemble_size = 1 - - pm = model.plate_model(ensemble_size, randomVariable, msh, comm, - file_dir, work_dir, p) - - nThreads = u.Initialize_Kokkos() - pm.run() - u.Finalize_Kokkos() - - iter_indices, residuals = read_Belos(work_dir + '/belos_out.txt', 1) - - tests = CTests() - nIterations = iter_indices[-1] - tests.add(CTest('Has converged', nIterations, 97, 1e-2)) - tests.run() - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/katoptron/thesis/test_1/1_cube.geo b/katoptron/thesis/test_1/1_cube.geo deleted file mode 100644 index 99d07474..00000000 --- a/katoptron/thesis/test_1/1_cube.geo +++ /dev/null @@ -1,39 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - -C1 = 10; -nC1 = 4; - -lc = 1; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { C1, 0, 0, lc}; -Point(3) = { C1, 0, C1, lc}; -Point(4) = { 0, 0, C1, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Transfinite Line {1,2,3,4} = nC1+1 Using Progression 1; - -Line Loop(11) = {1,2,3,4}; -Plane Surface(12) = {11}; -Transfinite Surface {12}; -Recombine Surface {12}; - -Extrude {0, C1, 0} -{ - Surface{12}; Layers{nC1}; Recombine; -} - -// physical entities - -Physical Volume("Body 1") = {1}; - -Physical Surface("Surf 1 1") = {-21}; -Physical Surface("Surf 1 2") = {-29}; - -Physical Point("Measure point 1") = {4}; -Physical Point("Measure point 2") = {1}; diff --git a/katoptron/thesis/test_1/1_cube.py b/katoptron/thesis/test_1/1_cube.py deleted file mode 100644 index 36106032..00000000 --- a/katoptron/thesis/test_1/1_cube.py +++ /dev/null @@ -1,198 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -from PyTrilinos import Teuchos -import shlex -import subprocess -import os -import numpy as np -import tarfile -import glob -from fwk.wutils import parseargs - - -def tar_results(directory, filename, rank): - os.chdir(directory) - if rank == 0: - tf = tarfile.open(filename + ".tar.gz", mode="w:gz") - for file in glob.glob('*'): - if file.endswith(".tar.gz"): - print(file + ' is not included') - else: - tf.add(file) - tf.close() - - -def model(msh, - E, - p, - ensemble_size, - case_name, - zero_initial_guess=True, - prec=False): - comm, rank, size = m.utilities.import_MPI() - - pbl = m.Problem(msh, comm) - - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - - zero = np.zeros(ensemble_size) - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., 1, 0., 1, 0., 1, 0., - ensemble_size) - m.Neumann(pbl, "Surf 1 2", "heat fluxes", 0, zero, 0, zero, 1, p, 0, zero, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 100 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - if prec: - mueluParams = Teuchos.ParameterList() - mueluParams['number of equations'] = 3 - mueluParams['max levels'] = 1 - mueluParams['coarse: type'] = "RELAXATION" - - mueluParamsSub2 = Teuchos.ParameterList() - mueluParamsSub2['relaxation: type'] = "Jacobi" - mueluParamsSub2['relaxation: sweeps'] = 1 - mueluParamsSub2['relaxation: damping factor'] = 1. - - mueluParams['verbosity'] = "low" - - mueluParams['coarse: params'] = mueluParamsSub2 - - solverList['mueluParams'] = mueluParams - solverList['Use preconditioner'] = True - else: - solverList['Use preconditioner'] = False - - if not zero_initial_guess: - file_dir = os.path.dirname(__file__) - solverList['Initial guess'] = file_dir + '/initial_guess.txt' - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['Write txt files'] = True - solverList['Write matrix and vectors'] = True - - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - if not os.path.exists(case_name): - os.makedirs(case_name) - os.chdir(case_name) - - if rank == 0: - np.savetxt('E.txt', E) - np.savetxt('p.txt', p) - - slv.start() - - os.chdir('..') - - -def main(): - comm, rank, size = u.import_MPI() - - useER = m.UseEnsembleReduction() - - geo_name = '1_cube.geo' - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size) - - E_mean = 1. - E_min = 0.75 - E_max = 1.25 - - E_min_2 = 0.95 - E_max_2 = 1.05 - - E_min_3 = 1.2 - E_max_3 = 1.3 - - p_mean = 0.1 - p_min = 0.075 - p_max = 0.125 - - ensemble_size = 1 - E = E_mean * np.ones(ensemble_size) - p = p_mean * np.ones(ensemble_size) - directory_case_id = 'mean' - - nThreads = u.Initialize_Kokkos() - model(msh, E, p, ensemble_size, directory_case_id) - - ensemble_sizes = [8, 16, 32] - - for ensemble_size in ensemble_sizes: - E = np.linspace(E_min, E_max, ensemble_size) - p = p_mean * np.ones(ensemble_size) - directory_case_id = 'test_1_s_' + str(ensemble_size) - - model(msh, E, p, ensemble_size, directory_case_id) - - E = np.linspace(E_min_2, E_max_2, ensemble_size) - p = p_mean * np.ones(ensemble_size) - directory_case_id = 'test_6_s_' + str(ensemble_size) - - model(msh, E, p, ensemble_size, directory_case_id) - - E = np.linspace(E_min_3, E_max_3, ensemble_size) - p = p_mean * np.ones(ensemble_size) - directory_case_id = 'test_7_s_' + str(ensemble_size) - - model(msh, E, p, ensemble_size, directory_case_id) - - E = E_mean * np.ones(ensemble_size) - p = np.linspace(p_min, p_max, ensemble_size) - directory_case_id = 'test_2_s_' + str(ensemble_size) - - model(msh, E, p, ensemble_size, directory_case_id) - - E = np.linspace(E_min, E_max, ensemble_size) - p = np.linspace(p_min, p_max, ensemble_size) - directory_case_id = 'test_3_s_' + str(ensemble_size) - - model(msh, E, p, ensemble_size, directory_case_id) - - E = np.linspace(E_min, E_max, ensemble_size) - p = np.linspace(p_min, p_max, ensemble_size) - directory_case_id = 'test_4_s_' + str(ensemble_size) - - model(msh, E, p, ensemble_size, directory_case_id, True, True) - - E = np.linspace(E_min, E_max, ensemble_size) - p = np.linspace(p_min, p_max, ensemble_size) - directory_case_id = 'test_5_s_' + str(ensemble_size) - - model(msh, E, p, ensemble_size, directory_case_id, False, False) - - u.Finalize_Kokkos() - - if useER: - tar_results(work_dir, 'all_results_ER', rank) - else: - tar_results(work_dir, 'all_results_NER', rank) - - -if __name__ == "__main__": - main() diff --git a/katoptron/thesis/test_1/blake.slurm.sh b/katoptron/thesis/test_1/blake.slurm.sh deleted file mode 100644 index 43508ca5..00000000 --- a/katoptron/thesis/test_1/blake.slurm.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=test_1 -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/test_1.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_HW_SUBSET=24c,1t -export KMP_AFFINITY=compact - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} - -python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_1/1_cube.py diff --git a/katoptron/thesis/test_1/initial_guess.txt b/katoptron/thesis/test_1/initial_guess.txt deleted file mode 100644 index a3d5bf4d..00000000 --- a/katoptron/thesis/test_1/initial_guess.txt +++ /dev/null @@ -1,375 +0,0 @@ -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -1.03389366873617355e-01 -1.03389366873706354e-01 -9.88909850986351091e-01 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 -0.00000000000000000e+00 --1.03389366873873748e-01 -1.03389366873748376e-01 -9.88909850986497641e-01 --1.03389366873874095e-01 --1.03389366873748056e-01 -9.88909850986497196e-01 -1.03389366873616564e-01 --1.03389366873706368e-01 -9.88909850986350536e-01 --5.27296546408627456e-02 -1.03300075007310380e-01 -9.86005241933825549e-01 --1.72648546726014513e-13 -1.03165915332760733e-01 -9.83998313600647156e-01 -5.27296546407599667e-02 -1.03300075007326381e-01 -9.86005241933630372e-01 --5.27296546408623015e-02 --1.03300075007309727e-01 -9.86005241933826104e-01 --1.73766147860502091e-13 --1.03165915332760275e-01 -9.83998313600647267e-01 -5.27296546407599598e-02 --1.03300075007326450e-01 -9.86005241933629373e-01 --1.03300075007559222e-01 -5.27296546408203490e-02 -9.86005241933823440e-01 --1.03165915333046532e-01 -3.03730987743003057e-16 -9.83998313600758512e-01 --1.03300075007560152e-01 --5.27296546408204739e-02 -9.86005241933823551e-01 -1.03300075007261086e-01 -5.27296546408151864e-02 -9.86005241933572529e-01 -1.03165915332737959e-01 --1.50785363550943402e-16 -9.83998313600441432e-01 -1.03300075007260045e-01 --5.27296546408148326e-02 -9.86005241933572085e-01 --5.26878113525478114e-02 -5.26878113526379893e-02 -9.83361152577813646e-01 --5.26718377856561157e-02 -4.59250629122190593e-16 -9.81523476744442736e-01 --5.26878113525460490e-02 --5.26878113526386971e-02 -9.83361152577813757e-01 --5.79473484698294784e-13 -5.26718377860720885e-02 -9.81523476743921708e-01 --9.13420568557926768e-13 -1.73058135287993529e-16 -9.79652571577124376e-01 --5.81996096482450406e-13 --5.26718377860717554e-02 -9.81523476743922374e-01 -5.26878113528938263e-02 -5.26878113529958003e-02 -9.83361152577015840e-01 -5.26718377863194739e-02 --7.11399507950741881e-17 -9.81523476743163203e-01 -5.26878113528952974e-02 --5.26878113529944958e-02 -9.83361152577014952e-01 --8.25498591021375377e-02 -8.25498591021505412e-02 -2.71696757483461837e-01 --9.70753326394316052e-02 -9.70753326393827692e-02 -5.02410726903524729e-01 --1.01586615502965605e-01 -1.01586615502849836e-01 -7.41394325273555310e-01 -1.01586615502623739e-01 -1.01586615502625460e-01 -7.41394325273904697e-01 -9.70753326393432869e-02 -9.70753326392596871e-02 -5.02410726904001459e-01 -8.25498591023276773e-02 -8.25498591022339884e-02 -2.71696757483956830e-01 --8.25498591021385231e-02 --8.25498591021505551e-02 -2.71696757483462170e-01 --9.70753326394329930e-02 --9.70753326393827276e-02 -5.02410726903525173e-01 --1.01586615502966812e-01 --1.01586615502849628e-01 -7.41394325273555421e-01 -1.01586615502622532e-01 --1.01586615502625405e-01 -7.41394325273903809e-01 -9.70753326393420934e-02 --9.70753326392593680e-02 -5.02410726904001237e-01 -8.25498591023268447e-02 --8.25498591022338357e-02 -2.71696757483956663e-01 -3.30748424499299962e-02 -8.29264144897700478e-02 -2.48089635635204142e-01 -4.97277796449807838e-02 -9.85915368840958040e-02 -4.91357562219044863e-01 -5.15867656326637405e-02 -1.01848850896934545e-01 -7.36712754118903246e-01 -3.39915264163419894e-13 -8.41148355803972708e-02 -2.46660235067398870e-01 -3.44793504862767467e-13 -9.92705012130368630e-02 -4.85740960262001420e-01 --9.26442092970955842e-14 -1.02210065241999007e-01 -7.33706284948368648e-01 --3.30748424502770866e-02 -8.29264144900013628e-02 -2.48089635634937633e-01 --4.97277796452340604e-02 -9.85915368846882190e-02 -4.91357562219005006e-01 --5.15867656324931825e-02 -1.01848850897280407e-01 -7.36712754118272084e-01 --8.29264144898249206e-02 -3.30748424500673238e-02 -2.48089635634770489e-01 --8.41148355803735398e-02 -1.12038455825991370e-15 -2.46660235067105327e-01 --8.29264144898272382e-02 --3.30748424500678234e-02 -2.48089635634771016e-01 --9.85915368848912788e-02 -4.97277796452564799e-02 -4.91357562219088828e-01 --9.92705012138074966e-02 -1.77847510590181174e-15 -4.85740960262223742e-01 --9.85915368848947760e-02 --4.97277796452573403e-02 -4.91357562219089217e-01 --1.01848850897806736e-01 -5.15867656327469587e-02 -7.36712754118169610e-01 --1.02210065242970882e-01 -1.60844849378749812e-15 -7.33706284947798659e-01 --1.01848850897809526e-01 --5.15867656327476248e-02 -7.36712754118169388e-01 -1.01848850897163098e-01 -5.15867656327591156e-02 -7.36712754118855950e-01 -1.02210065242353931e-01 --1.26226634544528276e-15 -7.33706284948549947e-01 -1.01848850897160420e-01 --5.15867656327581858e-02 -7.36712754118856061e-01 -9.85915368847834067e-02 -4.97277796453790832e-02 -4.91357562219043253e-01 -9.92705012138538484e-02 --1.48995477504196741e-15 -4.85740960262005916e-01 -9.85915368847802009e-02 --4.97277796453780771e-02 -4.91357562219042754e-01 -8.29264144904164197e-02 -3.30748424502912627e-02 -2.48089635635469125e-01 -8.41148355811928566e-02 --8.52956823945958511e-16 -2.46660235067932360e-01 -8.29264144904144351e-02 --3.30748424502907284e-02 -2.48089635635468736e-01 -3.30748424499322097e-02 --8.29264144897712829e-02 -2.48089635635204614e-01 -4.97277796449838785e-02 --9.85915368840976081e-02 -4.91357562219044808e-01 -5.15867656326660096e-02 --1.01848850896935739e-01 -7.36712754118903246e-01 -3.36557671758980498e-13 --8.41148355803970488e-02 -2.46660235067398648e-01 -3.39868792045555024e-13 --9.92705012130363079e-02 -4.85740960262001420e-01 --9.64588056534605612e-14 --1.02210065241998813e-01 -7.33706284948368426e-01 --3.30748424502747482e-02 --8.29264144899998085e-02 -2.48089635634936967e-01 --4.97277796452307505e-02 --9.85915368846858459e-02 -4.91357562219005006e-01 --5.15867656324907956e-02 --1.01848850897278298e-01 -7.36712754118272195e-01 -3.30537858775551557e-02 -3.30537858791016825e-02 -2.24168574765167633e-01 -3.33577827719228476e-02 --2.71054088782021333e-16 -2.22720568574055949e-01 -3.30537858775624624e-02 --3.30537858790991221e-02 -2.24168574765168827e-01 -4.96925794685787528e-02 -4.96925794703856893e-02 -4.80358805864844085e-01 -5.01102262788138339e-02 --1.06469913134349292e-15 -4.74827900883885989e-01 -4.96925794685891473e-02 --4.96925794703812901e-02 -4.80358805864843086e-01 -5.16178568703299506e-02 -5.16178568710437061e-02 -7.32425308234624817e-01 -5.17653261816935217e-02 --1.30296575160951638e-15 -7.29481147248424056e-01 -5.16178568703381455e-02 --5.16178568710397509e-02 -7.32425308234624151e-01 -1.01269713738389127e-12 -3.33577827731780935e-02 -2.22720568573127664e-01 -7.44830245625321753e-13 --3.98111993231309839e-17 -2.21326420342750990e-01 -1.00285227461946099e-12 --3.33577827731781559e-02 -2.22720568573127276e-01 -8.90476060506571976e-13 -5.01102262798669984e-02 -4.74827900884014553e-01 -1.47109838361844396e-13 --3.26513381238924380e-16 -4.69212258129147353e-01 -8.76708436884517458e-13 --5.01102262798666584e-02 -4.74827900884014553e-01 --8.94808599265584483e-13 -5.17653261812182283e-02 -7.29481147247702411e-01 --2.06767959228923246e-12 -1.40470294138712692e-17 -7.26509893878956814e-01 --9.04715419262577115e-13 --5.17653261812177634e-02 -7.29481147247702966e-01 --3.30537858791589423e-02 -3.30537858785096769e-02 -2.24168574764613937e-01 --3.33577827736174296e-02 -6.96497542114492182e-16 -2.22720568572950001e-01 --3.30537858791508030e-02 --3.30537858785124108e-02 -2.24168574764612383e-01 --4.96925794692624490e-02 -4.96925794695352099e-02 -4.80358805865632010e-01 --5.01102262790585895e-02 -1.39022753198995386e-15 -4.74827900884764453e-01 --4.96925794692506945e-02 --4.96925794695394635e-02 -4.80358805865633343e-01 --5.16178568688406211e-02 -5.16178568698689305e-02 -7.32425308232371952e-01 --5.17653261791708452e-02 -1.80179954679740054e-15 -7.29481147245931938e-01 --5.16178568688317740e-02 --5.16178568698726012e-02 -7.32425308232372840e-01 diff --git a/katoptron/thesis/test_1/post_process.py b/katoptron/thesis/test_1/post_process.py deleted file mode 100644 index 67ff5c3e..00000000 --- a/katoptron/thesis/test_1/post_process.py +++ /dev/null @@ -1,341 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -import katoptron.eigenvalues as e -import katoptron.readers as r -import katoptron.convergence as c -from PyTrilinos import Teuchos -import shlex -import subprocess -import os -import numpy as np -import tarfile -import glob -from fwk.wutils import parseargs -import matplotlib.pyplot as plt - - -def read_mm_vector(filename, ensemble_size): - with open(filename, 'r') as my_file: - text = my_file.read().splitlines(True) - if ensemble_size > 1: - for i in range(2, len(text)): - text[i] = text[i].replace("[", "") - text[i] = text[i].replace("]", "") - - X = np.genfromtxt(text[2:]) - return X - - -def read_mm_sparse_matrix(filename, ensemble_size): - with open(filename, 'r') as my_file: - text = my_file.read().splitlines(True) - if ensemble_size > 1: - for i in range(2, len(text)): - text[i] = text[i].replace("[", "") - text[i] = text[i].replace("]", "") - - sizes = [375, 375] # np.genfromtxt(text[1]) - data = np.genfromtxt(text[2:]) - A = np.zeros((int(sizes[0]), int(sizes[1]), ensemble_size)) - for i in range(0, data.shape[0]): - A[int(data[i, 0]) - 1, int(data[i, 1]) - 1, :] = data[i, 2:] - return A - - -def extract_values(filename, node_id, which_dof, dof_per_node, ensemble_size): - output = np.zeros((ensemble_size, )) - X = read_mm_vector(filename, ensemble_size) - output = X[dof_per_node * node_id + which_dof, :] - return output - - -def compare_QoI(base_dir_NER, base_dir_ER, case_ids, ensemble_sizes): - node_id = 46 - which_dof = 2 - dof_per_node = 3 - - for case_id in case_ids: - for ensemble_size in ensemble_sizes: - if case_id == 2: - param_min = 0.075 - param_max = 0.125 - elif case_id == 6: - param_min = 0.95 - param_max = 1.05 - elif case_id == 7: - param_min = 1.2 - param_max = 1.3 - else: - param_min = 0.75 - param_max = 1.25 - - param = np.linspace(param_min, param_max, ensemble_size) - solution_file_name = base_dir_NER + 'test_' + str( - case_id) + '_s_' + str(ensemble_size) + '/x_mm.txt' - output_NER = extract_values(solution_file_name, node_id, which_dof, - dof_per_node, ensemble_size) - solution_file_name = base_dir_ER + 'test_' + str( - case_id) + '_s_' + str(ensemble_size) + '/x_mm.txt' - output_ER = extract_values(solution_file_name, node_id, which_dof, - dof_per_node, ensemble_size) - plt.figure() - plt.plot(output_NER, 'o-') - plt.plot(output_ER, 'o-') - plt.savefig('QoI_case_' + str(case_id) + '_s_' + - str(ensemble_size) + '.pdf') - - f = open( - 'QoI_case_' + str(case_id) + '_s_' + str(ensemble_size) + - '.txt', 'w') - for l in range(0, ensemble_size): - print(str(param[l]) + ' ' + str( - output_NER[l]) + ' ' + str( - output_ER[l]) + ' ' + str(output_NER[l] - output_ER[l]), file=f) - f.closed - - -def read_Belos(base_dir_NER, base_dir_ER, case_ids, ensemble_sizes): - for case_id in case_ids: - for ensemble_size in ensemble_sizes: - filename_NER = base_dir_NER + 'test_' + str(case_id) + '_s_' + str( - ensemble_size) + '/belos_out.txt' - iter_indices_NER, residuals_NER = r.read_Belos( - filename_NER, ensemble_size) - - filename_ER = base_dir_ER + 'test_' + str(case_id) + '_s_' + str( - ensemble_size) + '/belos_out.txt' - iter_indices_ER, residuals_ER = r.read_Belos(filename_ER, 1) - - f = open( - 'Belos_NER_' + str(case_id) + '_s_' + str(ensemble_size) + - '.txt', 'w') - for i in range(0, len(iter_indices_NER)): - tmp = str(i) + ' ' - for l in range(0, ensemble_size): - tmp = tmp + str(residuals_NER[i, l]) + ' ' - print(tmp, file=f) - f.closed - - f = open( - 'Belos_ER_' + str(case_id) + '_s_' + str(ensemble_size) + - '.txt', 'w') - for i in range(0, len(iter_indices_ER)): - print(str(i) + ' ' + str(residuals_ER[i]), file=f) - f.closed - - plt.figure() - plt.semilogy(iter_indices_NER, residuals_NER[:, 0], 'o-') - plt.semilogy(iter_indices_ER, residuals_ER, 'o-') - plt.savefig('Belos_ER_' + str(case_id) + '_s_' + - str(ensemble_size) + '.pdf') - - -def compute_cum_delta_normal(lambdas, - omegas, - lambda_min=None, - lambda_max=None, - n=200): - - indices = np.argsort(lambdas) - lambdas = lambdas[indices] - omegas = omegas[indices] - - if lambda_min is None: - lambda_min = lambdas[0] - if lambda_max is None: - lambda_max = lambdas[-1] - - lambda_discrete = np.linspace(lambda_min, lambda_max, n) - dlambda = ((lambda_max - lambda_min) / (n - 1)) - - cum_delta = np.zeros((n, )) - deriv_delta = np.zeros((n, )) - cum_delta_omega = np.zeros((n, )) - deriv_delta_omega = np.zeros((n, )) - - n_lambdas = len(lambdas) - - first_index = 0 - second_index = 0 - for i in range(1, n): - for j in range(second_index, n_lambdas): - if lambda_discrete[i] < lambdas[j]: - second_index = j - break - cum_delta[i] = cum_delta[i - 1] + second_index - first_index - cum_delta_omega[i] = cum_delta_omega[i - 1] + np.sum( - omegas[first_index:second_index]) - deriv_delta[i] = ((second_index - first_index) / dlambda) - deriv_delta_omega[i] = (np.sum( - omegas[first_index:second_index]) / dlambda) - first_index = second_index - - percent_delta = (cum_delta / cum_delta[n - 1]) - percent_delta_omega = (cum_delta_omega / cum_delta_omega[n - 1]) - - return lambda_discrete, cum_delta, deriv_delta, cum_delta_omega, deriv_delta_omega, percent_delta, percent_delta_omega - - -def compute_deltas_omegas(base_dir, case_ids, ensemble_sizes): - for case_id in case_ids: - for ensemble_size in ensemble_sizes: - - filename_b = base_dir + 'test_' + str(case_id) + '_s_' + str( - ensemble_size) + '/b_mm_after_bc.txt' - filename_A = base_dir + 'test_' + str(case_id) + '_s_' + str( - ensemble_size) + '/A_mm_after_bc.txt' - - b = read_mm_vector(filename_b, ensemble_size) - A = read_mm_sparse_matrix(filename_A, ensemble_size) - - for l in range(0, ensemble_size): - b_l = b[:, l] - A_l = e.get_symmetrical_part(A[:, :, l]) - deltas, omegas = e.compute_deltas_omegas_normal(A_l, b_l) - indices = np.argsort(np.real(deltas)) - f = open( - 'deltas_omegas_' + str(case_id) + '_s_' + - str(ensemble_size) + '_l_' + str(l) + '.txt', 'w') - for i in range(0, len(deltas)): - print(str(np.real(deltas[indices[i]])) + ' ' + str( - np.imag(deltas[indices[i]])) + ' ' + str( - omegas[indices[i]]) + ' ' + str(i), file=f) - f.closed - - lambda_discrete, cum_delta, deriv_delta, cum_delta_omega, deriv_delta_omega, percent_delta, percent_delta_omega = compute_cum_delta_normal( - np.real(deltas), - omegas, - lambda_min=0., - lambda_max=12., - n=300) - - plt.figure() - plt.plot(lambda_discrete, cum_delta) - plt.savefig('cum_delta_' + str(case_id) + '_s_' + - str(ensemble_size) + '_l_' + str(l) + '.pdf') - plt.close() - plt.figure() - plt.plot(lambda_discrete, deriv_delta) - plt.savefig('deriv_delta_' + str(case_id) + '_s_' + - str(ensemble_size) + '_l_' + str(l) + '.pdf') - plt.close() - plt.figure() - plt.plot(lambda_discrete, cum_delta_omega) - plt.savefig('cum_delta_omega_' + str(case_id) + '_s_' + - str(ensemble_size) + '_l_' + str(l) + '.pdf') - plt.close() - plt.figure() - plt.plot(lambda_discrete, deriv_delta_omega) - plt.savefig('deriv_delta_omega_' + str(case_id) + '_s_' + - str(ensemble_size) + '_l_' + str(l) + '.pdf') - plt.close() - - if l == 0: - deltas_total = np.real(deltas) - omegas_total = omegas - else: - deltas_total = np.append(deltas_total, np.real(deltas)) - omegas_total = np.append(omegas_total, omegas) - - lambda_discrete, cum_delta, deriv_delta, cum_delta_omega, deriv_delta_omega, percent_delta, percent_delta_omega = compute_cum_delta_normal( - deltas_total, - omegas_total, - lambda_min=0., - lambda_max=12., - n=300) - - plt.figure() - plt.plot(lambda_discrete, cum_delta) - plt.savefig('cum_delta_' + str(case_id) + '_s_' + - str(ensemble_size) + '_all.pdf') - plt.close() - plt.figure() - plt.plot(lambda_discrete, deriv_delta) - plt.savefig('deriv_delta_' + str(case_id) + '_s_' + - str(ensemble_size) + '_all.pdf') - plt.close() - plt.figure() - plt.plot(lambda_discrete, cum_delta_omega) - plt.savefig('cum_delta_omega_' + str(case_id) + '_s_' + - str(ensemble_size) + '_all.pdf') - plt.close() - plt.figure() - plt.plot(lambda_discrete, deriv_delta_omega) - plt.savefig('deriv_delta_omega_' + str(case_id) + '_s_' + - str(ensemble_size) + '_all.pdf') - plt.close() - ''' - n_per_l = len(b_l) - n_total = n_per_l*ensemble_size - b_total = np.zeros((n_total,)) - A_total = np.zeros((n_total,n_total)) - for l in range(0,ensemble_size): - b_total[n_per_l*l:n_per_l*(l+1)] = b[:,l] - A_total[n_per_l*l:n_per_l*(l+1),n_per_l*l:n_per_l*(l+1)] = e.get_symmetrical_part(A[:,:,l]) - deltas_total, omegas_total = e.compute_deltas_omegas_normal(A_total,b_total) - - lambda_discrete, cum_delta, deriv_delta, cum_delta_omega, deriv_delta_omega, percent_delta, percent_delta_omega = compute_cum_delta_normal(deltas_total,omegas_total, lambda_min=0., lambda_max=12., n = 300 ) - - plt.figure() - plt.plot(lambda_discrete, cum_delta) - plt.savefig('cum_delta_' + str(case_id) + '_s_' + str(ensemble_size) + '_all_2.pdf') - plt.close() - plt.figure() - plt.plot(lambda_discrete, deriv_delta) - plt.savefig('deriv_delta_' + str(case_id) + '_s_' + str(ensemble_size) + '_all_2.pdf') - plt.close() - plt.figure() - plt.plot(lambda_discrete, cum_delta_omega) - plt.savefig('cum_delta_omega_' + str(case_id) + '_s_' + str(ensemble_size) + '_all_2.pdf') - plt.close() - plt.figure() - plt.plot(lambda_discrete, deriv_delta_omega) - plt.savefig('deriv_delta_omega_' + str(case_id) + '_s_' + str(ensemble_size) + '_all_2.pdf') - plt.close() - ''' - - -def compute_convergence(base_dir, case_ids, ensemble_sizes, k_max): - for case_id in case_ids: - for ensemble_size in ensemble_sizes: - for l in range(0, ensemble_size): - data = np.genfromtxt('deltas_omegas_' + str(case_id) + '_s_' + - str(ensemble_size) + '_l_' + str(l) + - '.txt') - deltas = data[:, 0] - omegas = data[:, 2] - - n = len(deltas) - - convergence = c.compute_convergence_serial_normal(k_max, - n, - omegas, - deltas, - verbose=True) - - -def main(): - base_dir_NER = '/Volumes/HD_SONY/Thesis/Test_1/all_results_NER_thesis1/' - base_dir_ER = '/Volumes/HD_SONY/Thesis/Test_1/all_results_ER_thesis1/' - - case_ids = [1, 2, 3, 4, 5, 6, 7] - ensemble_sizes = [8, 16, 32] - - compare_QoI(base_dir_NER, base_dir_ER, case_ids, ensemble_sizes) - read_Belos(base_dir_NER, base_dir_ER, case_ids, ensemble_sizes) - #compute_deltas_omegas(base_dir_NER, case_ids, ensemble_sizes) - - k_max = 3 - case_ids = [1] - ensemble_sizes = [8] - - #compute_convergence(base_dir_NER, case_ids, ensemble_sizes, k_max) - - -if __name__ == "__main__": - main() diff --git a/katoptron/thesis/test_2/1_cube.geo b/katoptron/thesis/test_2/1_cube.geo deleted file mode 100644 index f3bd653d..00000000 --- a/katoptron/thesis/test_2/1_cube.geo +++ /dev/null @@ -1,42 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - -C1 = 10; -//nCx = 3; -//nCy = 4; -//nCz = 5; - -lc = 1; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { C1, 0, 0, lc}; -Point(3) = { C1, 0, C1, lc}; -Point(4) = { 0, 0, C1, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Transfinite Line {1,3} = nCx+1 Using Progression 1; -Transfinite Line {2,4} = nCz+1 Using Progression 1; - -Line Loop(11) = {1,2,3,4}; -Plane Surface(12) = {11}; -Transfinite Surface {12}; -Recombine Surface {12}; - -Extrude {0, C1, 0} -{ - Surface{12}; Layers{nCy}; Recombine; -} - -// physical entities - -Physical Volume("Body 1") = {1}; - -Physical Surface("Surf 1 1") = {-21}; -Physical Surface("Surf 1 2") = {-29}; - -Physical Point("Measure point 1") = {4}; -Physical Point("Measure point 2") = {1}; diff --git a/katoptron/thesis/test_2/1_cube.py b/katoptron/thesis/test_2/1_cube.py deleted file mode 100644 index a5fcf836..00000000 --- a/katoptron/thesis/test_2/1_cube.py +++ /dev/null @@ -1,159 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -from PyTrilinos import Teuchos -import shlex -import subprocess -import os -import numpy as np -import tarfile -import glob -from fwk.wutils import parseargs - - -def tar_results(directory, filename, rank): - os.chdir(directory) - if rank == 0: - tf = tarfile.open(filename + ".tar.gz", mode="w:gz") - for file in glob.glob('*'): - if file.endswith(".tar.gz"): - print(file + ' is not included') - else: - tf.add(file) - tf.close() - - -def model(msh, E, p, ensemble_size, case_name, max_iter, use_Prec=False): - comm, rank, size = m.utilities.import_MPI() - file_dir = os.path.dirname(__file__) - - pbl = m.Problem(msh, comm) - - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - - zero = np.zeros(ensemble_size) - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., 1, 0., 1, 0., 1, 0., - ensemble_size) - m.Neumann(pbl, "Surf 1 2", "heat fluxes", 0, zero, 0, zero, 1, p, 0, zero, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Ensemble Convergence Tolerance'] = 0. # 10**(-8) - solverList['Maximum Iterations'] = int(max_iter) - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = use_Prec - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['Write vtk files'] = False - - if use_Prec: - solverList['convert MueLu xml file'] = True - solverList["use xml file"] = True - solverList["MueLu xml file name"] = file_dir + '/prec.xml' - - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - u.mkdir_MPI(case_name, comm, rank, size) - os.chdir(case_name) - - if rank == 0: - f = open('msh_size.txt', 'w') - print(len(msh.nodes), file=f) - f.closed - - np.savetxt('E.txt', E) - np.savetxt('p.txt', p) - - slv.start() - - if rank == 0: - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - os.chdir('..') - - -def read_msh(nCx, nCy, nCz, file_dir, work_dir, i=0, load=True): - comm, rank, size = m.utilities.import_MPI() - - geo_name = '1_cube.geo' - mesh_name = '1_cube.msh' - mesh_2_name = str('1_cube_'+str(i)+'.msh') - - pars = {'nCx': nCx, 'nCy': nCy, 'nCz': nCz} - - if load: - msh = gmsh.MeshLoader(mesh_2_name, work_dir).execute() - else: - old_name = str(work_dir+'/'+mesh_name) - new_name = str(work_dir+'/'+mesh_2_name) - msh = gmsh.MeshLoader(geo_name, file_dir).execute(**pars) - os.rename(old_name, new_name) - - return msh - - -def main(): - comm, rank, size = m.utilities.import_MPI() - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - E_mean = 1. - p_mean = 0.1 - - ensemble_sizes = [1, 8, 16, 24, 32] - - nCx = 9 - nCy = 9 - - N = 100 - N_i = 10 - tmp = np.logspace(1, 5, N, endpoint=True, dtype=int) - nCzs = tmp - 1 - max_iter = 100 - - # Compute all the meshes BEFORE initialing Kokkos. - - for i in range(0, N_i): - nCz = nCzs[i] - msh = read_msh(nCx, nCy, nCz, file_dir, work_dir, i, False) - - # Now that all the meshes are computed, we can initialize Kokkos. - nThreads = u.Initialize_Kokkos() - for i in range(0, N_i): - nCz = nCzs[i] - msh = read_msh(nCx, nCy, nCz, file_dir, work_dir, i, True) - for ensemble_size in ensemble_sizes: - E = E_mean * np.ones(ensemble_size) - p = p_mean * np.ones(ensemble_size) - - directory_case_id = str('test_' + - str(i) + '_s_' + str(ensemble_size) + '_no_prec_m_' + str(max_iter)) - model(msh, E, p, ensemble_size, directory_case_id, - max_iter, use_Prec=False) - directory_case_id = str('test_' + - str(i) + '_s_' + str(ensemble_size) + '_prec_m_' + str(max_iter)) - model(msh, E, p, ensemble_size, directory_case_id, - max_iter, use_Prec=True) - u.Finalize_Kokkos() - - -if __name__ == "__main__": - main() diff --git a/katoptron/thesis/test_2/blake.slurm.sh b/katoptron/thesis/test_2/blake.slurm.sh deleted file mode 100644 index 7f64a62e..00000000 --- a/katoptron/thesis/test_2/blake.slurm.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=test_2 -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/test_2.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_HW_SUBSET=24c,1t -export KMP_AFFINITY=compact - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} - -python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_2/1_cube.py \ No newline at end of file diff --git a/katoptron/thesis/test_2/post_process.py b/katoptron/thesis/test_2/post_process.py deleted file mode 100644 index e6aa56bd..00000000 --- a/katoptron/thesis/test_2/post_process.py +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -import katoptron.eigenvalues as e -import katoptron.readers as r -import katoptron.convergence as c -from PyTrilinos import Teuchos -import shlex -import subprocess -import os -import numpy as np -import tarfile -import glob -from fwk.wutils import parseargs -import matplotlib.pyplot as plt -from mpl_toolkits.mplot3d import axes3d -from katoptron.speedup import * - - -def CPU_time_all_cases(base_dir, n_cases, ensemble_sizes, - querylines, use_waves_timers, use_teuchos_timers, m, - use_prec=False): - - CPUs = np.zeros((n_cases, len(ensemble_sizes), len(querylines))) - msh_size = np.zeros((n_cases,)) - - for i in range(0, n_cases): - msh_size[i] = np.loadtxt( - base_dir + 'test_'+str(i)+'_s_1_no_prec_m_' + str(m) + '/msh_size.txt') - for j in range(0, len(ensemble_sizes)): - ensemble_size = ensemble_sizes[j] - - input_MC_file_dir = base_dir + 'test_' + \ - str(i)+'_s_'+str(ensemble_size) - - if use_prec: - input_MC_file_dir = input_MC_file_dir + \ - '_prec_m_' + str(m) + '/' - else: - input_MC_file_dir = input_MC_file_dir + \ - '_no_prec_m_' + str(m) + '/' - - for k in use_waves_timers: - CPUs[i, j, int(k)] = read_timers( - input_MC_file_dir + 'timers.txt', [querylines[int(k)]])[0] - for k in use_teuchos_timers: - CPUs[i, j, int(k)] = read_teuchos_timers( - input_MC_file_dir + 'teuchos_timers.txt', - [querylines[int(k)]])[0] - - return CPUs, msh_size - - -def plot_CPU_and_speedup(CPUs, msh_size, ensemble_sizes, index, querylines): - plt.figure() - for i in range(0, len(ensemble_sizes)): - plt.loglog(3*msh_size, CPUs[:, i, index], '*-') - - plt.ylabel('CPU time [sec]') - plt.xlabel('# dofs') - plt.title(querylines[index]) - plt.grid(True, which="both") - tmp_name = querylines[index].replace(": ", "_") - tmp_name = tmp_name.replace(" ", "_") - plt.savefig(tmp_name+'_CPU.png') - - np.savetxt(tmp_name+'_CPU.txt', CPUs[:, :, index]) - - mc_all = np.zeros((len(ensemble_sizes), 2)) - for i in range(0, len(ensemble_sizes)): - logX = np.log(3*msh_size) - logY = np.log(CPUs[:, i, index]) - m, c = np.polyfit(logX, logY, 1) - mc_all[i, 0] = m - mc_all[i, 1] = c - - np.savetxt(tmp_name+'_CPU_mc.txt', mc_all) - - plt.figure() - for i in range(1, len(ensemble_sizes)): - plt.loglog( - 3*msh_size, (ensemble_sizes[i]*CPUs[:, 0, index] / CPUs[:, i, index]), '*-') - - x = 3*np.array([msh_size[0], msh_size[-1]]) - y = np.array([1., 1.]) - plt.grid(True, which="both") - - plt.ylabel('Speed-up') - plt.xlabel('# dofs') - plt.title(querylines[index]) - plt.savefig(tmp_name+'_speedup.png') - for i in range(1, len(ensemble_sizes)): - np.savetxt(tmp_name+'_speedup_'+str( - ensemble_sizes[i])+'.txt', (ensemble_sizes[i]*CPUs[:, 0, index] / CPUs[:, i, index])) - - -def main(): - base_dir = '/Users/kimliegeois/Desktop/results/' - n_cases = 50 - - ensemble_sizes = [1, 8, 16, 24, 32] - - querylines = [ - 'total', 'write results', 'computeMatrices', - 'Belos: Operation Op*x', 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: DGKS[2]: Ortho (Inner Product)', - 'Belos: DGKS[2]: Ortho (Norm)', 'Belos: DGKS[2]: Ortho (Update)', - 'Belos: PseudoBlockGmresSolMgr total solve time' - ] - use_waves_timers = np.array([0, 1, 2], dtype=int) - use_teuchos_timers = np.array( - [3, 4, 5, 6, 7, 8, 9], - dtype=int) - - m = 100 - - CPUs, msh_size = CPU_time_all_cases(base_dir, n_cases, ensemble_sizes, - querylines, use_waves_timers, use_teuchos_timers, m, - use_prec=False) - - CPUs[:, :, 0] = CPUs[:, :, 0] - CPUs[:, :, 1] - - np.savetxt('N_dofs.txt', 3*msh_size) - #print CPUs - #print msh_size - - for i in range(0, 10): - plot_CPU_and_speedup(CPUs, msh_size, ensemble_sizes, i, querylines) - - -if __name__ == "__main__": - main() diff --git a/katoptron/thesis/test_2/prec.xml b/katoptron/thesis/test_2/prec.xml deleted file mode 100644 index 7fcef90c..00000000 --- a/katoptron/thesis/test_2/prec.xml +++ /dev/null @@ -1,20 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - <Parameter name="max levels" type="int" value="5"/> - <Parameter name="smoother: type" type="string" value="RELAXATION"/> - <ParameterList name="smoother: params"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="5"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - <!-- <Parameter name="relaxation: backward mode" type="bool" value="true"/> --> - </ParameterList> - <Parameter name="coarse: type" type="string" value="Klu"/> - <Parameter name="verbosity" type="string" value="extreme"/> - <Parameter name="multigrid algorithm" type="string" value="unsmoothed"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - <Parameter name="number of equations" type="int" value="3"/> -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/thesis/test_2/prec_1.xml b/katoptron/thesis/test_2/prec_1.xml deleted file mode 100644 index b2bd91f1..00000000 --- a/katoptron/thesis/test_2/prec_1.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="coarse: type" type="string" value="RELAXATION"/> - <ParameterList name="coarse: params"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="5"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - <Parameter name="verbosity" type="string" value="extreme"/> - <Parameter name="number of equations" type="int" value="3"/> -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/thesis/test_3/beam.geo b/katoptron/thesis/test_3/beam.geo deleted file mode 100644 index 71c4c0a7..00000000 --- a/katoptron/thesis/test_3/beam.geo +++ /dev/null @@ -1,114 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - - -//L = 50.; -//W = 1.; -//H = 5.; -//d = 1.; - -//L = 50.; -//W = 5.; -//H = 5.; -H_rigid = 1.; -//d = 1.; - -hW = W/2; -hH = H/2; - -//n_L = 60; -//n_hW = 3; -//n_hH = 3; - -n_L_rigid = 1; -n_W_rigid = 1; -n_H_rigid = 1; - - -lc = 1; - -delta_H = hH+d; - -Point(101) = { 0, -hW, d, lc}; -Point(102) = { 0, 0, d, lc}; -Point(103) = { 0, hW, d, lc}; -Point(104) = { L, hW, d, lc}; -Point(105) = { L, 0, d, lc}; -Point(106) = { L, -hW, d, lc}; - -Point(205) = { 0, -hW, 0, lc}; -Point(206) = { 0, hW, 0, lc}; -Point(207) = { L, hW, 0, lc}; -Point(208) = { L, -hW, 0, lc}; - -Line(101) = {101, 102}; -Line(102) = {102, 103}; -Line(103) = {103, 104}; -Line(104) = {104, 105}; -Line(105) = {105, 106}; -Line(106) = {106, 101}; -Line(107) = {105, 102}; - -Line(205) = {205, 206}; -Line(206) = {206, 207}; -Line(207) = {207, 208}; -Line(208) = {208, 205}; - -Transfinite Line {101,102,104,105} = n_hW+1 Using Progression 1; -Transfinite Line {103,106,107} = n_L+1 Using Progression 1; - -Transfinite Line {205,207} = n_W_rigid+1 Using Progression 1; -Transfinite Line {206,208} = n_L_rigid+1 Using Progression 1; - -Line Loop(101) = {101,-107,105,106}; -Plane Surface(101) = {101}; -Transfinite Surface {101}; -Recombine Surface {101}; - -Line Loop(102) = {102,103,104,107}; -Plane Surface(102) = {102}; -Transfinite Surface {102}; -Recombine Surface {102}; - -Line Loop(202) = {-208,-207,-206,-205}; -Plane Surface(202) = {202}; -Transfinite Surface {202}; -Recombine Surface {202}; - -Extrude {0, 0, hH} -{ - Surface{101,102}; Layers{n_hH}; Recombine; -} - -Extrude {0, 0, hH} -{ - Surface{230,252}; Layers{n_hH}; Recombine; -} - -Extrude {0, 0, -H_rigid} -{ - Surface{202}; Layers{n_H_rigid}; Recombine; -} - - - -Physical Volume("Rigid body") = {5}; -Physical Surface("Rigid surface") = {202}; -Physical Surface("Rigid clamped surface") = {309}; -Physical Line("Rigid surface boundary") = {205, 206, 207, 208}; - -Physical Volume("Beam") = {1,2,3,4}; -Physical Surface("Clamped end") = {217,239,261,283,317}; -Physical Surface("Loaded surface") = {274,296}; -Physical Surface("Beam contact zone") = {101,102}; -Physical Surface("Free end") = {269,247,225,291}; -Physical Line("Beam contact boundary") = {104,105,106,101,102,103}; -Physical Line("Beam contact Dirichlet") = {101,102}; - -Physical Line("Center of cross section") = {211}; - -Physical Line("Center of contact surface") = {107}; - -Mesh.Partitioner = 2; -Mesh.MetisAlgorithm = 2; -Mesh.MshFilePartitioned = 0; diff --git a/katoptron/thesis/test_3/beam.py b/katoptron/thesis/test_3/beam.py deleted file mode 100644 index cd5bb997..00000000 --- a/katoptron/thesis/test_3/beam.py +++ /dev/null @@ -1,238 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - - - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -from PyTrilinos import Teuchos -import shlex -import subprocess -import os -import numpy as np -import tarfile -import glob -from fwk.wutils import parseargs -from katoptron.Juelich.UQ.halton import * - - -def tar_results(directory, filename, rank): - os.chdir(directory) - if rank == 0: - tf = tarfile.open(filename + ".tar.gz", mode="w:gz") - for file in glob.glob('*'): - if file.endswith(".tar.gz"): - print(file + ' is not included') - else: - tf.add(file) - tf.close() - - -def model(msh, E, p, ensemble_size, work_dir): - comm, rank, size = m.utilities.import_MPI() - - partitioned_mesh_name = 'beam_k.msh' - file_dir = os.path.dirname(__file__) - current_dir = os.getcwd() - - pbl = m.Problem(msh, comm) - - nu = 0.29 * np.ones(ensemble_size) - k = 0 - d = 0 - - m.Medium(pbl, "Beam", "Mat 1", E, nu, k, d) - m.Medium(pbl, "Rigid body", "Mat 1", E, nu, k, d) - - dx = np.zeros(ensemble_size) - dy = np.zeros(ensemble_size) - dz = np.zeros(ensemble_size) - dT = np.zeros(ensemble_size) - zero = np.zeros(ensemble_size) - m.Dirichlet(pbl, "Rigid clamped surface", - "Clamped 1", 1, dx, 1, dy, 1, dz, 0, dT) - m.Dirichlet(pbl, "Clamped end", "Clamped 1", 1, dx, 1, dy, 1, dz, 0, dT) - m.Dirichlet(pbl, "Free end", "Clamped 1", 1, 0., - 0, 0., 0, 0., 0, 0., ensemble_size) - - m.Neumann(pbl, "Loaded surface", "Load 1", 0, zero, - 0, zero, 1, -p, 0, zero, ensemble_size) - - norm1 = tbox.Vector3d(0, 0, -1) - norm2 = tbox.Vector3d(0, 0, 1) - dg = np.zeros(ensemble_size) - - a = 49.95 - initiallyClosedNodesList = np.array([], dtype=np.float) - for el in msh.ntags["Beam contact zone"].elems: - for n1 in el.nodes: - node_id = n1.no-1 - if msh.nodes[node_id].pos[0] >= a: - initiallyClosedNodesList = np.append( - initiallyClosedNodesList, node_id) - - cont1 = m.Contact(pbl, "Beam contact zone", "contact", norm1, dg) - cont1.setInitialyOpen() - cont1.setInitiallyClosedNodes(initiallyClosedNodesList) - cont1.setDualShapeFunctions() - cont1.setSlaveDirichlet( - work_dir+"/"+partitioned_mesh_name, "Beam contact Dirichlet") - cont1.setSignoriniContact() - cont1.setMaster(pbl, "Rigid surface", norm2) - - solverList = Teuchos.ParameterList() - solverList['Convergence Tolerance'] = 10**(-8) - solverList['Maximum Iterations'] = 500 - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - muelu_xml_in = file_dir + '/../../preconditioners/SIMPLE_gs_direct_lvl_MT.xml.in' - old_strings = ['$BLOCK_00_STRIDING_INFO', '$BLOCK_11_STRIDING_INFO', - '$BLOCK_00_GS_sweeps', '$BLOCK_00_GS_damping', - '$SCHUR_omega', '$SimpleSmoother_damping', "$N_LVLS", "$N_SIZES", "$EXPORT_DATA", "$SimpleSmoother_sweeps"] - new_strings = ['3', '1', '3', '0.8', '0.8', '1', '2', '18', "true", '1'] - - u.replace_strings(muelu_xml_in, current_dir + - '/SIMPLE_MG.xml', old_strings, new_strings) - - solverList["MueLu xml file name"] = current_dir+'/SIMPLE_MG.xml' - solverList["convert MueLu xml file"] = True - - solverList['Use preconditioner'] = True - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 10 - solverList['Write txt files'] = True - solverList['Print Teuchos timers'] = True - - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - if rank == 0: - np.savetxt('E.txt', E) - np.savetxt('p.txt', p) - - slv.start() - - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - -def evaluate_all_ensembles(ensemble_sizes, N, msh, comm, rank, size, - file_dir, work_dir, E_vec, p_vec): - """ - This function loop over the ensemble sizes, - and the ensembles - """ - for ensemble_size in ensemble_sizes: - directory = str(ensemble_size) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - N_ensemble = N // ensemble_size - - ensemble_index_min = 0 - for ensemble_index in range(ensemble_index_min, N_ensemble): - directory = str(ensemble_index) - u.mkdir_MPI(directory, comm, rank, size) - os.chdir(directory) - - ensemble_index_start = ensemble_index * ensemble_size - ensemble_index_end = ensemble_index_start + ensemble_size - - E = E_vec[ensemble_index_start:ensemble_index_end] - - p = p_vec[ensemble_index_start:ensemble_index_end] - - model(msh, E, p, ensemble_size, work_dir) - - os.chdir('..') - os.chdir('..') - - -def main(): - comm, rank, size = m.utilities.import_MPI() - - args = parseargs() - - geo_name = 'beam.geo' - - larger_mesh = True - - par = {} - par['L'] = 50. - par['W'] = 5. - par['H'] = 5. - par['d'] = 1. - if larger_mesh: - par['n_L'] = 200 - par['n_hW'] = 5 - par['n_hH'] = 5 - else: - par['n_L'] = 60 - par['n_hW'] = 3 - par['n_hH'] = 3 - - import shlex - import subprocess - import os - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - pars = {'L': par['L'], 'W': par['W'], 'H': par['H'], 'd': par['d'], - 'n_L': par['n_L'], 'n_hW': par['n_hW'], 'n_hH': par['n_hH']} - - msh, mesh_name, partitioned_mesh_name = u.read_mesh_MPI( - geo_name, file_dir, work_dir, comm, rank, size, pars) - - for n1 in msh.nodes: - n1.row = n1.no-1 - - N = 640 - p_min = 0.5 - p_max = 2.5 - E_min = 20500 - E_max = 21500 - - n_rand = 2 - halton_points = np.zeros((n_rand, N)) - E_vec = np.zeros((N, )) - p_vec = np.zeros((N, )) - for i in range(0, N): - halton_points[:, i] = halton(i, n_rand) - - E_vec = E_min + halton_points[0, :] * (E_max-E_min) - p_vec = p_min + halton_points[1, :] * (p_max-p_min) - - grouped = False - - if grouped: - order = np.loadtxt(file_dir+'/ordering.txt', dtype=int) - E_vec = E_vec[order[0:N]] - p_vec = p_vec[order[0:N]] - - if rank == 0: - np.savetxt('E_vec.txt', E_vec) - np.savetxt('p_vec.txt', p_vec) - - ensemble_sizes = [1, 8, 16, 32] - - nThreads = u.Initialize_Kokkos() - evaluate_all_ensembles(ensemble_sizes, N, msh, comm, rank, size, - file_dir, work_dir, E_vec, p_vec) - - u.Finalize_Kokkos() - - tar_results(work_dir, 'all_results', rank) - - -if __name__ == "__main__": - main() diff --git a/katoptron/thesis/test_3/blake.slurm.sh b/katoptron/thesis/test_3/blake.slurm.sh deleted file mode 100644 index bbc346f3..00000000 --- a/katoptron/thesis/test_3/blake.slurm.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=test_3 -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/test_3.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_HW_SUBSET=24c,1t -export KMP_AFFINITY=compact - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} - -python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_3/beam.py diff --git a/katoptron/thesis/test_3/ordering.txt b/katoptron/thesis/test_3/ordering.txt deleted file mode 100644 index 7680c699..00000000 --- a/katoptron/thesis/test_3/ordering.txt +++ /dev/null @@ -1,640 +0,0 @@ -318 -561 -453 -210 -588 -264 -129 -372 -615 -48 -426 -399 -534 -75 -108 -27 -486 -351 -405 -0 -81 -513 -567 -270 -243 -189 -162 -324 -339 -285 -222 -177 -123 -501 -384 -393 -609 -555 -204 -582 -42 -96 -258 -231 -420 -528 -366 -69 -447 -216 -345 -552 -228 -291 -183 -237 -102 -21 -390 -156 -249 -87 -411 -621 -573 -6 -252 -519 -255 -408 -219 -18 -387 -435 -504 -279 -84 -30 -480 -261 -543 -9 -381 -516 -273 -111 -90 -597 -570 -192 -297 -558 -327 -549 -354 -360 -612 -144 -153 -468 -441 -57 -207 -489 -432 -225 -594 -414 -288 -531 -540 -171 -99 -378 -165 -126 -1 -495 -135 -217 -63 -396 -45 -36 -198 -333 -379 -423 -622 -450 -492 -306 -639 -117 -91 -3 -522 -72 -330 -234 -315 -369 -342 -180 -603 -246 -352 -630 -477 -406 -253 -465 -415 -244 -55 -33 -60 -54 -459 -195 -585 -109 -568 -136 -576 -240 -595 -28 -433 -186 -82 -168 -298 -145 -357 -325 -510 -159 -114 -213 -600 -312 -163 -15 -469 -546 -564 -303 -271 -537 -636 -166 -348 -51 -429 -618 -19 -105 -343 -505 -375 -591 -321 -294 -474 -24 -280 -267 -559 -451 -181 -150 -64 -127 -139 -604 -226 -517 -442 -154 -388 -193 -31 -73 -550 -85 -478 -613 -328 -262 -274 -235 -100 -247 -46 -424 -586 -301 -490 -571 -397 -316 -4 -463 -355 -532 -289 -208 -370 -409 -502 -466 -444 -633 -471 -507 -309 -120 -525 -66 -138 -147 -201 -579 -462 -300 -336 -12 -627 -282 -417 -174 -498 -39 -363 -624 -93 -141 -190 -276 -514 -541 -438 -460 -487 -37 -456 -334 -483 -118 -172 -496 -631 -67 -10 -523 -78 -132 -577 -307 -121 -199 -361 -445 -229 -202 -220 -402 -94 -103 -607 -499 -337 -598 -391 -580 -526 -13 -175 -436 -40 -634 -22 -283 -553 -382 -544 -475 -196 -256 -58 -625 -148 -25 -373 -151 -340 -385 -178 -205 -346 -49 -589 -112 -304 -418 -295 -265 -508 -211 -412 -637 -130 -70 -124 -601 -349 -535 -16 -43 -367 -319 -421 -520 -400 -142 -628 -157 -472 -439 -493 -292 -187 -115 -511 -169 -7 -97 -529 -583 -610 -61 -394 -616 -574 -238 -547 -250 -259 -268 -286 -88 -313 -79 -331 -562 -556 -481 -430 -454 -133 -76 -184 -223 -173 -619 -605 -232 -92 -106 -164 -29 -448 -443 -623 -434 -38 -326 -380 -218 -277 -119 -461 -322 -335 -160 -542 -353 -2 -191 -515 -254 -551 -376 -484 -272 -65 -299 -488 -137 -110 -263 -497 -569 -11 -227 -281 -362 -572 -596 -389 -248 -221 -578 -518 -56 -606 -310 -427 -407 -358 -364 -34 -83 -524 -241 -457 -245 -52 -565 -214 -422 -470 -587 -592 -566 -538 -32 -479 -98 -403 -77 -512 -410 -305 -485 -317 -416 -395 -224 -236 -629 -179 -161 -320 -530 -278 -20 -260 -212 -548 -233 -206 -188 -113 -44 -50 -431 -155 -341 -458 -374 -68 -128 -602 -134 -8 -182 -392 -125 -503 -71 -89 -116 -332 -329 -449 -74 -557 -17 -59 -107 -170 -560 -563 -365 -452 -359 -428 -62 -371 -143 -131 -239 -266 -302 -269 -167 -47 -611 -95 -467 -308 -608 -455 -200 -533 -86 -536 -287 -494 -632 -209 -590 -626 -5 -575 -614 -581 -617 -176 -185 -401 -41 -293 -290 -506 -491 -527 -437 -311 -35 -104 -545 -419 -635 -344 -338 -413 -14 -23 -158 -425 -398 -140 -251 -257 -356 -203 -230 -554 -599 -194 -101 -275 -383 -593 -404 -539 -377 -368 -476 -314 -482 -584 -26 -80 -53 -323 -296 -350 -521 -440 -242 -500 -620 -152 -215 -638 -122 -197 -386 -509 -446 -347 -473 -284 -149 -146 -464 diff --git a/katoptron/thesis/test_3/post_process.py b/katoptron/thesis/test_3/post_process.py deleted file mode 100644 index f8a356fa..00000000 --- a/katoptron/thesis/test_3/post_process.py +++ /dev/null @@ -1,485 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -import katoptron.eigenvalues as e -import katoptron.readers as r -import katoptron.convergence as c -from PyTrilinos import Teuchos -import shlex -import subprocess -import os -import numpy as np -import tarfile -import glob -from fwk.wutils import parseargs -import matplotlib.pyplot as plt -from mpl_toolkits.mplot3d import axes3d -from katoptron.speedup import * - - -def read_mm_vector(filename, ensemble_size): - with open(filename, 'r') as my_file: - text = my_file.read().splitlines(True) - if ensemble_size > 1: - for i in range(2, len(text)): - text[i] = text[i].replace("[", "") - text[i] = text[i].replace("]", "") - - X = np.genfromtxt(text[2:]) - return X - - -def extract_values(filename, node_id, which_dof, dof_per_node, ensemble_size): - output = np.zeros((ensemble_size, )) - X = read_mm_vector(filename, ensemble_size) - output = X[dof_per_node * node_id + which_dof, :] - return output - - -def write_tex(n_samples, iter, filename): - f = open(filename, 'w') - print('\\addplot [c1, mark=*, mark size=2pt, mark options={solid}, only marks]', file=f) - print('table [row sep=crcr] {%', file=f) - for i in range(0, n_samples): - print(str(i) + ' ' + str(iter[0][i]) + '\\\\', file=f) - print('};', file=f) - print('\\label{pgfplots:noEP}', file=f) - ensemble_size = 8 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - print('\\addplot [line width=2pt, c2]', file=f) - print('table [row sep=crcr] {%', file=f) - print(str(ensemble_size * i) + ' ' + str( - iter[1][ensemble_size * i]) + '\\\\', file=f) - print(str(ensemble_size * - (i + 1)) + ' ' + str(iter[1][ensemble_size * - (i + 1) - 1]) + '\\\\', file=f) - print('};', file=f) - print('\\label{pgfplots:s8}', file=f) - ensemble_size = 16 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - print('\\addplot [line width=1.5pt, c3]', file=f) - print('table [row sep=crcr] {%', file=f) - print(str(ensemble_size * i) + ' ' + str( - iter[2][ensemble_size * i]) + '\\\\', file=f) - print(str(ensemble_size * - (i + 1)) + ' ' + str(iter[2][ensemble_size * - (i + 1) - 1]) + '\\\\', file=f) - print('};', file=f) - print('\\label{pgfplots:s16}', file=f) - ensemble_size = 32 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - print('\\addplot [line width=1.pt, c4]', file=f) - print('table [row sep=crcr] {%', file=f) - print(str(ensemble_size * i) + ' ' + str( - iter[3][ensemble_size * i]) + '\\\\', file=f) - print(str(ensemble_size * - (i + 1)) + ' ' + str(iter[3][ensemble_size * - (i + 1) - 1]) + '\\\\', file=f) - print('};', file=f) - print('\\label{pgfplots:s32}', file=f) - f.closed - - -def CPU_time_per_one_case(base_dir, - n_samples, - ensemble_sizes, - quantiles, - querylines, - use_waves_timers, - use_teuchos_timers, - per_iteration, - filename_CPU, - filename_speed_up, - per_ensemble=True): - - timers = read_timers_all_ensemble_sizes(n_samples, ensemble_sizes, - base_dir, querylines, - use_waves_timers, - use_teuchos_timers) - - f = open(filename_CPU, 'w') - print(timers.shape, file=f) - - for i in range(0, timers.shape[2]): - print(querylines[i], file=f) - string = '' - for e in range(0, timers.shape[0]): - if per_ensemble: - current_timer = (np.sum(timers[e, :, i]) / n_samples) - else: - current_timer = (np.sum( - timers[e, :, i]) / (n_samples * ensemble_sizes[e])) - string = string + str(round(current_timer, 3)) + ' & ' - print(string, file=f) - print(' ', file=f) - f.closed - - f = open(filename_speed_up, 'w') - print(timers.shape, file=f) - - for i in range(0, timers.shape[2]): - print(querylines[i], file=f) - string = '' - for e in range(0, timers.shape[0]): - if e == 0: - current_timer_s1 = np.sum(timers[0, :, i]) - current_timer = (np.sum(timers[e, :, i]) / ensemble_sizes[e]) - string = string + str(round((current_timer_s1 / current_timer), - 3)) + ' & ' - print(string, file=f) - print(' ', file=f) - f.closed - - -def load_qoi(base_dir, N, ensemble_size): - node_id = 68 - #node_id = 227 - which_dof = 2 - dof_per_node = 3 - - qoi = np.zeros((N, )) - N_ensemble = N // ensemble_size - - ensemble_index_min = 0 - for ensemble_index in range(ensemble_index_min, N_ensemble): - solution_file_name = base_dir + '/' + str(ensemble_size) + '/' + str( - ensemble_index) + '/x_mm.txt' - output = extract_values(solution_file_name, node_id, which_dof, - dof_per_node, ensemble_size) - - ensemble_index_start = ensemble_index * ensemble_size - ensemble_index_end = ensemble_index_start + ensemble_size - - qoi[ensemble_index_start:ensemble_index_end] = output - - return qoi - - -def speedup(base_dir, - n_samples, - ensemble_sizes, - quantiles, - querylines, - use_waves_timers, - use_teuchos_timers, - per_iteration, - ensemble_reduction=False): - import matplotlib.pyplot as plt - - if ensemble_reduction: - case_id = 'ER' - else: - case_id = 'NER' - - speedup = compute_speedup(n_samples, - ensemble_sizes, - base_dir, - querylines, - per_iteration, - quantiles, - use_waves_timers, - use_teuchos_timers, - reduction=ensemble_reduction, - remove_write=True) - - plot_speedup(speedup, ensemble_sizes, np.arange(0, len(querylines)), - 'beam_' + case_id, querylines, per_iteration) - plt.savefig('beam_' + case_id + '.png', dpi=400) - - save_speedup(speedup, ensemble_sizes, querylines, 'beam_' + case_id) - - R = compute_R(n_samples, ensemble_sizes, base_dir, quantiles, - ensemble_reduction) - save_R(R, 'beam_R_' + case_id) - - -def speedup_ensemble_reduction(base_dir_ER, base_dir_NER, n_samples): - ensemble_sizes = [1, 8, 16, 32] - quantiles = [0, 0.33, 0.5, 0.66, 1.] - - querylines = [ - 'computeMatrices', 'Belos: Operation Op*x', 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: DGKS[2]: Ortho (Inner Product)', - 'Belos: DGKS[2]: Ortho (Norm)', 'Belos: DGKS[2]: Ortho (Update)', - 'total', 'write results', 'MueLu: Hierarchy: Solve (level=0)', - 'MueLu: Hierarchy: Solve (level=1)', - 'MueLu: Hierarchy: Solve : smoothing (level=0)', - 'MueLu: Hierarchy: Solve : prolongation (level=0)', - 'MueLu: Hierarchy: Solve : residual calculation (level=0)', - 'MueLu: Hierarchy: Solve : restriction (level=0)', - 'MueLu: SIMPLE: Apply: Update step - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Solve block 00 - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Compute RHS - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Solve block 11 - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Compute RHS - level 0' - ] - use_waves_timers = np.array([0, 7, 8], dtype=int) - use_teuchos_timers = np.array( - [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], - dtype=int) - per_iteration = [ - False, True, True, False, False, False, False, False, False, True, - True, True, True, True, True, True, True, True, True, True - ] - - speedup(base_dir_NER, n_samples, ensemble_sizes, quantiles, querylines, - use_waves_timers, use_teuchos_timers, per_iteration, False) - speedup(base_dir_ER, n_samples, ensemble_sizes, quantiles, querylines, - use_waves_timers, use_teuchos_timers, per_iteration, True) - - querylines = [ - 'domain', 'Belos: Operation Op*x', 'Belos: Operation Prec*x', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: PseudoBlockGmresSolMgr total solve time', - 'MueLu: Hierarchy: Setup (total)', 'Belos: DGKS[2]: Ortho (Update)', - 'total', 'write results', 'MueLu: Hierarchy: Solve (level=0)', - 'MueLu: Hierarchy: Solve (level=1)', - 'MueLu: Hierarchy: Solve : smoothing (level=0)', - 'MueLu: Hierarchy: Solve : prolongation (level=0)', - 'MueLu: Hierarchy: Solve : residual calculation (level=0)', - 'MueLu: Hierarchy: Solve : restriction (level=0)', - 'MueLu: SIMPLE: Apply: Update step - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Solve block 00 - level 0', - 'MueLu: SIMPLE: Apply: Prediction step: Compute RHS - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Solve block 11 - level 0', - 'MueLu: SIMPLE: Apply: Correction step: Compute RHS - level 0', - 'compute contact matrices', 'compute block 00 matrix', 'dp', - 'computeMatrices' - ] - use_waves_timers = np.array([0, 7, 8, 20, 21, 22, 23], dtype=int) - use_teuchos_timers = np.array( - [1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], - dtype=int) - per_iteration = [ - False, True, True, False, False, False, False, False, False, True, - True, True, True, True, True, True, True, True, True, True, False - ] - - CPU_time_per_one_case(base_dir_NER, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration, 'average_CPU_NER.txt', - 'average_speed_up_NER.txt') - - CPU_time_per_one_case(base_dir_ER, n_samples, ensemble_sizes, quantiles, - querylines, use_waves_timers, use_teuchos_timers, - per_iteration, 'average_CPU_ER.txt', - 'average_speed_up_ER.txt') - - -def plot_iter_all_ensemble_sizes(n_samples, iter, print_all=True): - import matplotlib.pyplot as plt - plt.figure() - plt.plot(list(range(0, n_samples)), - iter[0][:], 'bo', markersize=8, zorder=1) - ensemble_size = 8 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - plt.plot(list(range(ensemble_size * i, ensemble_size * (i + 1))), - iter[1][ensemble_size * i:ensemble_size * (i + 1)], - '-ro', - linewidth=3, - markersize=6, - zorder=2) - if print_all: - ensemble_size = 16 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - plt.plot(list(range(ensemble_size * i, ensemble_size * (i + 1))), - iter[2][ensemble_size * i:ensemble_size * (i + 1)], - '-go', - linewidth=2, - markersize=4, - zorder=2) - ensemble_size = 32 - for i in range(0, int(np.ceil(n_samples * 1. / ensemble_size))): - plt.plot(list(range(ensemble_size * i, ensemble_size * (i + 1))), - iter[3][ensemble_size * i:ensemble_size * (i + 1)], - '-ko', - linewidth=1, - markersize=2, - zorder=3) - plt.xlabel('sample') - plt.ylabel('Number of iterations to converge') - - -def plot_iter_all(base_dir_ER, base_dir_NER, ensemble_sizes, n_samples): - - iter_NER = read_iter_all_ensemble_sizes(n_samples, ensemble_sizes, - base_dir_NER, False) - iter_ER = read_iter_all_ensemble_sizes(n_samples, ensemble_sizes, - base_dir_ER, True) - plot_iter_all_ensemble_sizes(n_samples, iter_NER) - write_tex(n_samples, iter_NER, 'NER_conv.tex') - np.savetxt('NER_conv.txt', iter_NER) - np.savetxt('ordering_1.txt', - np.argsort(iter_NER[0, :]).astype(int), - fmt='%i') - np.savetxt('ordering_2.txt', - np.argsort(iter_NER[0][:]).astype(int), - fmt='%i') - plot_iter_all_ensemble_sizes(n_samples, iter_ER) - write_tex(n_samples, iter_ER, 'ER_conv.tex') - np.savetxt('ER_conv.txt', iter_ER) - - order = np.argsort(iter_NER[0, :]) - - tmp = iter_NER[0][order] - - plt.figure() - plt.plot(iter_NER[0][:]) - plt.savefig('no_order_1.png', dpi=400) - - iter_NER[0][:] = tmp - - plt.figure() - plt.plot(tmp) - plt.savefig('order_1.png', dpi=400) - - tmp = iter_ER[0][order] - - plt.figure() - plt.plot(iter_ER[0][:]) - plt.savefig('no_order_2.png', dpi=400) - - iter_ER[0][:] = tmp - - write_tex(n_samples, iter_NER, 'NER_conv_2.tex') - write_tex(n_samples, iter_ER, 'ER_conv_2.tex') - - plt.figure() - plt.plot(tmp) - plt.savefig('order_2.png', dpi=400) - - -def plot_AS_iter_all(base_dir_ER, base_dir_NER, ensemble_sizes, n_samples): - - iter_NER = read_AS_iter_all_ensemble_sizes(n_samples, ensemble_sizes, - base_dir_NER, False) - iter_ER = read_AS_iter_all_ensemble_sizes(n_samples, ensemble_sizes, - base_dir_ER, True) - plot_iter_all_ensemble_sizes(n_samples, iter_NER) - write_tex(n_samples, iter_NER, 'AS_NER_conv.tex') - np.savetxt('AS_NER_conv.txt', iter_NER) - np.savetxt('AS_ordering_1.txt', - np.argsort(iter_NER[0, :]).astype(int), - fmt='%i') - np.savetxt('AS_ordering_2.txt', - np.argsort(iter_NER[0][:]).astype(int), - fmt='%i') - plot_iter_all_ensemble_sizes(n_samples, iter_ER) - write_tex(n_samples, iter_ER, 'AS_ER_conv.tex') - np.savetxt('AS_ER_conv.txt', iter_ER) - - order = np.argsort(iter_NER[0, :]) - - tmp = iter_NER[0][order] - - plt.figure() - plt.plot(iter_NER[0][:]) - plt.savefig('AS_no_order_1.png', dpi=400) - - iter_NER[0][:] = tmp - - plt.figure() - plt.plot(tmp) - plt.savefig('AS_order_1.png', dpi=400) - - tmp = iter_ER[0][order] - - plt.figure() - plt.plot(iter_ER[0][:]) - plt.savefig('AS_no_order_2.png', dpi=400) - - iter_ER[0][:] = tmp - - write_tex(n_samples, iter_NER, 'AS_NER_conv_2.tex') - write_tex(n_samples, iter_ER, 'AS_ER_conv_2.tex') - - plt.figure() - plt.plot(tmp) - plt.savefig('AS_order_2.png', dpi=400) - - -def all_post_process(grouped): - if grouped: - base_dir_NER = '/Volumes/HD_SONY/Thesis/Test_3/all_results_NER_grouped_2' - base_dir_ER = '/Volumes/HD_SONY/Thesis/Test_3/all_results_ER_grouped_2' - directory = 'grouped' - else: - base_dir_NER = '/Volumes/HD_SONY/Thesis/Test_3/all_results_NER_beam' - base_dir_ER = '/Volumes/HD_SONY/Thesis/Test_3/all_results_ER_beam' - directory = 'not_grouped' - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - N = 640 - ensemble_sizes = [1, 8, 16, 32] - - #compare_QoI(base_dir_NER, base_dir_ER, N, ensemble_sizes) - speedup_ensemble_reduction(base_dir_ER, base_dir_NER, N) - - E = np.loadtxt(base_dir_NER + '/E_vec.txt') - p = np.loadtxt(base_dir_NER + '/p_vec.txt') - - qoi_NER_8 = load_qoi(base_dir_NER, N, 8) - qoi_NER_16 = load_qoi(base_dir_NER, N, 16) - qoi_NER_32 = load_qoi(base_dir_NER, N, 32) - - qoi_ER_8 = load_qoi(base_dir_ER, N, 8) - qoi_ER_16 = load_qoi(base_dir_ER, N, 16) - qoi_ER_32 = load_qoi(base_dir_ER, N, 32) - - np.savetxt('qoi_NER_8.tex', qoi_NER_8) - ''' - fig = plt.figure() - ax = fig.gca(projection='3d') - ax.scatter(E,p,qoi_ER_8) - - fig = plt.figure() - ax = fig.gca(projection='3d') - ax.scatter(E,p,qoi_ER_16) - - fig = plt.figure() - ax = fig.gca(projection='3d') - ax.scatter(E,p,qoi_ER_32) - ''' - - plot_iter_all(base_dir_ER, base_dir_NER, ensemble_sizes, N) - plot_AS_iter_all(base_dir_ER, base_dir_NER, ensemble_sizes, N) - - plt.figure() - for i in range(0, 8): - iter_indices, residuals = read_Belos( - base_dir_NER + '/1/' + str(i) + '/belos_out.txt', 1) - plt.semilogy(residuals) - - x = np.array([0, 180]) - y = np.array([1e-6, 1e-6]) - plt.semilogy(x, y, 'k--') - - plt.figure() - iter_indices, residuals = read_Belos(base_dir_NER + '/8/0/belos_out.txt', - 8) - for i in range(0, 8): - plt.semilogy(residuals[:, i]) - - plt.semilogy(x, y, 'k--') - - plt.figure() - iter_indices, residuals = read_Belos(base_dir_ER + '/8/0/belos_out.txt', 1) - plt.semilogy(residuals) - plt.semilogy(x, y, 'k--') - os.chdir('..') - - -def main(): - all_post_process(False) - all_post_process(True) - - -if __name__ == "__main__": - main() diff --git a/katoptron/thesis/test_4/1_cube.geo b/katoptron/thesis/test_4/1_cube.geo deleted file mode 100644 index f3bd653d..00000000 --- a/katoptron/thesis/test_4/1_cube.geo +++ /dev/null @@ -1,42 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - -C1 = 10; -//nCx = 3; -//nCy = 4; -//nCz = 5; - -lc = 1; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { C1, 0, 0, lc}; -Point(3) = { C1, 0, C1, lc}; -Point(4) = { 0, 0, C1, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Transfinite Line {1,3} = nCx+1 Using Progression 1; -Transfinite Line {2,4} = nCz+1 Using Progression 1; - -Line Loop(11) = {1,2,3,4}; -Plane Surface(12) = {11}; -Transfinite Surface {12}; -Recombine Surface {12}; - -Extrude {0, C1, 0} -{ - Surface{12}; Layers{nCy}; Recombine; -} - -// physical entities - -Physical Volume("Body 1") = {1}; - -Physical Surface("Surf 1 1") = {-21}; -Physical Surface("Surf 1 2") = {-29}; - -Physical Point("Measure point 1") = {4}; -Physical Point("Measure point 2") = {1}; diff --git a/katoptron/thesis/test_4/1_cube.py b/katoptron/thesis/test_4/1_cube.py deleted file mode 100644 index f3a7b39a..00000000 --- a/katoptron/thesis/test_4/1_cube.py +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -from PyTrilinos import Teuchos -import shlex -import subprocess -import os -import numpy as np -import tarfile -import glob -from fwk.wutils import parseargs - - -def model(msh, E, p, ensemble_size, case_name, max_iter, use_Prec=False): - comm, rank, size = m.utilities.import_MPI() - file_dir = os.path.dirname(__file__) - - pbl = m.Problem(msh, comm) - - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - - zero = np.zeros(ensemble_size) - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., 1, 0., 1, 0., 1, 0., - ensemble_size) - m.Neumann(pbl, "Surf 1 2", "heat fluxes", 0, zero, 0, zero, 1, p, 0, zero, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Ensemble Convergence Tolerance'] = 0. # 10**(-8) - solverList['Maximum Iterations'] = int(max_iter) - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = use_Prec - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['Write vtk files'] = False - - if use_Prec: - solverList['convert MueLu xml file'] = True - solverList["use xml file"] = True - solverList["MueLu xml file name"] = file_dir + '/prec_1.xml' - - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - u.mkdir_MPI(case_name, comm, rank, size) - os.chdir(case_name) - - if rank == 0: - f = open('msh_size.txt', 'w') - print(len(msh.nodes), file=f) - f.closed - - np.savetxt('E.txt', E) - np.savetxt('p.txt', p) - - slv.start() - - if rank == 0: - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - os.chdir('..') - - -def read_msh(i=1): - comm, rank, size = m.utilities.import_MPI() - - mesh_name = str('1_cube_' + str(i) + '.msh') - - file_dir = os.path.dirname(__file__) - work_dir = os.getcwd() - - if size != 1: - msh = gmsh.MeshLoader(mesh_name, work_dir).execute(myrank=rank) - else: - msh = gmsh.MeshLoader(mesh_name, work_dir).execute() - - return msh - - -def main(): - comm, rank, size = m.utilities.import_MPI() - - args = parseargs() - - os.chdir('MPI_' + str(size)) - work_dir = os.getcwd() - - E_mean = 1. - p_mean = 0.1 - - ensemble_sizes = [1, 8, 16, 32] - - nCx = 9 - nCy = 9 - - N = 100 - tmp = np.logspace(1, 5, N, endpoint=True, dtype=int) - nCzs = tmp - 1 - - i = np.loadtxt(work_dir + '/i.txt', dtype=int) - max_iter = np.loadtxt(work_dir + '/m.txt', dtype=int) - nCz = nCzs[i] - msh = read_msh(i) - nThreads = u.Initialize_Kokkos() - for ensemble_size in ensemble_sizes: - E = E_mean * np.ones(ensemble_size) - p = p_mean * np.ones(ensemble_size) - - directory_case_id = 'test_' + str(i) + '_s_' + str( - ensemble_size) + '_no_prec_m_' + str(max_iter) - model(msh, - E, - p, - ensemble_size, - directory_case_id, - max_iter, - use_Prec=False) - directory_case_id = 'test_' + str(i) + '_s_' + str( - ensemble_size) + '_prec_m_' + str(max_iter) - model(msh, - E, - p, - ensemble_size, - directory_case_id, - max_iter, - use_Prec=True) - - u.Finalize_Kokkos() - - -if __name__ == "__main__": - main() diff --git a/katoptron/thesis/test_4/blake.slurm.sh b/katoptron/thesis/test_4/blake.slurm.sh deleted file mode 100644 index 0a9ac5cf..00000000 --- a/katoptron/thesis/test_4/blake.slurm.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=test_4 -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/test_4.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_HW_SUBSET=24c,1t -export KMP_AFFINITY=compact - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} - -n_MPI=1 - -i_min=1 -i_max=201 - -m_1=10 -m_2=100 -m_3=200 - -nCx=100 -nCy=100 - -base_dir=$(pwd) -geo_file=${base_dir}/katoptron/thesis/test_4/1_cube.geo -workspace_dir_0=${base_dir}/workspace/katoptron_thesis_test_4_1_cube -workspace_dir=${workspace_dir_0}/MPI_${n_MPI} - -if [ ! -d ${workspace_dir_0} ] -then - mkdir ${workspace_dir_0} - mkdir ${workspace_dir} -fi - -if [ ! -d ${workspace_dir} ] -then - mkdir ${workspace_dir} -fi - -for (( i = $i_min; i < $i_max; ++i )); do - nCz=$(( 5*i )) - msh_file=${workspace_dir}/1_cube_${i}.msh - gmsh -3 ${geo_file} -setnumber nCx ${nCx} -setnumber nCy ${nCy} -setnumber nCz ${nCz} -o ${msh_file} -part ${n_MPI} -format msh22 - echo $i &> ${workspace_dir}/i.txt - echo $m_1 &> ${workspace_dir}/m.txt - mpirun -np ${n_MPI} python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py - echo $m_2 &> ${workspace_dir}/m.txt - mpirun -np ${n_MPI} python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py - echo $m_3 &> ${workspace_dir}/m.txt - mpirun -np ${n_MPI} python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py -done \ No newline at end of file diff --git a/katoptron/thesis/test_4/blake_N_1.slurm.sh b/katoptron/thesis/test_4/blake_N_1.slurm.sh deleted file mode 100644 index 337bfeeb..00000000 --- a/katoptron/thesis/test_4/blake_N_1.slurm.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=test_4 -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/test_4.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_HW_SUBSET=24c,1t -export KMP_AFFINITY=compact - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} - -n_MPI=2 - -i_min=1 -i_max=201 - -m_1=10 -m_2=100 -m_3=200 - -nCx=100 -nCy=100 - -base_dir=$(pwd) -geo_file=${base_dir}/katoptron/thesis/test_4/1_cube.geo -workspace_dir_0=${base_dir}/workspace/katoptron_thesis_test_4_1_cube -workspace_dir=${workspace_dir_0}/MPI_${n_MPI} - -if [ ! -d ${workspace_dir_0} ] -then - mkdir ${workspace_dir_0} - mkdir ${workspace_dir} -fi - -if [ ! -d ${workspace_dir} ] -then - mkdir ${workspace_dir} -fi - -for (( i = $i_min; i < $i_max; ++i )); do - nCz=$(( 5*i )) - msh_file=${workspace_dir}/1_cube_${i}.msh - gmsh -3 ${geo_file} -setnumber nCx ${nCx} -setnumber nCy ${nCy} -setnumber nCz ${nCz} -o ${msh_file} -part ${n_MPI} -format msh22 - echo $i &> ${workspace_dir}/i.txt - echo $m_1 &> ${workspace_dir}/m.txt - mpirun -npersocket 1 python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py - echo $m_2 &> ${workspace_dir}/m.txt - mpirun -npersocket 1 python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py - echo $m_3 &> ${workspace_dir}/m.txt - mpirun -npersocket 1 python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py -done diff --git a/katoptron/thesis/test_4/blake_N_2.slurm.sh b/katoptron/thesis/test_4/blake_N_2.slurm.sh deleted file mode 100644 index 96d5b765..00000000 --- a/katoptron/thesis/test_4/blake_N_2.slurm.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=test_4 -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 2 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/test_4.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_HW_SUBSET=24c,1t -export KMP_AFFINITY=compact - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} - -n_MPI=4 - -i_min=1 -i_max=201 - -m_1=10 -m_2=100 -m_3=200 - -nCx=100 -nCy=100 - -base_dir=$(pwd) -geo_file=${base_dir}/katoptron/thesis/test_4/1_cube.geo -workspace_dir_0=${base_dir}/workspace/katoptron_thesis_test_4_1_cube -workspace_dir=${workspace_dir_0}/MPI_${n_MPI} - -if [ ! -d ${workspace_dir_0} ] -then - mkdir ${workspace_dir_0} - mkdir ${workspace_dir} -fi - -if [ ! -d ${workspace_dir} ] -then - mkdir ${workspace_dir} -fi - -for (( i = $i_min; i < $i_max; ++i )); do - nCz=$(( 5*i )) - msh_file=${workspace_dir}/1_cube_${i}.msh - gmsh -3 ${geo_file} -setnumber nCx ${nCx} -setnumber nCy ${nCy} -setnumber nCz ${nCz} -o ${msh_file} -part ${n_MPI} -format msh22 - echo $i &> ${workspace_dir}/i.txt - echo $m_1 &> ${workspace_dir}/m.txt - mpirun -npersocket 1 python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py - echo $m_2 &> ${workspace_dir}/m.txt - mpirun -npersocket 1 python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py - echo $m_3 &> ${workspace_dir}/m.txt - mpirun -npersocket 1 python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py -done diff --git a/katoptron/thesis/test_4/blake_N_4.slurm.sh b/katoptron/thesis/test_4/blake_N_4.slurm.sh deleted file mode 100644 index ae301ecc..00000000 --- a/katoptron/thesis/test_4/blake_N_4.slurm.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=test_4 -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 4 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/test_4.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_HW_SUBSET=24c,1t -export KMP_AFFINITY=compact - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} - -n_MPI=8 - -i_min=1 -i_max=201 - -m_1=10 -m_2=100 -m_3=200 - -nCx=100 -nCy=100 - -base_dir=$(pwd) -geo_file=${base_dir}/katoptron/thesis/test_4/1_cube.geo -workspace_dir_0=${base_dir}/workspace/katoptron_thesis_test_4_1_cube -workspace_dir=${workspace_dir_0}/MPI_${n_MPI} - -if [ ! -d ${workspace_dir_0} ] -then - mkdir ${workspace_dir_0} - mkdir ${workspace_dir} -fi - -if [ ! -d ${workspace_dir} ] -then - mkdir ${workspace_dir} -fi - -for (( i = $i_min; i < $i_max; ++i )); do - nCz=$(( 5*i )) - msh_file=${workspace_dir}/1_cube_${i}.msh - gmsh -3 ${geo_file} -setnumber nCx ${nCx} -setnumber nCy ${nCy} -setnumber nCz ${nCz} -o ${msh_file} -part ${n_MPI} -format msh22 - echo $i &> ${workspace_dir}/i.txt - echo $m_1 &> ${workspace_dir}/m.txt - mpirun -npersocket 1 python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py - echo $m_2 &> ${workspace_dir}/m.txt - mpirun -npersocket 1 python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py - echo $m_3 &> ${workspace_dir}/m.txt - mpirun -npersocket 1 python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py -done diff --git a/katoptron/thesis/test_4/blake_N_8.slurm.sh b/katoptron/thesis/test_4/blake_N_8.slurm.sh deleted file mode 100644 index c361eec1..00000000 --- a/katoptron/thesis/test_4/blake_N_8.slurm.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=test_4 -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 8 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/test_4.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_HW_SUBSET=24c,1t -export KMP_AFFINITY=compact - -export MKL_NUM_THREADS=${OMP_NUM_THREADS} - -n_MPI=16 - -i_min=1 -i_max=201 - -m_1=10 -m_2=100 -m_3=200 - -nCx=100 -nCy=100 - -base_dir=$(pwd) -geo_file=${base_dir}/katoptron/thesis/test_4/1_cube.geo -workspace_dir_0=${base_dir}/workspace/katoptron_thesis_test_4_1_cube -workspace_dir=${workspace_dir_0}/MPI_${n_MPI} - -if [ ! -d ${workspace_dir_0} ] -then - mkdir ${workspace_dir_0} - mkdir ${workspace_dir} -fi - -if [ ! -d ${workspace_dir} ] -then - mkdir ${workspace_dir} -fi - -for (( i = $i_min; i < $i_max; ++i )); do - nCz=$(( 5*i )) - msh_file=${workspace_dir}/1_cube_${i}.msh - gmsh -3 ${geo_file} -setnumber nCx ${nCx} -setnumber nCy ${nCy} -setnumber nCz ${nCz} -o ${msh_file} -part ${n_MPI} -format msh22 - echo $i &> ${workspace_dir}/i.txt - echo $m_1 &> ${workspace_dir}/m.txt - mpirun -npersocket 1 python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py - echo $m_2 &> ${workspace_dir}/m.txt - mpirun -npersocket 1 python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py - echo $m_3 &> ${workspace_dir}/m.txt - mpirun -npersocket 1 python run.py -k ${OMP_NUM_THREADS} katoptron/thesis/test_4/1_cube.py -done diff --git a/katoptron/thesis/test_4/prec.xml b/katoptron/thesis/test_4/prec.xml deleted file mode 100644 index 7fcef90c..00000000 --- a/katoptron/thesis/test_4/prec.xml +++ /dev/null @@ -1,20 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - <Parameter name="max levels" type="int" value="5"/> - <Parameter name="smoother: type" type="string" value="RELAXATION"/> - <ParameterList name="smoother: params"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="5"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - <!-- <Parameter name="relaxation: backward mode" type="bool" value="true"/> --> - </ParameterList> - <Parameter name="coarse: type" type="string" value="Klu"/> - <Parameter name="verbosity" type="string" value="extreme"/> - <Parameter name="multigrid algorithm" type="string" value="unsmoothed"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - <Parameter name="number of equations" type="int" value="3"/> -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/thesis/test_4/prec_1.xml b/katoptron/thesis/test_4/prec_1.xml deleted file mode 100644 index b2bd91f1..00000000 --- a/katoptron/thesis/test_4/prec_1.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="coarse: type" type="string" value="RELAXATION"/> - <ParameterList name="coarse: params"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="5"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - <Parameter name="verbosity" type="string" value="extreme"/> - <Parameter name="number of equations" type="int" value="3"/> -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/thesis/test_5/1_bar.py b/katoptron/thesis/test_5/1_bar.py deleted file mode 100644 index f33abe96..00000000 --- a/katoptron/thesis/test_5/1_bar.py +++ /dev/null @@ -1,220 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from scipy.sparse.linalg import spsolve -from scipy.sparse.linalg import eigs -from scipy.linalg import eig -from scipy.sparse import spdiags -import numpy as np -import matplotlib.pyplot as plt -import katoptron.convergence as c - - -def build_K(n, L, E, A, sym=True): - h = (L / (n - 1)) - diag_data = A * E * ((1 / h**2)) * 2. * np.ones((n, )) - diag_data[0] = 1. - diag_data[-1] = A * E * ((1 / h**2)) * 1. - off_data_1 = A * E * ((1 / h**2)) * (-1) * np.ones((n, )) - if sym: - off_data_1[0:1] = 0. - off_data_2 = A * E * ((1 / h**2)) * (-1) * np.ones((n, )) - off_data_2[0:2] = 0. - - data = np.array([diag_data, off_data_1, off_data_2]) - diags = np.array([0, -1, 1]) - K = spdiags(data, diags, n, n).tocsr() - return K - - -def analytical_eigenfunctions(n, L, E, A, n_eigenfunctions=5): - if n < n_eigenfunctions + 1: - n_eigenfunctions = n - 1 - values = np.zeros((n, )) - vecs = np.zeros((n, n_eigenfunctions)) - - h = (L / (n - 1)) - x = np.linspace(0, L, n) - - c = np.arange(0, n_eigenfunctions, 1) + 0.5 - values = A * E * (c * 3.14 / L)**2 - - for i in range(0, n_eigenfunctions): - vecs[:, i] = np.sin((c[i] * np.pi * x / L)) - norm = np.linalg.norm(vecs[:, i]) - vecs[:, i] /= norm - return values, vecs - - -def numerical_eigenfunctions(n, L, E, A, n_eigenfunctions=5): - if n < n_eigenfunctions + 1: - n_eigenfunctions = n - 1 - K = build_K(n, L, E, A) - - vals, vecs = eig(K.toarray()) - return np.real(vals[0:n_eigenfunctions]), vecs[:, 0:n_eigenfunctions] - - -def omegas_lambdas_nf(n, L, nE, A, nf): - N = len(nE) - norm = 0. - for i in range(0, N): - norm += np.linalg.norm(nf[i])**2 - norm = np.sqrt(norm) - lambdas_all = np.array([]) - omegas_all = np.array([]) - for i in range(0, N): - nf_tmp = (nf[i] / norm) - lambdas, vecs = analytical_eigenfunctions(n, L, nE[i], A, n - 1) - print(vecs) - c = np.dot(vecs.T, nf_tmp) - - omegas = np.zeros((len(c), )) - for i in range(0, len(omegas)): - omegas[i] = np.linalg.norm(c[i])**2 - - lambdas_all = np.append(lambdas_all, lambdas) - omegas_all = np.append(omegas_all, omegas) - - indices = np.argsort(lambdas_all) - lambdas = lambdas_all[indices] - omegas = omegas_all[indices] - - return lambdas, omegas - - -def omegas_lambdas_f(n, L, E, A, f): - lambdas, vecs = analytical_eigenfunctions(n, L, E, A, n - 1) - norm = np.linalg.norm(f) - f_tmp = (f / norm) - c = np.dot(vecs.T, f_tmp) - - omegas = np.zeros((len(c), )) - for i in range(0, len(omegas)): - omegas[i] = np.linalg.norm(c[i])**2 - - return lambdas, omegas - - -def build_f(n, L, lF, F): - h = (L / (n - 1)) - iF = int(np.round((lF / h)) + 1) - f = np.zeros((n, )) - f[iF] = (F / h) - return f - - -def solve_Kf(n, L, lF, F, E, A): - sym = True - - K = build_K(n, L, E, A, sym) - f = build_f(n, L, lF, F) - - u = spsolve(K, f) - return u - - -def write_on_disk(name, res): - i_max = len(res) - for i in range(0, i_max): - if res[i] == 0.: - i_max = i + 1 - break - tmp = np.zeros((i_max, 2)) - tmp[:, 1] = res[0:i_max] - tmp[:, 0] = np.arange(0, i_max) - np.savetxt(name, tmp) - - -def main(): - n = 7 - L = 1. - E_1 = 1. - E_2 = 1.5 - A = 1. - F = 1. - - x = np.linspace(0, L, n) - - f_1 = build_f(n, L, 0.5, F) - f_2 = build_f(n, L, 0.8, F) - - print(f_1) - print(f_2) - - lambdas_11, omegas_11 = omegas_lambdas_f(n, L, E_1, A, f_1) - lambdas_12, omegas_12 = omegas_lambdas_f(n, L, E_1, A, f_2) - - lambdas_21, omegas_21 = omegas_lambdas_f(n, L, E_2, A, f_1) - lambdas_22, omegas_22 = omegas_lambdas_f(n, L, E_2, A, f_2) - - residual_11 = c.compute_convergence_serial_normal(20, n - 1, omegas_11, - lambdas_11) - residual_12 = c.compute_convergence_serial_normal(20, n - 1, omegas_12, - lambdas_12) - residual_21 = c.compute_convergence_serial_normal(20, n - 1, omegas_21, - lambdas_21) - residual_22 = c.compute_convergence_serial_normal(20, n - 1, omegas_22, - lambdas_22) - - lambdas_1, omegas_1 = omegas_lambdas_nf(n, L, [E_1, E_1], A, [f_1, f_2]) - lambdas_2, omegas_2 = omegas_lambdas_nf(n, L, [E_2, E_2], A, [f_1, f_2]) - lambdas_3, omegas_3 = omegas_lambdas_nf(n, L, [E_1, E_2], A, [f_1, f_1]) - lambdas_4, omegas_4 = omegas_lambdas_nf(n, L, [E_1, E_2], A, [f_2, f_2]) - lambdas_5, omegas_5 = omegas_lambdas_nf(n, L, [E_1, E_2], A, [f_1, f_2]) - - residual_1 = c.compute_convergence_serial_normal(20, 2 * (n - 1), omegas_1, - lambdas_1) - residual_2 = c.compute_convergence_serial_normal(20, 2 * (n - 1), omegas_2, - lambdas_2) - residual_3 = c.compute_convergence_serial_normal(20, 2 * (n - 1), omegas_3, - lambdas_3) - residual_4 = c.compute_convergence_serial_normal(20, 2 * (n - 1), omegas_4, - lambdas_4) - residual_5 = c.compute_convergence_serial_normal(20, 2 * (n - 1), omegas_5, - lambdas_5) - - write_on_disk('res_11.txt', residual_11) - write_on_disk('res_12.txt', residual_12) - write_on_disk('res_21.txt', residual_21) - write_on_disk('res_22.txt', residual_22) - write_on_disk('res_1.txt', residual_1) - write_on_disk('res_2.txt', residual_2) - write_on_disk('res_3.txt', residual_3) - write_on_disk('res_4.txt', residual_4) - write_on_disk('res_5.txt', residual_5) - - plt.figure() - plt.semilogy(residual_11) - plt.semilogy(residual_22) - plt.semilogy(residual_1) - ''' - plt.figure() - plt.subplot(221) - plt.plot(lambdas_11, '-*') - plt.subplot(222) - plt.plot(lambdas_12, '-*') - plt.subplot(223) - plt.plot(lambdas_21, '-*') - plt.subplot(224) - plt.plot(lambdas_22, '-*') - plt.figure() - plt.subplot(221) - plt.plot(omegas_11, '-*') - plt.subplot(222) - plt.plot(omegas_12, '-*') - plt.subplot(223) - plt.plot(omegas_21, '-*') - plt.subplot(224) - plt.plot(omegas_22, '-*') - - plt.figure() - plt.plot(lambdas_44, '-*') - plt.figure() - plt.plot(omegas_44, '-*') - ''' - plt.show() - - -if __name__ == "__main__": - main() diff --git a/katoptron/thesis/test_5/laplacian.py b/katoptron/thesis/test_5/laplacian.py deleted file mode 100644 index d64a9e21..00000000 --- a/katoptron/thesis/test_5/laplacian.py +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -from scipy.sparse.linalg import spsolve -from scipy.sparse.linalg import eigs -from scipy.linalg import eig -from scipy.sparse import spdiags -import numpy as np -import matplotlib.pyplot as plt -import katoptron.convergence as c - - -def analytical_eigenvectors(n, kappa): - values = np.zeros((n, )) - vecs = np.zeros((n, n)) - - h = 1. / (n + 1) - - k = np.arange(1, n + 1, 1) - values = 2 * kappa * (1 - np.cos(k * h * np.pi)) - - for i in range(0, n): - vecs[i, :] = np.sin((i + 1) * k * h * np.pi) - - for i in range(0, n): - norm = np.linalg.norm(vecs[:, i]) - vecs[:, i] /= norm - return values, vecs - - -def omegas_lambdas_nf(n, nkappa, nf): - N = len(nkappa) - norm = 0. - for i in range(0, N): - norm += np.linalg.norm(nf[i])**2 - norm = np.sqrt(norm) - lambdas_all = np.array([]) - omegas_all = np.array([]) - for i in range(0, N): - nf_tmp = (nf[i] / norm) - lambdas, vecs = analytical_eigenvectors(n, nkappa[i]) - c = np.dot(vecs.T, nf_tmp) - - omegas = np.zeros((len(c), )) - for i in range(0, len(omegas)): - omegas[i] = np.linalg.norm(c[i])**2 - - lambdas_all = np.append(lambdas_all, lambdas) - omegas_all = np.append(omegas_all, omegas) - - indices = np.argsort(lambdas_all) - lambdas = lambdas_all[indices] - omegas = omegas_all[indices] - - return lambdas, omegas - - -def omegas_lambdas_f(n, kappa, f): - lambdas, vecs = analytical_eigenvectors(n, kappa) - norm = np.linalg.norm(f) - f_tmp = (f / norm) - c = np.dot(vecs.T, f_tmp) - - omegas = np.zeros((len(c), )) - for i in range(0, len(omegas)): - omegas[i] = np.linalg.norm(c[i])**2 - - return lambdas, omegas - - -def write_on_disk(name, res): - i_max = len(res) - for i in range(0, i_max): - if res[i] == 0.: - i_max = i + 1 - break - tmp = np.zeros((i_max, 2)) - tmp[:, 1] = res[0:i_max] - tmp[:, 0] = np.arange(0, i_max) - np.savetxt(name, tmp) - - -def main(): - n = 6 - kappa_1 = 1. - kappa_2 = 1.5 - - f_1 = np.zeros((n, )) - f_2 = np.zeros((n, )) - - f_1[3] = 1. - f_2[-1] = 1. - - print(f_1) - print(f_2) - - lambdas_11, omegas_11 = omegas_lambdas_f(n, kappa_1, f_1) - lambdas_12, omegas_12 = omegas_lambdas_f(n, kappa_1, f_2) - - lambdas_21, omegas_21 = omegas_lambdas_f(n, kappa_2, f_1) - lambdas_22, omegas_22 = omegas_lambdas_f(n, kappa_2, f_2) - - print(np.round(lambdas_11, 3)) - print(np.round(omegas_11, 3)) - - print(np.round(lambdas_12, 3)) - print(np.round(omegas_12, 3)) - - print(np.round(lambdas_21, 3)) - print(np.round(omegas_21, 3)) - - print(np.round(lambdas_22, 3)) - print(np.round(omegas_22, 3)) - - residual_11 = c.compute_convergence_serial_normal(20, n, omegas_11, - lambdas_11) - residual_12 = c.compute_convergence_serial_normal(20, n, omegas_12, - lambdas_12) - residual_21 = c.compute_convergence_serial_normal(20, n, omegas_21, - lambdas_21) - residual_22 = c.compute_convergence_serial_normal(20, n, omegas_22, - lambdas_22) - - lambdas_1, omegas_1 = omegas_lambdas_nf(n, [kappa_1, kappa_1], [f_1, f_2]) - lambdas_2, omegas_2 = omegas_lambdas_nf(n, [kappa_2, kappa_2], [f_1, f_2]) - lambdas_3, omegas_3 = omegas_lambdas_nf(n, [kappa_1, kappa_2], [f_1, f_1]) - lambdas_4, omegas_4 = omegas_lambdas_nf(n, [kappa_1, kappa_2], [f_2, f_2]) - lambdas_5, omegas_5 = omegas_lambdas_nf(n, [kappa_1, kappa_2], [f_1, f_2]) - - residual_1 = c.compute_convergence_serial_normal(20, 2 * n, omegas_1, - lambdas_1) - residual_2 = c.compute_convergence_serial_normal(20, 2 * n, omegas_2, - lambdas_2) - residual_3 = c.compute_convergence_serial_normal(20, 2 * n, omegas_3, - lambdas_3) - residual_4 = c.compute_convergence_serial_normal(20, 2 * n, omegas_4, - lambdas_4) - residual_5 = c.compute_convergence_serial_normal(20, 2 * n, omegas_5, - lambdas_5) - - write_on_disk('res_11.txt', residual_11) - write_on_disk('res_12.txt', residual_12) - write_on_disk('res_21.txt', residual_21) - write_on_disk('res_22.txt', residual_22) - write_on_disk('res_1.txt', residual_1) - write_on_disk('res_2.txt', residual_2) - write_on_disk('res_3.txt', residual_3) - write_on_disk('res_4.txt', residual_4) - write_on_disk('res_5.txt', residual_5) - - print(np.round(lambdas_1, 3)) - print(np.round(omegas_1, 3)) - print(np.round(lambdas_2, 3)) - print(np.round(omegas_2, 3)) - print(np.round(lambdas_3, 3)) - print(np.round(omegas_3, 3)) - print(np.round(lambdas_4, 3)) - print(np.round(omegas_4, 3)) - print(np.round(lambdas_5, 3)) - print(np.round(omegas_5, 3)) - - -if __name__ == "__main__": - main() diff --git a/katoptron/thesis/test_6/1_cube.geo b/katoptron/thesis/test_6/1_cube.geo deleted file mode 100644 index f3bd653d..00000000 --- a/katoptron/thesis/test_6/1_cube.geo +++ /dev/null @@ -1,42 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - -C1 = 10; -//nCx = 3; -//nCy = 4; -//nCz = 5; - -lc = 1; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { C1, 0, 0, lc}; -Point(3) = { C1, 0, C1, lc}; -Point(4) = { 0, 0, C1, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Transfinite Line {1,3} = nCx+1 Using Progression 1; -Transfinite Line {2,4} = nCz+1 Using Progression 1; - -Line Loop(11) = {1,2,3,4}; -Plane Surface(12) = {11}; -Transfinite Surface {12}; -Recombine Surface {12}; - -Extrude {0, C1, 0} -{ - Surface{12}; Layers{nCy}; Recombine; -} - -// physical entities - -Physical Volume("Body 1") = {1}; - -Physical Surface("Surf 1 1") = {-21}; -Physical Surface("Surf 1 2") = {-29}; - -Physical Point("Measure point 1") = {4}; -Physical Point("Measure point 2") = {1}; diff --git a/katoptron/thesis/test_6/1_cube.py b/katoptron/thesis/test_6/1_cube.py deleted file mode 100644 index 32062406..00000000 --- a/katoptron/thesis/test_6/1_cube.py +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import threading -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import katoptron.utilities as u -from PyTrilinos import Teuchos -import shlex -import subprocess -import os -import numpy as np -import tarfile -import glob -from fwk.wutils import parseargs - - -def model(msh, - E, - p, - ensemble_size, - case_name, - work_dir, - max_iter, - comm, - use_Prec=False): - rank = comm.rank - siz = comm.size - file_dir = os.path.dirname(__file__) - - pbl = m.Problem(msh, comm) - - nu = 0.2 * np.ones(ensemble_size) - k = 0.114 - d = 0. - - zero = np.zeros(ensemble_size) - m.Medium(pbl, "Body 1", "test", E, nu, k, d) - - m.Dirichlet(pbl, "Surf 1 1", "Clamped", 1, 0., 1, 0., 1, 0., 1, 0., - ensemble_size) - m.Neumann(pbl, "Surf 1 2", "heat fluxes", 0, zero, 0, zero, 1, p, 0, zero, - ensemble_size) - - solverList = Teuchos.ParameterList() - solverList['Ensemble Convergence Tolerance'] = 0. # 10**(-8) - solverList['Maximum Iterations'] = max_iter - solverList['Verbosity'] = 33 - solverList['Flexible Gmres'] = False - solverList['Output Style'] = 1 - solverList['Output Frequency'] = 1 - - solverList['Use preconditioner'] = use_Prec - - solverList['type'] = "BlockGmres" - solverList['Maximum active set iteration'] = 1 - - solverList['Print Teuchos timers'] = True - solverList['Write vtk files'] = False - - if use_Prec: - solverList['convert MueLu xml file'] = True - solverList["use xml file"] = True - solverList["MueLu xml file name"] = file_dir + '/prec.xml' - - slv = m.IterativeSolver(pbl, solverList, 3, ensemble_size) - - if not os.path.exists(case_name): - os.makedirs(case_name) - os.chdir(case_name) - - if rank == 0: - f = open('msh_size.txt', 'w') - print(len(msh.nodes), file=f) - f.closed - - np.savetxt('E.txt', E) - np.savetxt('p.txt', p) - - slv.start() - - if rank == 0: - f = open('timers.txt', 'w') - print(slv.getTimers(), file=f) - f.closed - - os.chdir(work_dir) - - -def one_model(test_id, ensemble_size, rank, work_dir, msh, E, p, k, max_iter, - comm): - directory_case_id = work_dir + '/test_' + str(test_id) + '_s_' + str( - ensemble_size) + '_rank_' + str(rank) - model(msh, - E, - p, - ensemble_size, - directory_case_id, - work_dir, - k, - max_iter, - comm, - use_Prec=True) - - -def main(): - comm, rank, size = m.utilities.import_MPI() - - group_size = 1 - color = int(np.floor((rank / group_size))) - key = rank - - newcomm = comm.Split(color, key) - - args = parseargs() - work_dir = os.getcwd() - - msh_name = '1_cube.msh' - - E_mean = 1. - p_mean = 0.1 - - ensemble_size = int(os.getenv('ensemble_size', 1)) - test_id = int(os.getenv('test_id', 1)) - max_iter = int(os.getenv('max_iter', 100)) - - msh = gmsh.MeshLoader(msh_name, work_dir).execute() - - E = E_mean * np.ones(ensemble_size) - p = p_mean * np.ones(ensemble_size) - - directory_case_id = 'test_' + str(test_id) + '_s_' + str( - ensemble_size) + '_rank_' + str(rank) - - nThreads = u.Initialize_Kokkos() - model(msh, - E, - p, - ensemble_size, - directory_case_id, - work_dir, - max_iter, - newcomm, - use_Prec=True) - - u.Finalize_Kokkos() - - -if __name__ == "__main__": - main() diff --git a/katoptron/thesis/test_6/blake.slurm.sh b/katoptron/thesis/test_6/blake.slurm.sh deleted file mode 100644 index 803f3cf1..00000000 --- a/katoptron/thesis/test_6/blake.slurm.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash -# Submission script for Blake -#SBATCH --job-name=test_6 -#SBATCH --time=41:00:00 # hh:mm:ss -# -#SBATCH -N 1 -#SBATCH -p blake -# -#SBATCH --comment=test -#SBATCH --output=workspace/test_6.%j.out - -. ~/.bash_profile $SLURM_SUBMIT_HOST - -export MKL_DYNAMIC=TRUE -export OMP_DYNAMIC=FALSE -export OMP_NUM_THREADS=24 -export KMP_HW_SUBSET=24c,1t -export KMP_AFFINITY=compact - -base_dir=$(pwd) -geo_file=${base_dir}/katoptron/thesis/test_6/1_cube.geo -msh_file=${base_dir}/workspace/katoptron_thesis_test_6_1_cube/1_cube.msh - -if [ ! -d ${base_dir}/workspace/katoptron_thesis_test_6_1_cube ] -then - mkdir ${base_dir}/workspace/katoptron_thesis_test_6_1_cube -fi - -workspace/thesis_tests_test_6_1_cube - -gmsh -3 -format msh2 -setnumber nCx 49 -setnumber nCy 49 -setnumber nCz 49 -o ${msh_file} ${geo_file} -format msh22 - -export max_iter=200 - -export test_id=1 -export ensemble_size=1 -export MKL_NUM_THREADS=1 -export OMP_NUM_THREADS=1 -python run.py -k 1 katoptron/thesis/test_6/1_cube.py - -export test_id=2 -export ensemble_size=1 -export MKL_NUM_THREADS=24 -export OMP_NUM_THREADS=24 -python run.py -k 24 katoptron/thesis/test_6/1_cube.py - -export test_id=3 -export ensemble_size=8 -export MKL_NUM_THREADS=24 -export OMP_NUM_THREADS=24 -python run.py -k 24 katoptron/thesis/test_6/1_cube.py - -export test_id=4 -export ensemble_size=1 -export MKL_NUM_THREADS=1 -export OMP_NUM_THREADS=1 -#mpirun -npersocket 1 python run.py -k 1 katoptron/thesis/test_6/1_cube.py -#mpirun --report-bindings --bind-to core --map-by ppr:24:socket:pe=1 python run.py -k 1 katoptron/thesis/test_6/1_cube.py &> log.txt -mpirun --bind-to core --map-by ppr:24:socket:pe=1 python run.py -k 1 katoptron/thesis/test_6/1_cube.py diff --git a/katoptron/thesis/test_6/prec.xml b/katoptron/thesis/test_6/prec.xml deleted file mode 100644 index 7fcef90c..00000000 --- a/katoptron/thesis/test_6/prec.xml +++ /dev/null @@ -1,20 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - <Parameter name="max levels" type="int" value="5"/> - <Parameter name="smoother: type" type="string" value="RELAXATION"/> - <ParameterList name="smoother: params"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="5"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - <!-- <Parameter name="relaxation: backward mode" type="bool" value="true"/> --> - </ParameterList> - <Parameter name="coarse: type" type="string" value="Klu"/> - <Parameter name="verbosity" type="string" value="extreme"/> - <Parameter name="multigrid algorithm" type="string" value="unsmoothed"/> - <Parameter name="tentative: calculate qr" type="bool" value="false"/> - <Parameter name="number of equations" type="int" value="3"/> -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/thesis/test_6/prec_1.xml b/katoptron/thesis/test_6/prec_1.xml deleted file mode 100644 index b2bd91f1..00000000 --- a/katoptron/thesis/test_6/prec_1.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- Define MueLu preconditioner --> -<!-- Note: if you use Tpetra you may have to change it to MueLu-Tpetra --> -<!-- here and above where you set the preconditioner --> -<ParameterList name="MueLu"> - <Parameter name="max levels" type="int" value="1"/> - <Parameter name="coarse: type" type="string" value="RELAXATION"/> - <ParameterList name="coarse: params"> - <Parameter name="relaxation: type" type="string" value="MT Gauss-Seidel"/> - <Parameter name="relaxation: sweeps" type="int" value="5"/> - <Parameter name="relaxation: damping factor" type="double" value="0.9"/> - </ParameterList> - <Parameter name="verbosity" type="string" value="extreme"/> - <Parameter name="number of equations" type="int" value="3"/> -</ParameterList> -<!-- end "MueLu" --> - diff --git a/katoptron/thesis/test_6/speedup.py b/katoptron/thesis/test_6/speedup.py deleted file mode 100644 index 6e1bbaf1..00000000 --- a/katoptron/thesis/test_6/speedup.py +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - - - - -from katoptron.speedup import * -import matplotlib.pyplot as plt -import os - - -def read_timers_all(file_base_dir, querylines, use_waves_timers, - use_teuchos_timers): - - timers = np.zeros((len(querylines), )) - - for k in use_waves_timers: - timers[int(k)] = read_timers(file_base_dir + 'timers.txt', - [querylines[int(k)]])[0] - for k in use_teuchos_timers: - timers[int(k)] = read_teuchos_timers( - file_base_dir + 'teuchos_timers.txt', [querylines[int(k)]])[0] - - return timers - - -def CPU_time_per_one_case(base_dir, - quantiles, - querylines, - use_waves_timers, - use_teuchos_timers, - filename_CPU, - filename_speed_up, - total_id, - write_id, - block_id, - mult=1.): - - timers = read_timers_all(base_dir, querylines, use_waves_timers, - use_teuchos_timers) - - current_timer = timers*mult - - f = open(filename_CPU, 'w') - print(timers.shape, file=f) - - for i in range(0, len(timers)): - print(querylines[i], file=f) - string = '' - if i == total_id: - current_timer[i] -= timers[write_id] - current_timer[i] -= timers[block_id] - - string = string + str(round(current_timer[i], 3)) + ' & ' - print(string, file=f) - print(' ', file=f) - f.closed - - return current_timer - - -def analysis_one_case(directory, - base_dir, - quantiles, - querylines, - use_waves_timers, - use_teuchos_timers, - mult=1.): - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - - current_timer = CPU_time_per_one_case(base_dir, - quantiles, - querylines, - use_waves_timers, - use_teuchos_timers, - 'average_CPU.txt', - 'average_speed_up.txt', - 7, - 8, - 9, - mult=mult) - - os.chdir('..') - return current_timer - - -def main(): - import matplotlib.pyplot as plt - - file_dir = os.path.dirname(__file__) - - quantiles = [0, 0.33, 0.5, 0.66, 1.] - - querylines = [ - 'computeMatrices', - 'MueLu: Hierarchy: Setup (total)', - 'Belos: DGKS[2]: Orthogonalization', - 'Belos: Operation Op*x', - 'Belos: Operation Prec*x', - 'MueLu: Hierarchy: Solve : coarse (level=0)', - 'Belos: PseudoBlockGmresSolMgr total solve time', - 'total', - 'write results', - 'create the block matrix' - ] - use_waves_timers = np.array([0, 7, 8, 9], dtype=int) - use_teuchos_timers = np.array( - [1, 2, 3, 4, 5, 6], - dtype=int) - - base_dir = file_dir + \ - '/../../../workspace/katoptron_thesis_test_6_1_cube/test_1_s_1_rank_0/' - mult = 24 - - directory = 'option_1' - current_timer_1 = analysis_one_case(directory, base_dir, - quantiles, querylines, use_waves_timers, - use_teuchos_timers, mult=mult) - - base_dir = file_dir + \ - '/../../../workspace/katoptron_thesis_test_6_1_cube/test_2_s_1_rank_0/' - mult = 24 - - directory = 'option_2' - current_timer_2 = analysis_one_case(directory, base_dir, - quantiles, querylines, use_waves_timers, - use_teuchos_timers, mult=mult) - - base_dir = file_dir + \ - '/../../../workspace/katoptron_thesis_test_6_1_cube/test_4_s_1_rank_0/' - mult = 1 - - directory = 'option_3' - current_timer_3 = analysis_one_case(directory, base_dir, - quantiles, querylines, use_waves_timers, - use_teuchos_timers, mult=mult) - - base_dir = file_dir + \ - '/../../../workspace/katoptron_thesis_test_6_1_cube/test_3_s_8_rank_0/' - mult = 3 - - directory = 'option_4' - current_timer_4 = analysis_one_case(directory, base_dir, - quantiles, querylines, use_waves_timers, - use_teuchos_timers, mult=mult) - - tmp = np.zeros((len(current_timer_1), 4)) - tmp[:, 0] = current_timer_1 - tmp[:, 1] = current_timer_2 - tmp[:, 2] = current_timer_3 - tmp[:, 3] = current_timer_4 - - np.savetxt('all.txt', tmp, fmt='%1.3f') - - tmp_2 = np.copy(tmp) - - tmp_2[:, 0] /= tmp_2[:, 1] - tmp_2[:, 2] /= tmp_2[:, 1] - tmp_2[:, 3] /= tmp_2[:, 1] - tmp_2[:, 1] /= tmp_2[:, 1] - - speed_up = 1./tmp_2 - - np.savetxt('speed_up.txt', speed_up, fmt='%1.3f') - - -if __name__ == "__main__": - main() diff --git a/katoptron/utilities.py b/katoptron/utilities.py deleted file mode 100644 index fce0a04b..00000000 --- a/katoptron/utilities.py +++ /dev/null @@ -1,786 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- - -import katoptron as m -import tbox -import tbox.gmsh as gmsh -import shlex -import subprocess -import os -import numpy as np -from katoptron.eigenvalues import * - - -def get_gmsh_version(): - tmp = subprocess.check_output(["gmsh", "--version"], - stderr=subprocess.STDOUT) - tmp2 = tmp.decode().split('.') - return int(tmp2[0]), int(tmp2[1]), int(tmp2[2]) - - -def import_MPI(): - try: - import mpi4py.MPI as mpi - comm = mpi.COMM_WORLD - rank = comm.rank - size = comm.size - name = mpi.Get_processor_name() - status = mpi.Status() - print('info: MPI found') - except: - comm = None - rank = 0 - size = 1 - name = "noname" - print('info: MPI not found => MPI disabled') - return comm, rank, size - - -def Initialize_Kokkos(): - from fwk.wutils import parseargs - args = parseargs() - - m.Kokkos_Initialize(args.k) - return args.k - - -def Finalize_Kokkos(): - m.Kokkos_Finalize() - - -def mkdir_MPI(directory, comm, rank, size): - # Create a new directory if rank == 0 - if rank == 0: - if not os.path.exists(directory): - os.makedirs(directory) - - comm.Barrier() - - -def read_mesh_MPI(geo_name, file_dir, work_dir, comm, rank, size, params=None): - base_name = geo_name.partition(".")[0] - geo_type = geo_name.partition(".")[2] - - mesh_name = base_name + '.msh' - partitioned_mesh_name = str(base_name + '_' + str(size) + '.msh') - - if geo_type == "geo" and rank == 0: - if params is not None: - gmsh.MeshLoader(geo_name, file_dir).execute(**params) - else: - gmsh.MeshLoader(geo_name, file_dir).execute() - - if size > 1: - comm.Barrier() - - msh_dir = work_dir - if geo_type == "msh": - msh_dir = file_dir - - if size == 1: - msh = gmsh.MeshLoader(mesh_name, msh_dir).execute() - else: - if rank == 0: - # Get gmsh version: - gmsh_major_version, gmsh_minor_version, gmsh_patch_version = get_gmsh_version() - - command_line = 'gmsh -3 ' + msh_dir + '/' + mesh_name + ' -o ' + \ - work_dir + '/' + partitioned_mesh_name + \ - ' -part ' + str(size) + ' -format msh22' - - # If gmsh is newer than gmsh 4, we have to specify that we want the ghost elements. - if gmsh_major_version >= 4: - command_line += ' -part_ghosts' - print(command_line) - tmp = shlex.split(command_line) - fileout = open('gmsh.log', 'w') - p = subprocess.Popen(tmp, - stdin=subprocess.PIPE, - stdout=fileout, - stderr=fileout, - env=os.environ, - shell=False, - close_fds=True) - retcode = p.wait() - - comm.Barrier() - - msh = gmsh.MeshLoader(partitioned_mesh_name, - work_dir).execute(myrank=rank) - - return msh, mesh_name, partitioned_mesh_name - - -def read_mesh_to_fuse(filename, - filename_output, - file_dir, - work_dir, - comm, - rank, - size, - index_nodes=0, - index_elements=0, - index_tags=0): - msh, mesh_name, partitioned_mesh_name = read_mesh_MPI( - filename, file_dir, work_dir, comm, rank, size) - - gmshWriter = tbox.GmshExport(msh) - n_nodes = index_nodes + len(msh.nodes) - if index_nodes != 0: - for n in msh.nodes: - n.no = n.no + index_nodes - n_elems = index_elements + len(msh.elems) - if index_elements != 0: - for e in msh.elems: - e.no = e.no + index_elements - n_ptags = index_tags + len(msh.ptags) - if index_tags != 0: - for p in msh.ptags: - if msh.ptags[p].no > 1: - msh.ptags[p].no = msh.ptags[p].no + index_tags - gmshWriter.save(filename_output) - - return n_nodes, n_elems, n_ptags - - -def fuse_meshes(filename1, filename12, filename2, filename22, filename_output, - file_dir, work_dir, comm, rank, size): - - if rank == 0: - n_nodes, n_elems, n_ptags = read_mesh_to_fuse(filename1, filename12, - file_dir, work_dir, None, - 0, 1) - n_nodes, n_elems, n_ptags = read_mesh_to_fuse(filename2, filename22, - file_dir, work_dir, None, - 0, 1, n_nodes, n_elems, - n_ptags) - - command_line = 'gmsh -3 ' + work_dir + '/' + filename12 + '.msh' + ' ' + work_dir + \ - '/' + filename22 + '.msh' + ' -o ' + work_dir + '/' + \ - filename_output + '.msh' + ' -format msh22' - tmp = shlex.split(command_line) - fileout = open('gmsh.log', 'w') - p = subprocess.Popen(tmp, - stdin=subprocess.PIPE, - stdout=fileout, - stderr=fileout, - env=os.environ, - shell=False, - close_fds=True) - retcode = p.wait() - - if size > 1: - partitioned_mesh_name = str(filename_output + '_' + str(size) + - '.msh') - if rank == 0: - command_line = 'gmsh -3 ' + work_dir + '/' + filename_output + '.msh' + ' -o ' + work_dir + '/' + \ - partitioned_mesh_name + ' -part ' + \ - str(size) + ' -format msh22' - tmp = shlex.split(command_line) - fileout = open('gmsh.log', 'w') - p = subprocess.Popen(tmp, - stdin=subprocess.PIPE, - stdout=fileout, - stderr=fileout, - env=os.environ, - shell=False, - close_fds=True) - retcode = p.wait() - comm.Barrier() - msh = gmsh.MeshLoader(partitioned_mesh_name, - work_dir).execute(myrank=rank) - else: - msh = gmsh.MeshLoader(filename_output + '.msh', work_dir).execute() - - return msh - - -def replace_strings(file_in, file_out, old_strings, new_strings): - with open(file_in, 'r') as file: - filedata = file.read() - - for i in range(0, len(old_strings)): - filedata = filedata.replace(old_strings[i], new_strings[i]) - - with open(file_out, 'w') as file: - file.write(filedata) - - -def print_nodes(msh, tag_names, rank): - - for tag_name in tag_names: - print('Rank ' + str(rank) + ' Name tag: ' + tag_name + ' Elements: ' + - str(len(msh.ntags[tag_name].elems))) - for el in msh.ntags[tag_name].elems: - print(el) - print('Nodes: ') - print('{0:2s} {1:3s}'.format('no', 'row')) - for el in msh.ntags[tag_name].elems: - for n1 in el.nodes: - print('{0:2d} {1:3d}'.format(n1.no, n1.row)) - - -def extract(msh, - tag_name, - DOFperNode, - which_pos, - which_dof, - ensemble_size, - name_sol="x_mm.txt", - lot_of_data=False): - import numpy as np - - nodeslist = [] - #tag_name = "Center of cross section" - for el in msh.ntags[tag_name].elems: - for n1 in el.nodes: - nodeslist.append(n1.no) - - nodes = list(set(nodeslist)) - - x = np.empty(np.shape(nodes)) - x_sorted = np.empty(np.shape(nodes)) - nodes_sorted = np.empty(np.shape(nodes), dtype=int) - sol = np.empty([len(nodes), ensemble_size]) - for i in range(0, len(x)): - pos = msh.nodes[int(nodes[i])-1].pos - x[i] = pos[which_pos] - - indices = np.argsort(x) - for i in range(0, len(x)): - x_sorted[i] = x[indices[i]] - nodes_sorted[i] = nodes[indices[i]] - - with open(name_sol) as fp: - for i, line in enumerate(fp): - if i == 1: - tmp = np.array(line.split()) - break - ndofs = tmp[0] - - x = x_sorted - nodes = nodes_sorted - - if which_dof == 3: - indices = nodes - 1 - elif DOFperNode == 4: - indices = (ndofs / 4) + 3 * (nodes - 1) + int(which_dof) - else: - indices = 3 * (nodes - 1) + int(which_dof) - - if lot_of_data: - sol_all = m.eigenvalues.read_mm(name_sol, is_sparse=False) - if ensemble_size == 1: - sol = sol_all[indices] - else: - sol = sol_all[indices, :] - - else: - with open(name_sol) as fp: - for i, line in enumerate(fp): - for j in range(0, len(indices)): - if i - 2 == indices[j]: - sol[j, :] = np.array(line.split()) - - return x, sol - - -def extract_2D(msh, tag_name, DOFperNode, which_dof, ensemble_size, name_sol): - # work only with triangel 2D now - comm, rank, size = import_MPI() - - from PyTrilinos import Teuchos - import numpy as np - - nodeslist = [] - #tag_name = "Center of cross section" - for el in msh.ntags[tag_name].elems: - for n1 in el.nodes: - nodeslist.append(n1.no - 1) - nodes = np.array(nodeslist) - nodes = np.sort(nodes) - - i = 1 - while i < len(nodes): - if nodes[i] == nodes[i - 1]: - nodes = np.delete(nodes, i) - else: - i = i + 1 - - nnodes = len(msh.nodes) - global_to_local = -1 * np.ones((nnodes, ), dtype='int32') - - for i in range(0, len(nodes)): - global_to_local[nodes[i]] = i - - ntri = len(msh.ntags[tag_name].elems) - tri = np.zeros((ntri, 3), dtype='uint32') - - for i in range(0, ntri): - tri[i, 0] = global_to_local[msh.ntags[tag_name].elems[i].nodes[0].no - - 1] - tri[i, 1] = global_to_local[msh.ntags[tag_name].elems[i].nodes[1].no - - 1] - tri[i, 2] = global_to_local[msh.ntags[tag_name].elems[i].nodes[2].no - - 1] - - x = np.empty(np.shape(nodes)) - y = np.empty(np.shape(nodes)) - z = np.empty(np.shape(nodes)) - - sol = np.empty(np.shape(nodes)) - - x_sorted = np.empty(np.shape(nodes)) - nodes_sorted = np.empty(np.shape(nodes)) - - #sol = np.empty([len(nodes), ensemble_size]) - - for i in range(0, len(x)): - pos = msh.nodes[nodes[i]].pos - x[i] = pos[0] - y[i] = pos[1] - z[i] = pos[2] - - from scipy import io - - #sol = x - if ensemble_size == 1: - sol_full = io.mmread(name_sol) - for j in range(0, len(x)): - sol[j] = sol_full[DOFperNode * (nodes[j]) + which_dof] - - return x, y, z, tri, sol - - -def extract_2D_all(msh, tag_name, DOFperNode, ensemble_size, name_sol): - # work only with triangel 2D now - comm, rank, size = import_MPI() - - from PyTrilinos import Teuchos - import numpy as np - - nodeslist = [] - for el in msh.ntags[tag_name].elems: - for n1 in el.nodes: - nodeslist.append(n1.no - 1) - nodes = np.array(nodeslist) - nodes = np.sort(nodes) - - ntri = len(msh.ntags[tag_name].elems) - tri = np.zeros((ntri, 3), dtype='uint32') - - for i in range(0, ntri): - tri[i, 0] = msh.ntags[tag_name].elems[i].nodes[0].no - 1 - tri[i, 1] = msh.ntags[tag_name].elems[i].nodes[1].no - 1 - tri[i, 2] = msh.ntags[tag_name].elems[i].nodes[2].no - 1 - - i = 0 - while i < len(nodes): - if nodes[i] == nodes[i - 1]: - nodes = np.delete(nodes, i) - else: - i = i + 1 - - x = np.empty(np.shape(nodes)) - y = np.empty(np.shape(nodes)) - z = np.empty(np.shape(nodes)) - - x_sorted = np.empty(np.shape(nodes)) - nodes_sorted = np.empty(np.shape(nodes)) - - sol = np.empty([len(nodes), DOFperNode]) - - for i in range(0, len(x)): - pos = msh.nodes[nodes[i]].pos - x[i] = pos[0] - y[i] = pos[1] - z[i] = pos[2] - - from scipy import io - - if ensemble_size == 1: - sol_full = io.mmread(name_sol) - for j in range(0, len(x)): - for k in range(0, DOFperNode): - sol[j, k] = sol_full[DOFperNode * (nodes[j]) + k] - - return x, y, z, tri, sol - - -def compute_cross_and_theta(vec1, vec2): - from numpy import linalg as LA - - norm1 = LA.norm(vec1) - norm2 = LA.norm(vec2) - cross = np.cross(vec1, vec2) - dot = np.dot(vec1, vec2) - theta = np.arccos((dot / (norm1 * norm2))) - - return cross, theta - - -def rotation_matrix(axis, theta): - """ - Return the rotation matrix associated with counterclockwise rotation about - the given axis by theta radians. - """ - axis = np.asarray(axis) - axis = (axis / np.sqrt(np.dot(axis, axis))) - a = np.cos((theta / 2.0)) - b, c, d = -axis * np.sin((theta / 2.0)) - aa, bb, cc, dd = a * a, b * b, c * c, d * d - bc, ad, ac, ab, bd, cd = b * c, a * d, a * c, a * b, b * d, c * d - return np.array([[aa + bb - cc - dd, 2 * (bc + ad), 2 * (bd - ac)], - [2 * (bc - ad), aa + cc - bb - dd, 2 * (cd + ab)], - [2 * (bd + ac), 2 * (cd - ab), aa + dd - bb - cc]]) - - -def extract_2D_all_rotated(msh, tag_name, DOFperNode, ensemble_size, name_sol, - axis_nodes_id): - - x, y, z, tri, sol = extract_2D_all(msh, tag_name, DOFperNode, - ensemble_size, name_sol) - - x_r = np.empty(np.shape(x)) - y_r = np.empty(np.shape(x)) - z_r = np.empty(np.shape(x)) - sol_r = np.empty(np.shape(sol)) - - pos_OX_1 = msh.nodes[axis_nodes_id[0]].pos - pos_OX_2 = msh.nodes[axis_nodes_id[1]].pos - - vec_OX = np.array([pos_OX_2[0]-pos_OX_1[0], pos_OX_2[1] - - pos_OX_1[1], pos_OX_2[2]-pos_OX_1[2]]) - - OX_ref = np.array([1, 0, 0]) - OY_ref = np.array([0, 1, 0]) - - cross_prod_OX, theta_X = compute_cross_and_theta(vec_OX, OX_ref) - rot_X = rotation_matrix(cross_prod_OX, theta_X) - - for i in range(0, len(x)): - tmp = np.dot(rot_X, [x[i], y[i], z[i]]) - x_r[i] = tmp[0] - y_r[i] = tmp[1] - z_r[i] = tmp[2] - - tmp = np.dot(rot_X, [sol[i, 0], sol[i, 1], sol[i, 2]]) - - sol_r[i, 0] = tmp[0] - sol_r[i, 1] = tmp[1] - sol_r[i, 2] = tmp[2] - - sol_r[:, 3] = sol[:, 3] - - if cross_prod_OX[1] != 0: - ''' - vec_OY = np.dot(rot_X, vec_OY) - print vec_OY - vec_OY[0] = 0 - print vec_OY - cross_prod_OY, theta_Y = compute_cross_and_theta(vec_OY, OY_ref) - ''' - cross_prod_OY = np.array([1, 0, 0]) - max_i_z = np.argmax(z_r) - min_i_z = np.argmin(z_r) - - dz = z_r[max_i_z] - z_r[min_i_z] - dy = y_r[max_i_z] - y_r[min_i_z] - - theta_Y = np.arctan((-dz / dy)) - - rot_Y = rotation_matrix(cross_prod_OY, theta_Y) - - for i in range(0, len(x)): - tmp = np.dot(rot_Y, [x_r[i], y_r[i], z_r[i]]) - x_r[i] = tmp[0] - y_r[i] = tmp[1] - z_r[i] = tmp[2] - - tmp = np.dot(rot_Y, [sol_r[i, 0], sol_r[i, 1], sol_r[i, 2]]) - - sol_r[i, 0] = tmp[0] - sol_r[i, 1] = tmp[1] - sol_r[i, 2] = tmp[2] - - return x_r, y_r, z_r, tri, sol_r - - -def compute_Zernike(x, y, z, tri, dz, n_Zernike, center_pos): - from numpy import linalg as LA - - n_nodes = len(x) - n_tri = np.size(tri, 0) - - Zernike_coeff = np.zeros((n_Zernike, )) - - Zernike_functions = np.zeros((n_nodes, n_Zernike)) - - rho = np.empty(np.shape(x)) - theta = np.empty(np.shape(x)) - - for i in range(0, len(x)): - rho[i] = LA.norm(np.array([x[i], y[i]]) - center_pos) - if x[i] >= center_pos[0] and y[i] >= center_pos[1]: - theta[i] = np.arctan( - ((y[i] - center_pos[1]) / (x[i] - center_pos[0]))) - elif y[i] >= center_pos[1] or x[i] < center_pos[0]: - theta[i] = np.arctan( - ((y[i] - center_pos[1]) / - (x[i] - center_pos[0]))) + np.pi - else: - theta[i] = np.arctan( - ((y[i] - center_pos[1]) / - (x[i] - center_pos[0]))) + 2 * np.pi - - max_rho = max(rho) - rho = (rho / max_rho) - - if n_Zernike >= 1: - Zernike_functions[:, 0] = 1. - if n_Zernike >= 2: - v_max = np.amax(2 * rho * np.cos(theta)) - Zernike_functions[:, 1] = 2 * rho * np.cos(theta) / v_max - if n_Zernike >= 3: - v_max = np.amax(2 * rho * np.sin(theta)) - Zernike_functions[:, 2] = 2 * rho * np.sin(theta) / v_max - if n_Zernike >= 4: - v_max = np.amax(np.sqrt(3) * (2 * np.power(rho, 2) - 1)) - Zernike_functions[:, 3] = np.sqrt(3) * (2 * np.power(rho, 2) - - 1) / v_max - if n_Zernike >= 5: - Zernike_functions[:, 4] = np.sqrt(6) * np.power(rho, 2) * np.sin( - 2 * theta) - if n_Zernike >= 6: - Zernike_functions[:, 5] = np.sqrt(6) * np.power(rho, 2) * np.cos( - 2 * theta) - if n_Zernike >= 7: - Zernike_functions[:, 6] = np.sqrt(8) * (3 * np.power(rho, 3) - - 2 * rho) * np.sin(theta) - if n_Zernike >= 8: - Zernike_functions[:, 7] = np.sqrt(8) * (3 * np.power(rho, 3) - - 2 * rho) * np.cos(theta) - if n_Zernike >= 9: - Zernike_functions[:, 8] = np.sqrt(8) * np.power(rho, 3) * np.sin( - 3 * theta) - if n_Zernike >= 10: - Zernike_functions[:, 9] = np.sqrt(8) * np.power(rho, 3) * np.cos( - 3 * theta) - - W = np.zeros((n_nodes, n_nodes)) - - for i in range(0, n_tri): - cross = np.cross( - np.array([ - x[tri[i, 1]] - x[tri[i, 0]], y[tri[i, 1]] - y[tri[i, 0]], - z[tri[i, 1]] - z[tri[i, 0]] - ]), - np.array([ - x[tri[i, 2]] - x[tri[i, 0]], y[tri[i, 2]] - y[tri[i, 0]], - z[tri[i, 2]] - z[tri[i, 0]] - ])) - area = (LA.norm(cross) / 6) # area per node of the triangle - - for j in range(0, 3): - W[tri[i, j], tri[i, j]] = W[tri[i, j], tri[i, j]] + area - - TMP_Z = np.dot(np.transpose(Zernike_functions), W) - rhs_Z = np.dot(TMP_Z, dz) - - A_Z = np.dot(TMP_Z, Zernike_functions) - - Zernike_coeff = np.linalg.solve(A_Z, rhs_Z) - - return Zernike_coeff, Zernike_functions, theta, rho - - -def compute_RBM_Curvature_Irreg(x, y, z, tri, dz, unit, center_pos): - from numpy import linalg as LA - - n_nodes = len(x) - n_tri = np.size(tri, 0) - - RBM_Curvature_Irreg_coeff = np.zeros((4, )) - - RBM_Curvature_Irreg_functions = np.zeros((n_nodes, 4)) - - if unit == "m": - x = x * 1000 - y = y * 1000 - z = z * 1000 - dz = dz * 1000 - center_pos = center_pos * 1000 - - Zernike_coeff, Zernike_functions, theta, rho = compute_Zernike( - x, y, z, tri, dz, 4, center_pos) - dz_residual = dz - Zernike_coeff[ - 0] * Zernike_functions[:, 0] - Zernike_coeff[ - 1] * Zernike_functions[:, 1] - Zernike_coeff[ - 2] * Zernike_functions[:, 2] - Zernike_coeff[ - 3] * Zernike_functions[:, 3] - - optical_coefficients = np.zeros((5, 1)).flatten() - # piston [mm] - optical_coefficients[0] = Zernike_coeff[0] - index = np.argmax(Zernike_functions[:, 1]) - optical_coefficients[1] = np.arctan( - -Zernike_coeff[1] * - ((Zernike_functions[index, 1] / - (x[index] - center_pos[0])))) # rot y [rad] - index = np.argmax(Zernike_functions[:, 2]) - optical_coefficients[2] = np.arctan( - -Zernike_coeff[2] * - ((Zernike_functions[index, 2] / - (y[index] - center_pos[1])))) # rot x [rad] - optical_coefficients[3] = Zernike_coeff[3] * \ - (np.amax(Zernike_functions[:, 3])-np.amin(Zernike_functions[:, 3])) - optical_coefficients[4] = np.amax(dz_residual) - np.amin(dz_residual) - - return optical_coefficients, dz_residual - - -def compute_RBM_Curvature_Irreg_Sequential(x, y, z, tri, dz, unit, center_pos): - from numpy import linalg as LA - - n_nodes = len(x) - n_tri = np.size(tri, 0) - - RBM_Curvature_Irreg_coeff = np.zeros((4, )) - - RBM_Curvature_Irreg_functions = np.zeros((n_nodes, 4)) - - if unit == "m": - x = x * 1000 - y = y * 1000 - z = z * 1000 - dz = dz * 1000 - center_pos = center_pos * 1000 - - rho = np.empty(np.shape(x)) - - for i in range(0, len(x)): - rho[i] = LA.norm(np.array([x[i], y[i]]) - center_pos) - - RBM_Curvature_Irreg_functions[:, 0] = 1. - RBM_Curvature_Irreg_functions[:, 1] = y - center_pos[1] - RBM_Curvature_Irreg_functions[:, 2] = x - center_pos[0] - RBM_Curvature_Irreg_functions[:, 3] = np.power(rho, 2) - - W = np.zeros((n_nodes, n_nodes)) - - print("mean dz") - print(np.mean(dz)) - - for i in range(0, n_tri): - cross = np.cross( - np.array([ - x[tri[i, 1]] - x[tri[i, 0]], y[tri[i, 1]] - y[tri[i, 0]], - z[tri[i, 1]] - z[tri[i, 0]] - ]), - np.array([ - x[tri[i, 2]] - x[tri[i, 0]], y[tri[i, 2]] - y[tri[i, 0]], - z[tri[i, 2]] - z[tri[i, 0]] - ])) - area = (LA.norm(cross) / 6) # area per node of the triangle - - for j in range(0, 3): - W[tri[i, j], tri[i, j]] = W[tri[i, j], tri[i, j]] + area - - for i in range(0, 4): - TMP_Z = np.dot(np.transpose(RBM_Curvature_Irreg_functions[:, i]), W) - rhs_Z = np.dot(TMP_Z, dz) - - A_Z = np.dot(TMP_Z, RBM_Curvature_Irreg_functions[:, i]) - - RBM_Curvature_Irreg_coeff[i] = (rhs_Z / A_Z) - dz = dz - RBM_Curvature_Irreg_coeff[i] * \ - RBM_Curvature_Irreg_functions[:, i] - - optical_coefficients = np.zeros((5, )) - optical_coefficients[0] = RBM_Curvature_Irreg_coeff[0] # piston - optical_coefficients[1] = np.arctan(RBM_Curvature_Irreg_coeff[1]) - optical_coefficients[2] = np.arctan(RBM_Curvature_Irreg_coeff[2]) - optical_coefficients[3] = RBM_Curvature_Irreg_coeff[3] * \ - np.amax(RBM_Curvature_Irreg_functions[:, 3]) - optical_coefficients[4] = np.amax(dz) - np.amin(dz) - - print("optical_coefficients") - print(optical_coefficients) - - return RBM_Curvature_Irreg_coeff, RBM_Curvature_Irreg_functions, dz - - -def check_optical_tolerance(optical_tolerance, unit): - passed = 1 - max_angle = 0.00175 - if unit == "mm": - max_fringe = 0.0316 - max_translation = 2 - elif unit == "m": - max_fringe = 0.0000316 - max_translation = 0.002 - - if np.absolute(optical_tolerance[0]) >= max_translation: - print("translation") - passed = 0 - - if np.absolute(optical_tolerance[1]) >= max_angle: - print("rotation x") - passed = 0 - - if np.absolute(optical_tolerance[2]) >= max_angle: - print("rotation y") - passed = 0 - - if optical_tolerance[3] >= max_fringe: - print("curvature") - passed = 0 - - if optical_tolerance[4] >= max_fringe: - print("irregularity") - passed = 0 - - return passed - - -def check_optical_tolerance_Zernike(Zernike_coeff, Zernike_functions, dz, - unit): - - passed = 1 - max_angle = 0.00175 - if unit == "mm": - max_fringe = 0.0316 - max_translation = 2 - elif unit == "m": - max_fringe = 0.0000316 - max_translation = 0.002 - - if np.absolute(Zernike_coeff[0]) >= max_translation: - print("translation") - passed = 0 - - if np.absolute(Zernike_coeff[1]) >= max_angle: - print("rotation x") - passed = 0 - - if np.absolute(Zernike_coeff[2]) >= max_angle: - print("rotation y") - passed = 0 - - tmp = np.dot(Zernike_coeff[3], Zernike_functions[:, 3]) - - if np.absolute(max(tmp) - min(tmp)) >= max_fringe: - print("curvature") - passed = 0 - - tmp = dz - np.dot(Zernike_coeff[0], Zernike_functions[:, 0]) - np.dot(Zernike_coeff[1], Zernike_functions[:, 1]) - \ - np.dot(Zernike_coeff[2], Zernike_functions[:, 2]) - \ - np.dot(Zernike_coeff[3], Zernike_functions[:, 3]) - - if np.absolute(max(tmp) - min(tmp)) >= max_fringe: - print(max(tmp)) - print(min(tmp)) - print("irregularity") - passed = 0 - - return passed diff --git a/katoptron/viewer.py b/katoptron/viewer.py deleted file mode 100644 index 13211f6e..00000000 --- a/katoptron/viewer.py +++ /dev/null @@ -1,689 +0,0 @@ -# -*- coding: utf-8; -*- - -import sys -import katoptron as m -import tbox as tb -import vtk -from PyQt4 import QtCore, QtGui -from vtk.qt4.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor - - -class MeshViewer(QtGui.QWidget, m.DisplayHook): - - app = QtGui.QApplication(sys.argv) - - """ - Qt GUI for visu. the output - """ - - def __init__(self, pbl, slv, msh, elev=-90., azim=0.): - # super(MeshViewer, self).__init__() # a eclaircir... marche p� - m.DisplayHook.__init__(self) - QtGui.QWidget.__init__(self) - - slv.setGUI(self) - - self.ensemble_size = slv.minimum_ensemble_size - - self.msh = msh - self.solver = slv - - self.running = 'init' - self.vmin = 0.0 - self.vmax = 0.0 - - self.elev = elev - self.azim = azim - - print(" ") - print("starting MeshViewer init...") - - self.__setupGUI() - self.__setupVTK() - - self.app.connect(self.app, QtCore.SIGNAL( - "lastWindowClosed()"), self.app, QtCore.SLOT("quit()")) - self.show() - # [Linux] faire ca le plus tard possible (apres self.show!!) - self.vtkwidget.Initialize() - print("MeshViewer ready.") - - def closeEvent(self, event): - # self.scheme.stopit=True - self.running = 'running' # sort de "while self.running=='pause'" - print("GUI killed!") - QtGui.QWidget.closeEvent(self, event) - - def start(self): - self.app.exec_() - - def __setupGUI(self): - - self.setWindowTitle("MeshViewer") - self.resize(800, 600) - - # vtk window - - self.vtkwidget = QVTKRenderWindowInteractor( - self) # "self" sinon, rien ne s'affiche - - self.vtkwidget.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, - QtGui.QSizePolicy.Expanding)) - self.vtkwidget.setMinimumSize(QtCore.QSize(300, 300)) - self.vtkwidget.setSizePolicy( - QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) - - # self.vtkwidget.Initialize() # plante sous Linux!! - - self.renderer = vtk.vtkRenderer() - self.renderer.SetBackground(1.0, 1.0, 1.0) - self.vtkwidget.GetRenderWindow().AddRenderer(self.renderer) - - style = vtk.vtkInteractorStyleTrackballCamera() - self.vtkwidget.SetInteractorStyle(style) - - hbox = QtGui.QHBoxLayout() - self.setLayout(hbox) - hbox.addWidget(self.vtkwidget) - - pan = QtGui.QFrame() - pan.setMaximumSize(QtCore.QSize(200, 999999)) - hbox.addWidget(pan) - # hbox.setMargin(0) # sinon vtkwidget degouline en bas - # hbox.setSpacing(0) # sinon vtkwidget clignote sur le c�t� - - vbox = QtGui.QVBoxLayout() - pan.setLayout(vbox) - - self.startBut = QtGui.QPushButton(self.tr("Start")) - #self.connect(self.startBut, QtCore.SIGNAL("clicked()"), self.disableStart) - self.connect(self.startBut, QtCore.SIGNAL("clicked()"), self.startSlot) - vbox.addWidget(self.startBut) - - groupBox = QtGui.QGroupBox("Range") - gbox = QtGui.QGridLayout() - label = QtGui.QLabel("min") - gbox.addWidget(label, 0, 0) - self.vminlinedt = QtGui.QLineEdit('%f' % self.vmin) - self.connect(self.vminlinedt, QtCore.SIGNAL( - "editingFinished()"), self.updateTCoords) - - gbox.addWidget(self.vminlinedt, 0, 1) - label = QtGui.QLabel("max") - gbox.addWidget(label, 1, 0) - self.vmaxlinedt = QtGui.QLineEdit('%f' % self.vmax) - self.connect(self.vmaxlinedt, QtCore.SIGNAL( - "editingFinished()"), self.updateTCoords) - gbox.addWidget(self.vmaxlinedt, 1, 1) - groupBox.setLayout(gbox) - vbox.addWidget(groupBox) - - groupBox = QtGui.QGroupBox("Samples") - self.samplesList = QtGui.QListWidget() - for i in range(self.ensemble_size): - item = QtGui.QListWidgetItem("Sample %i" % i) - self.samplesList.addItem(item) - gbox = QtGui.QVBoxLayout() - groupBox.setLayout(gbox) - gbox.addWidget(self.samplesList) - self.samplesList.currentItemChanged.connect(self.on_item_changed) - self.samplesList.itemClicked.connect(self.Clicked) - vbox.addWidget(groupBox) - - groupBox = QtGui.QGroupBox("Infos") - self.steplabel = QtGui.QLabel("Active set iteration #") - #self.timelabel = QtGui.QLabel("Time step = 0") - gbox = QtGui.QVBoxLayout() - groupBox.setLayout(gbox) - gbox.addWidget(self.steplabel) - # gbox.addWidget(self.timelabel) - vbox.addWidget(groupBox) - - verbchk = QtGui.QCheckBox("verbose") - self.connect(verbchk, QtCore.SIGNAL( - "stateChanged(int)"), self.verboseSlot) - vbox.addWidget(verbchk) - - vbox.addStretch(1) - - def verboseSlot(self, state): - self.scheme.verbose = state - if not state: - print("<verbose=OFF>") - - def startSlot(self): - if self.running == 'init': - self.startBut.setText("Pause") # on demarre et on affiche "pause" - self.running = 'running' - self.solver.start() - # for j in range(0,101): - # self.updatePos2(j) - self.startBut.setText("Quit") - self.running = 'quit' - elif self.running == 'running': # on stoppe et on affiche 'continue" - self.running = 'pause' - self.startBut.setText("Continue") - while self.running == 'pause': - self.app.processEvents(QtCore.QEventLoop.WaitForMoreEvents) - elif self.running == 'pause': - self.running = 'running' - self.startBut.setText("Pause") - elif self.running == 'quit': - self.app.quit() - """ - def disableStart(self): - self.startBut.setDisabled(True) - """ - - def __setupVTK(self): - - self.__createUgrid() - - # mesh - self.mesh = Mesh(self.ugrid) - self.renderer.AddActor(self.mesh.actor) - - # grid - self.grid = Grid(self.ugrid) - self.renderer.AddViewProp(self.grid.actor) - - # scalarbar - self.scalarbar = ScalarBar(self.mesh.lut) - self.renderer.AddViewProp(self.scalarbar.actor) - - self.resetCamera() - - def resetCamera(self): - self.renderer.ResetCamera() - cam1 = self.renderer.GetActiveCamera() - # 3D - if 1: - elev = self.elev - cam1.Elevation(elev) - if elev > 90: - cam1.SetViewUp(0, -1, 0) - else: - cam1.SetViewUp(0, 1, 0) - cam1.Azimuth(self.azim) - # 2D - else: - cam1.Elevation(0) - cam1.SetViewUp(0, 1, 0) - cam1.Azimuth(0) - self.renderer.ResetCameraClippingRange() - - def display(self, nt, t, u): - """ C++ => python callback - """ - print("[GUI] nt=", nt, "t=", t) - - # update data at points - for i in range(self.msh.nodes.size()): - self.scalars.SetValue(i, u[i]) - self.scalars.Modified() - - # update texture coords - #vmin, vmax = self.scalars.GetValueRange() - # vmin=-0.01 - # vmax=0.01 - - self.updateTCoords() - - def on_item_changed(self, curr, prev): - str_list = str(curr.text()) - for s in str_list.split(): - if s.isdigit(): - nt = int(s) - self.display_sample(nt, 0) - - def Clicked(self, item): - str_list = str(item.text()) - for s in str_list.split(): - if s.isdigit(): - nt = int(s) - self.display_sample(nt, 0) - - def display_sample(self, nt, t): - if None == self.polydata.GetPointData().GetArray("Values "+str(nt)): - print("Please, before selecting solution to display, run the simulation.") - else: - pos_x = self.polydata.GetPointData().GetArray("Positions x "+str(nt)) - pos_y = self.polydata.GetPointData().GetArray("Positions y "+str(nt)) - pos_z = self.polydata.GetPointData().GetArray("Positions z "+str(nt)) - - values = self.polydata.GetPointData().GetArray("Values "+str(nt)) - - current_min = self.vmin - current_max = self.vmax - for i in range(self.msh.nodes.size()): - self.points.SetPoint(i, pos_x.GetValue( - i), pos_y.GetValue(i), pos_z.GetValue(i)) - value = values.GetValue(i) - self.scalars.SetValue(i, value) - if value < current_min: - current_min = value - elif value > current_max: - current_max = value - - # mesh - self.renderer.RemoveViewProp(self.mesh.actor) - self.mesh = Mesh(self.ugrid) - self.renderer.AddActor(self.mesh.actor) - - # grid - self.renderer.RemoveViewProp(self.grid.actor) - self.grid = Grid(self.ugrid) - self.renderer.AddViewProp(self.grid.actor) - - self.vmin = current_min - self.vmax = current_max - current_max = self.scalars.GetRange() - - self.mesh.updateTcoords(self.vmin, self.vmax) - - # scalarbar - self.renderer.RemoveViewProp(self.scalarbar.actor) - self.scalarbar = ScalarBar(self.mesh.lut) - self.renderer.AddViewProp(self.scalarbar.actor) - - self.render() - - def display(self, nt, ast, u_x, u_y, u_z, u_norm): - """ C++ => python callback - """ - self.steplabel.setText("Active set iteration # "+str(int(ast))) - - if True: # None == self.polydata.GetPointData().GetArray("Values "+str(nt)): - - pos_x = vtk.vtkDoubleArray() - pos_y = vtk.vtkDoubleArray() - pos_z = vtk.vtkDoubleArray() - - values = vtk.vtkDoubleArray() - - pos_x.SetName("Positions x "+str(nt)) - pos_y.SetName("Positions y "+str(nt)) - pos_z.SetName("Positions z "+str(nt)) - - values.SetName("Values "+str(nt)) - - current_min = self.vmin - current_max = self.vmax - for i in range(self.msh.nodes.size()): - p = self.msh.nodes[i].pos - self.points.SetPoint( - i, p[0]+u_x[i], p[1]+u_y[i], p[2]+u_z[i]) - - pos_x.InsertNextValue(p[0]+u_x[i]) - pos_y.InsertNextValue(p[1]+u_y[i]) - pos_z.InsertNextValue(p[2]+u_z[i]) - values.InsertNextValue(u_norm[i]) - - self.polydata.GetPointData().AddArray(pos_x) - self.polydata.GetPointData().AddArray(pos_y) - self.polydata.GetPointData().AddArray(pos_z) - - self.polydata.GetPointData().AddArray(values) - - value = u_norm[i] - self.scalars.SetValue(i, value) - if value < current_min: - current_min = value - elif value > current_max: - current_max = value - - else: - pos_x = self.polydata.GetPointData().GetArray("Positions x "+str(nt)) - pos_y = self.polydata.GetPointData().GetArray("Positions y "+str(nt)) - pos_z = self.polydata.GetPointData().GetArray("Positions z "+str(nt)) - - values = self.polydata.GetPointData().GetArray("Values "+str(nt)) - - current_min = self.vmin - current_max = self.vmax - for i in range(self.msh.nodes.size()): - self.points.SetPoint(i, pos_x.GetValue( - i), pos_y.GetValue(i), pos_z.GetValue(i)) - value = values.GetValue(i) - self.scalars.SetValue(i, value) - if value < current_min: - current_min = value - elif value > current_max: - current_max = value - - # mesh - self.renderer.RemoveViewProp(self.mesh.actor) - self.mesh = Mesh(self.ugrid) - self.renderer.AddActor(self.mesh.actor) - - # grid - self.renderer.RemoveViewProp(self.grid.actor) - self.grid = Grid(self.ugrid) - self.renderer.AddViewProp(self.grid.actor) - - self.vmin = current_min - self.vmax = current_max - current_max = self.scalars.GetRange() - - self.mesh.updateTcoords(self.vmin, self.vmax) - - # scalarbar - self.renderer.RemoveViewProp(self.scalarbar.actor) - self.scalarbar = ScalarBar(self.mesh.lut) - self.renderer.AddViewProp(self.scalarbar.actor) - - self.render() - - def updateTCoords(self): - try: - self.vmin = float(self.vminlinedt.text()) - self.vmax = float(self.vmaxlinedt.text()) - except: - pass - - self.mesh.updateTcoords(self.vmin, self.vmax) - self.render() - - def ragequit(self): - print("rage quit!") - self.scheme.stopit = True - self.app.quit() - - #raise Exception('GUI killed!') - - def render(self): - # draw the scene - self.vtkwidget.Render() - self.app.processEvents() - - def refresh(self): - #print "[GUI] refresh" - self.app.processEvents() - - def __createUgrid(self): - print('creating vtkUnstructuredGrid...') - self.ugrid = vtk.vtkUnstructuredGrid() - self.points = vtk.vtkPoints() - self.ugrid.SetPoints(self.points) - - self.polydata = vtk.vtkPolyData() - - self.scalars = vtk.vtkFloatArray() - self.scalars.SetNumberOfComponents(1) - self.ugrid.GetPointData().SetScalars(self.scalars) - - # points / data - for i in range(self.msh.nodes.size()): - p = self.msh.nodes[i].pos - self.points.InsertPoint(i, p[0], p[1], p[2]) - #val = p.x()*p.x()+p.y()*p.y()+p.z()*p.z() - val = 0.0 - self.scalars.InsertNextValue(val) - - for i in range(self.msh.elems.size()): - e = self.msh.elems[i] - n = e.nodes - # hexa - if e.type() == tb.EL_HEX8: - hexa = vtk.vtkHexahedron() - ids = hexa.GetPointIds() - for j in range(8): - ids.SetId(j, n[j].no-1) - self.ugrid.InsertNextCell(hexa.GetCellType(), ids) - # tetra - elif e.type() == tb.EL_TETRA4: - tetra = vtk.vtkTetra() - ids = tetra.GetPointIds() - for j in range(4): - ids.SetId(j, n[j].no-1) - self.ugrid.InsertNextCell(tetra.GetCellType(), ids) - print(self.ugrid.GetNumberOfPoints(), 'points and', - self.ugrid.GetNumberOfCells(), 'cells converted') - - def writeXML(self, name='mesh.vtu'): - writer = vtk.vtkXMLUnstructuredGridWriter() - compressor = vtk.vtkZLibDataCompressor() - writer.SetCompressor(compressor) - writer.SetDataModeToAscii() - # writer.SetInputConnection(self.producer.GetOutputPort()) - # if vtk.VTK_MAJOR_VERSION <= 5: - # writer.SetInput(self.ugrid) - # else: - writer.SetInputData(self.ugrid) - writer.SetFileName(name) - writer.Write() - - def write(self, name='mesh.vtk'): - writer = vtk.vtkUnstructuredGridWriter() - writer.SetFileName(name) - writer.SetFileTypeToASCII() - if vtk.VTK_MAJOR_VERSION <= 5: - writer.SetInput(self.ugrid) - else: - writer.SetInputData(self.ugrid) - writer.Write() - - def updatePos(self): - #print self.points.GetPoint(1) - #print self.scalars.GetValue(1) - - current_min = 1000 - current_max = -1000 - for i in range(self.msh.nodes.size()): - p = self.msh.nodes[i].pos - self.points.SetPoint(i, p[0]+p[2], p[1], p[2]) - value = p[0] - self.scalars.SetValue(i, value) - if value < current_min: - current_min = value - elif value > current_max: - current_max = value - #print self.points.GetPoint(1) - #print self.scalars.GetValue(1) - #print self.ugrid.GetPoint(1) - - # mesh - self.mesh = Mesh(self.ugrid) - self.renderer.AddActor(self.mesh.actor) - - # grid - self.grid = Grid(self.ugrid) - self.renderer.AddViewProp(self.grid.actor) - - self.vmin = current_min - self.vmax = current_max - current_max = self.scalars.GetRange() - - print(self.vmin) - print(self.vmax) - - self.mesh.updateTcoords(self.vmin, self.vmax) - - # scalarbar - self.renderer.RemoveViewProp(self.scalarbar.actor) - self.scalarbar = ScalarBar(self.mesh.lut) - self.renderer.AddViewProp(self.scalarbar.actor) - - self.render() - - def updatePos2(self, j): - import numpy as np - - current_min = self.vmin - current_max = self.vmax - for i in range(self.msh.nodes.size()): - p = self.msh.nodes[i].pos - value = 100*np.sin(2*np.pi*j/25)*np.sin(0.5*np.pi*p[0]/500) - self.points.SetPoint(i, p[0], p[1], p[2]+value) - self.scalars.SetValue(i, value) - if value < current_min: - current_min = value - elif value > current_max: - current_max = value - - # mesh - self.renderer.RemoveViewProp(self.mesh.actor) - self.mesh = Mesh(self.ugrid) - self.renderer.AddActor(self.mesh.actor) - - # grid - self.renderer.RemoveViewProp(self.grid.actor) - self.grid = Grid(self.ugrid) - self.renderer.AddViewProp(self.grid.actor) - - self.vmin = current_min - self.vmax = current_max - current_max = self.scalars.GetRange() - - self.mesh.updateTcoords(self.vmin, self.vmax) - - # scalarbar - self.renderer.RemoveViewProp(self.scalarbar.actor) - self.scalarbar = ScalarBar(self.mesh.lut) - self.renderer.AddViewProp(self.scalarbar.actor) - - self.render() - - -class Mesh: - def __init__(self, ugrid): - - self.ugrid = ugrid - - # compatibility vtk 5/6 => use a trivial producer - #self.producer = vtk.vtkTrivialProducer() - # self.producer.SetOutput(self.ugrid) # le double producer (dans Mesh/Grid) ne marche pas sous Qt 4 => faire un objet dataset - - self.__createTexture() - self.__createTcoords() - vmin, vmax = self.ugrid.GetPointData().GetScalars().GetValueRange() - self.updateTcoords(vmin, vmax) - - self.mapper = vtk.vtkDataSetMapper() - # self.mapper.SetInputConnection(self.producer.GetOutputPort()) - if vtk.VTK_MAJOR_VERSION <= 5: - self.mapper.SetInput(ugrid) - else: - self.mapper.SetInputData(ugrid) - if vtk.VTK_MAJOR_VERSION <= 7: - self.mapper.ImmediateModeRenderingOff() - self.mapper.SetResolveCoincidentTopologyToPolygonOffset() - self.mapper.ScalarVisibilityOff() - - self.actor = vtk.vtkActor() - self.actor.SetMapper(self.mapper) - self.actor.SetTexture(self.texture) - - def __createTcoords(self): - self.tcoords = vtk.vtkFloatArray() - self.tcoords.SetNumberOfComponents(2) - self.tcoords.Resize( - self.ugrid.GetPointData().GetScalars().GetNumberOfTuples()) - self.ugrid.GetPointData().SetTCoords(self.tcoords) - - def updateTcoords(self, vmin, vmax): - #print 'vmin=',vmin,' vmax=',vmax - if vmin == vmax: - dist = 1.0 - else: - dist = vmax-vmin - thr = 1. / 256. - scalars = self.ugrid.GetPointData().GetScalars() - for i in range(scalars.GetNumberOfTuples()): - val = scalars.GetTuple1(i) - tc = (val-vmin) / dist - if(tc < thr): - tc = thr - if(tc > 1.0-thr): - tc = 1.0-thr - self.tcoords.InsertTuple2(i, tc, tc) - - self.lut.SetTableRange(vmin, vmax) # utile pour la scalarbar seulement - self.lut.Build() - - def __createTexture(self): - # lookup table - # (utilisée 1x au demarrage pour la texture) - # (puis pour la scalarbar) - self.lut = vtk.vtkLookupTable() - self.lut.SetNumberOfColors(16) - self.lut.SetHueRange(0.667, 0.) - # valeurs bidons -> pas d'infl sur la texture - self.lut.SetTableRange(0.0, 1.0) - self.lut.Build() - - self.texture = vtk.vtkTexture() - dim = self.lut.GetNumberOfTableValues() - img = vtk.vtkImageData() - img.SetDimensions(dim, dim, 1) - - if vtk.VTK_MAJOR_VERSION <= 5: - img.SetScalarTypeToUnsignedChar() - img.SetNumberOfScalarComponents(3) - img.AllocateScalars() - else: - img.AllocateScalars(vtk.VTK_UNSIGNED_CHAR, 3) - - for i in range(dim): - ci = self.lut.GetTableValue(i) - for k in range(3): - img.SetScalarComponentFromDouble(i, i, 0, k, ci[k]*255) - if vtk.VTK_MAJOR_VERSION <= 5: - self.texture.SetInput(img) - else: - self.texture.SetInputData(img) - - if 0: # --display texture using vtkImageViewer2 (DEBUG) - imageViewer = vtk.vtkImageViewer2() - if vtk.VTK_MAJOR_VERSION <= 5: - imageViewer.SetInput(img) - else: - imageViewer.SetInputData(img) - renderWindowInteractor = vtk.vtkRenderWindowInteractor() - imageViewer.SetupInteractor(renderWindowInteractor) - imageViewer.Render() - imageViewer.GetRenderer().ResetCamera() - imageViewer.Render() - renderWindowInteractor.Start() - - -class ScalarBar: - def __init__(self, lut): - tprop = vtk.vtkTextProperty() - tprop.SetColor(0, 0, 0) - tprop.SetFontFamilyToTimes() - - self.actor = vtk.vtkScalarBarActor() - self.actor.SetLookupTable(lut) - self.actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedViewport() - self.actor.GetPositionCoordinate().SetValue(0.1, 0.05) - self.actor.SetOrientationToHorizontal() - self.actor.SetWidth(0.8) - self.actor.SetHeight(0.1) - self.actor.SetLabelTextProperty(tprop) - - -class Grid: - def __init__(self, ugrid): - # compatibility vtk 5/6 => use a trivial producer - #self.producer = vtk.vtkTrivialProducer() - # self.producer.SetOutput(ugrid) # le double producer (dans Mesh/Grid) ne marche pas sous Qt 4 => faire un objet dataset - - self.mapper = vtk.vtkDataSetMapper() - if vtk.VTK_MAJOR_VERSION <= 7: - self.mapper.ImmediateModeRenderingOff() - self.mapper.SetResolveCoincidentTopologyToPolygonOffset() - self.mapper.ScalarVisibilityOff() - # self.mapper.SetInputConnection(self.producer.GetOutputPort()) - if vtk.VTK_MAJOR_VERSION <= 5: - self.mapper.SetInput(ugrid) - else: - self.mapper.SetInputData(ugrid) - self.actor = vtk.vtkActor() - - self.actor.GetProperty().SetRepresentationToWireframe() - self.actor.GetProperty().SetColor(0., 0., 0.) - self.actor.GetProperty().SetAmbient(1.0) - self.actor.GetProperty().SetDiffuse(0.0) - self.actor.GetProperty().SetSpecular(0.0) - self.actor.SetMapper(self.mapper) diff --git a/run.py b/run.py deleted file mode 100755 index e2ca260b..00000000 --- a/run.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf8 -*- -# test encoding: à -é-è-ô-ï-€ - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Calls fwk.wutils.run to execute a script as if waves was installed - -def main(): - import os.path, sys - # adds fwk/tbox to the python path - thisdir = os.path.split(os.path.abspath(__file__))[0] - fwkdir = os.path.abspath(os.path.join(thisdir, 'ext', 'amfe')) - if not os.path.isdir(fwkdir): - raise Exception('waves/ext/amfe not found!\n') - sys.path.append(fwkdir) - # adds "." to the pythonpath - sys.path.append(thisdir) - - import fwk.wutils as wu - wu.run() - -if __name__ == "__main__": - main() diff --git a/scripts/devenv-mingw.bat b/scripts/devenv-mingw.bat deleted file mode 100644 index cb5b9e6e..00000000 --- a/scripts/devenv-mingw.bat +++ /dev/null @@ -1,29 +0,0 @@ -@echo off - -echo setting MinGW environment - -set INCLUDE=c:\local\include -set INCLUDE=%INCLUDE%;C:\local\OpenBLAS-v0.2.14-Win32\include -set INCLUDE=%INCLUDE%;C:\local\zlib-1.2.8\include -set INCLUDE=%INCLUDE%;C:\local\MUMPS\include - -::set LIB=c:\local\lib - - -set PATH=c:\MinGW\bin -set PATH=%PATH%;C:\MinGW\msys\1.0\bin -set PATH=%PATH%;C:\local\tbb43_20150424oss\build\windows_ia32_gcc_mingw4.8.1_debug -set PATH=%PATH%;C:\local\tbb43_20150424oss\build\windows_ia32_gcc_mingw4.8.1_release -set PATH=%PATH%;C:\local\gmsh-2.9.3-Windows -set PATH=%PATH%;C:\local\swigwin-2.0.12 -set PATH=%PATH%;C:\local\OpenBLAS-v0.2.14-Win32\bin -set PATH=%PATH%;C:\local\qt-4.8.7\bin -set PATH=%PATH%;C:\Python27 -set PATH=%PATH%;C:\local\vtk-5.10.1\bin -set PATH=%PATH%;C:\local\zlib-1.2.8\bin -set PATH=%PATH%;c:\local\bin -set PATH=%PATH%;c:\local\MUMPS\bin -set PATH=%PATH%;C:\Program Files\CMake\bin -set PATH=%PATH%;C:\Program Files\TortoiseSVN\bin - -%comspec% diff --git a/scripts/devenv-vs2019.bat b/scripts/devenv-vs2019.bat deleted file mode 100644 index c4088178..00000000 --- a/scripts/devenv-vs2019.bat +++ /dev/null @@ -1,10 +0,0 @@ -@echo off -:: command line for MSVC build (Visual Studio 2019) - -set PATH=%PATH%;%MYLOCAL%\swig -set INCLUDE=%MYLOCAL%\include;%MYLOCAL%\MUMPS\include;%MYLOCAL%\eigen -set LIB=%MYLOCAL%\MUMPS\lib - -call "C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\mkl\bin\mklvars.bat" intel64 vs2019 -call "C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\tbb\bin\tbbvars.bat" intel64 vs2019 -%comspec% /K ""C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat" amd64" diff --git a/tlnos/CMakeLists.txt b/tlnos/CMakeLists.txt deleted file mode 100644 index 0ba56aca..00000000 --- a/tlnos/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ - - -ADD_SUBDIRECTORY( src ) -ADD_SUBDIRECTORY( _src ) - -MACRO_AddTest(${CMAKE_CURRENT_SOURCE_DIR}/tests) - - diff --git a/tlnos/__init__.py b/tlnos/__init__.py deleted file mode 100644 index 099551fb..00000000 --- a/tlnos/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# tlnos MODULE initialization file - -import fwk -import tbox -from tlnosw import * diff --git a/tlnos/_src/CMakeLists.txt b/tlnos/_src/CMakeLists.txt deleted file mode 100644 index 32cc0790..00000000 --- a/tlnos/_src/CMakeLists.txt +++ /dev/null @@ -1,46 +0,0 @@ -# CMake input file of the SWIG wrapper around "tlnosw.so" - -INCLUDE(${SWIG_USE_FILE}) - -INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) - -FILE(GLOB SRCS *.h *.cpp *.inl *.swg) -FILE(GLOB ISRCS *.i) - -SET(CMAKE_SWIG_FLAGS "") -SET_SOURCE_FILES_PROPERTIES(${ISRCS} PROPERTIES CPLUSPLUS ON) - -SET(SWINCFLAGS --I${PROJECT_SOURCE_DIR}/tlnos/src --I${PROJECT_SOURCE_DIR}/ext/amfe/tbox/src --I${PROJECT_SOURCE_DIR}/ext/amfe/tbox/_src --I${PROJECT_SOURCE_DIR}/ext/amfe/fwk/src --I${PROJECT_SOURCE_DIR}/ext/amfe/fwk/_src -) -SET_SOURCE_FILES_PROPERTIES(${ISRCS} PROPERTIES SWIG_FLAGS "${SWINCFLAGS}") - -if (${CMAKE_VERSION} VERSION_LESS "3.8.0") - SWIG_ADD_MODULE(tlnosw python ${ISRCS} ${SRCS}) -else() - SWIG_ADD_LIBRARY(tlnosw LANGUAGE python SOURCES ${ISRCS} ${SRCS}) -endif() -MACRO_DebugPostfix(_tlnosw) - -# -- Search for Trilinos -FIND_PACKAGE(Trilinos REQUIRED) - -INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/tlnos/src - ${PROJECT_SOURCE_DIR}/ext/amfe/tbox/src - ${PROJECT_SOURCE_DIR}/ext/amfe/fwk/src - ${PROJECT_SOURCE_DIR}/ext/amfe/fwk/_src - ${PROJECT_SOURCE_DIR}/ext/amfe/tbox/_src - ${Trilinos_INCLUDE_DIRS} - ${Trilinos_TPL_INCLUDE_DIRS} - ${MPI_INCLUDE_PATH}) - -SWIG_LINK_LIBRARIES(tlnosw - tlnos tbox fwk ${Trilinos_LIBRARIES} ${Trilinos_TPL_LIBRARIES} ${PYTHON_LIBRARIES} -) - -INSTALL(FILES ${CMAKE_SWIG_OUTDIR}/tlnosw.py DESTINATION ${CMAKE_INSTALL_PREFIX}) -INSTALL(TARGETS _tlnosw DESTINATION ${CMAKE_INSTALL_PREFIX}) diff --git a/tlnos/_src/tlnosw.i b/tlnos/_src/tlnosw.i deleted file mode 100644 index abba5b89..00000000 --- a/tlnos/_src/tlnosw.i +++ /dev/null @@ -1,53 +0,0 @@ -// SWIG input file of the 'tlnos' module - -%feature("autodoc","1"); - -%module(docstring= -"'tlnosw' module: tests of Trilinos library -(c) ULg - A&M", -directors="1", -threads="1" -) tlnosw -%{ - -#include <string> -#include <sstream> -#include <typeinfo> -#include "tlnos.h" - -#include "wExample1.h" -#include "wExample2.h" -//#include "wExample3.h" -#include "wExample4.h" -#include "wExample5.h" -#include "wExample6.h" -//#include "wExample7.h" -#include "wExample8.h" -#include "wExample9.h" -#include "wExample10.h" - -#include "fwkw.h" -#include "tboxw.h" - -%} - -%include "fwkw.swg" - -// ----------- MODULES UTILISES ------------ -%import "fwkw.i" -%import "tboxw.i" - -// ----------- TLNOS CLASSES ---------------- -%include "tlnos.h" - - -%include "wExample1.h" -%include "wExample2.h" -//%include "wExample3.h" -%include "wExample4.h" -%include "wExample5.h" -%include "wExample6.h" -//%include "wExample7.h" -%include "wExample8.h" -%include "wExample9.h" -%include "wExample10.h" diff --git a/tlnos/broken/example3.py b/tlnos/broken/example3.py deleted file mode 100755 index d887609b..00000000 --- a/tlnos/broken/example3.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- -# runs the basic demo of Trilinos -# trilinos-12.6.1-Source/demos/buildAgainstTrilinos - -import fwk.wutils as wu -import tlnos - -def main(**d): - expl = tlnos.Example3() - expl.execute() - -if __name__ == "__main__": - main() - diff --git a/tlnos/broken/example5.py b/tlnos/broken/example5.py deleted file mode 100755 index 69d6d7cb..00000000 --- a/tlnos/broken/example5.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- -# runs the basic demo of Trilinos -# trilinos-12.6.1-Source/demos/buildAgainstTrilinos - -import fwk.wutils as wu -import tlnos - -def main(**d): - expl = tlnos.Example5() # [RB] missing file "TwoSquares.grid" - expl.execute() - -if __name__ == "__main__": - main() - diff --git a/tlnos/broken/example6.py b/tlnos/broken/example6.py deleted file mode 100755 index 8816b0ce..00000000 --- a/tlnos/broken/example6.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- -# runs the basic demo of Trilinos -# trilinos-12.6.1-Source/demos/buildAgainstTrilinos - -import fwk.wutils as wu -import tlnos - -def main(**d): - expl = tlnos.Example6() # [RB] missing file "TwoSquares.grid" - expl.execute() - -if __name__ == "__main__": - main() - diff --git a/tlnos/broken/example7.py b/tlnos/broken/example7.py deleted file mode 100755 index c011606a..00000000 --- a/tlnos/broken/example7.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- -# runs the basic demo of Trilinos -# trilinos-12.6.1-Source/demos/buildAgainstTrilinos - -import fwk.wutils as wu -import tlnos - -def main(**d): - expl = tlnos.Example7() - expl.execute() - -if __name__ == "__main__": - main() - diff --git a/tlnos/broken/example8.py b/tlnos/broken/example8.py deleted file mode 100755 index f1f175e0..00000000 --- a/tlnos/broken/example8.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- -# runs the basic demo of Trilinos -# trilinos-12.6.1-Source/demos/buildAgainstTrilinos - -import fwk.wutils as wu -import tlnos - -def main(**d): - expl = tlnos.Example8() # [RB] missing file "TwoSquaresDirichlet.grid" - expl.execute() - -if __name__ == "__main__": - main() - diff --git a/tlnos/broken/example9.py b/tlnos/broken/example9.py deleted file mode 100755 index dbb9b08e..00000000 --- a/tlnos/broken/example9.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- -# runs the basic demo of Trilinos -# trilinos-12.6.1-Source/demos/buildAgainstTrilinos - -import fwk.wutils as wu -import tlnos - -def main(**d): - expl = tlnos.Example9() # [RB] missing file "TwoSquaresDirichlet.grid" - expl.execute() - -if __name__ == "__main__": - main() - diff --git a/tlnos/src/CMakeLists.txt b/tlnos/src/CMakeLists.txt deleted file mode 100644 index ca02962e..00000000 --- a/tlnos/src/CMakeLists.txt +++ /dev/null @@ -1,80 +0,0 @@ -# CMake input file of tlnos.so - -FILE(GLOB SRCS *.h *.cpp *.inl *.hpp) -ADD_LIBRARY(tlnos SHARED ${SRCS}) -MACRO_DebugPostfix(tlnos) - -# -- Search for Trilinos -FIND_PACKAGE(Trilinos REQUIRED) - -set (_VERB 1) # set to 1 for debugging -IF(_VERB) - MESSAGE("\nFound Trilinos! Here are the details: ") - MESSAGE(" Trilinos_DIR = ${Trilinos_DIR}") - MESSAGE(" Trilinos_VERSION = ${Trilinos_VERSION}") - MESSAGE(" Trilinos_PACKAGE_LIST = ${Trilinos_PACKAGE_LIST}") - MESSAGE(" Trilinos_LIBRARIES = ${Trilinos_LIBRARIES}") - MESSAGE(" Trilinos_INCLUDE_DIRS = ${Trilinos_INCLUDE_DIRS}") - MESSAGE(" Trilinos_LIBRARY_DIRS = ${Trilinos_LIBRARY_DIRS}") - MESSAGE(" Trilinos_TPL_LIST = ${Trilinos_TPL_LIST}") - MESSAGE(" Trilinos_TPL_INCLUDE_DIRS = ${Trilinos_TPL_INCLUDE_DIRS}") - MESSAGE(" Trilinos_TPL_LIBRARIES = ${Trilinos_TPL_LIBRARIES}") - MESSAGE(" Trilinos_TPL_LIBRARY_DIRS = ${Trilinos_TPL_LIBRARY_DIRS}") - MESSAGE(" Trilinos_BUILD_SHARED_LIBS = ${Trilinos_BUILD_SHARED_LIBS}") - MESSAGE("End of Trilinos details\n") -ENDIF() - -# MPI check -LIST(FIND Trilinos_TPL_LIST MPI MPI_List_ID) -IF (MPI_List_ID GREATER -1) - MESSAGE("-- Checking if MPI is enabled in Trilinos: MPI ENABLED") - SET(MYAPP_MPI TRUE) - ADD_DEFINITIONS(-DMYAPP_MPI) -ELSE() - MESSAGE("-- Checking if MPI is enabled in Trilinos: MPI NOT ENABLED") - SET(MYAPP_MPI FALSE) -ENDIF() - -# Set optional dependency in MyApp on Epetra package: -# this toggles code within #ifdef MYAPP_EPETRA -LIST(FIND Trilinos_PACKAGE_LIST Epetra Epetra_List_ID) -IF (Epetra_List_ID GREATER -1) - ADD_DEFINITIONS(-DMYAPP_EPETRA) - MESSAGE("-- Looking for Epetra: -- found, compiling with -DMYAPP_EPETRA") - SET(MYAPP_EPETRA TRUE) -ELSE() - MESSAGE("-- Looking for Epetra: -- not found.") - SET(MYAPP_EPETRA FALSE) -ENDIF() - -# -------------------------------------------------------------- -# Finds MPI (including MSMPI) -# -------------------------------------------------------------- -if(WIN32) - FIND_PATH(MPI_INCLUDE_PATH NAMES mpi.h HINTS "$ENV{MSMPI_INC}") - if("${CMAKE_SIZEOF_VOID_P}" EQUAL 8) - set(MS_MPI_ARCH_DIR x64) - find_library(MPI_LIBRARIES msmpi PATHS "$ENV{MSMPI_LIB64}") - else() - set(MS_MPI_ARCH_DIR x86) - find_library(MPI_LIBRARIES msmpi PATHS "$ENV{MSMPI_LIB32}") - endif() -else() - find_package(MPI REQUIRED) - # intel mpi (mpi.h doit etre inclus avant stdio.h) - # ou definir ces 2 macros - ADD_DEFINITIONS(-DMPICH_IGNORE_CXX_SEEK -DMPICH_SKIP_MPICXX) -endif() -# -------------------------------------------------------------- - -INCLUDE_DIRECTORIES ( ${PROJECT_SOURCE_DIR}/tbox/src - ${PROJECT_SOURCE_DIR}/fwk/src - ${Trilinos_INCLUDE_DIRS} - ${Trilinos_TPL_INCLUDE_DIRS} - ${MPI_INCLUDE_PATH}) - -LINK_DIRECTORIES (${Trilinos_LIBRARY_DIRS} ${Trilinos_TPL_LIBRARY_DIRS}) - -TARGET_LINK_LIBRARIES(tlnos tbox fwk ${Trilinos_LIBRARIES} ${Trilinos_TPL_LIBRARIES} ${MPI_LIBRARIES}) - -INSTALL(TARGETS tlnos DESTINATION ${CMAKE_INSTALL_PREFIX}) diff --git a/tlnos/src/Example_BCStrategy_Dirichlet_Constant.hpp b/tlnos/src/Example_BCStrategy_Dirichlet_Constant.hpp deleted file mode 100644 index dded2612..00000000 --- a/tlnos/src/Example_BCStrategy_Dirichlet_Constant.hpp +++ /dev/null @@ -1,81 +0,0 @@ -// @HEADER -// *********************************************************************** -// -// Panzer: A partial differential equation assembly -// engine for strongly coupled complex multiphysics systems -// Copyright (2011) Sandia Corporation -// -// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, -// the U.S. Government retains certain rights in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and -// Eric C. Cyr (eccyr@sandia.gov) -// *********************************************************************** -// @HEADER - -#ifndef __Example_BC_Dirichlet_Constant_hpp__ -#define __Example_BC_Dirichlet_Constant_hpp__ - -#include <vector> -#include <string> - -#include "Teuchos_RCP.hpp" -#include "Panzer_BCStrategy_Dirichlet_DefaultImpl.hpp" -#include "Panzer_Traits.hpp" -#include "Panzer_PureBasis.hpp" -#include "Phalanx_FieldManager.hpp" - -namespace Example -{ - -template <typename EvalT> -class BCStrategy_Dirichlet_Constant : public panzer::BCStrategy_Dirichlet_DefaultImpl<EvalT> -{ -public: - BCStrategy_Dirichlet_Constant(const panzer::BC &bc, const Teuchos::RCP<panzer::GlobalData> &global_data); - - void setup(const panzer::PhysicsBlock &side_pb, - const Teuchos::ParameterList &user_data); - - void buildAndRegisterEvaluators(PHX::FieldManager<panzer::Traits> &fm, - const panzer::PhysicsBlock &pb, - const panzer::ClosureModelFactory_TemplateManager<panzer::Traits> &factory, - const Teuchos::ParameterList &models, - const Teuchos::ParameterList &user_data) const; - - std::string residual_name; - Teuchos::RCP<panzer::PureBasis> basis; -}; - -} // namespace Example - -#include "Example_BCStrategy_Dirichlet_Constant_impl.hpp" - -#endif diff --git a/tlnos/src/Example_BCStrategy_Dirichlet_Constant_impl.hpp b/tlnos/src/Example_BCStrategy_Dirichlet_Constant_impl.hpp deleted file mode 100644 index 7a8207e3..00000000 --- a/tlnos/src/Example_BCStrategy_Dirichlet_Constant_impl.hpp +++ /dev/null @@ -1,132 +0,0 @@ -// @HEADER -// *********************************************************************** -// -// Panzer: A partial differential equation assembly -// engine for strongly coupled complex multiphysics systems -// Copyright (2011) Sandia Corporation -// -// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, -// the U.S. Government retains certain rights in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and -// Eric C. Cyr (eccyr@sandia.gov) -// *********************************************************************** -// @HEADER - -#include "Teuchos_ParameterList.hpp" -#include "Teuchos_RCP.hpp" -#include "Teuchos_Assert.hpp" -#include "Phalanx_DataLayout_MDALayout.hpp" -#include "Phalanx_FieldManager.hpp" -#include "Panzer_PhysicsBlock.hpp" - -#include "Panzer_PureBasis.hpp" - -// Evaluators -#include "Panzer_Constant.hpp" - -#include "Phalanx_MDField.hpp" -#include "Phalanx_DataLayout.hpp" -#include "Phalanx_DataLayout_MDALayout.hpp" - -// *********************************************************************** -template <typename EvalT> -Example::BCStrategy_Dirichlet_Constant<EvalT>:: - BCStrategy_Dirichlet_Constant(const panzer::BC &bc, const Teuchos::RCP<panzer::GlobalData> &global_data) : panzer::BCStrategy_Dirichlet_DefaultImpl<EvalT>(bc, global_data) -{ - TEUCHOS_ASSERT(this->m_bc.strategy() == "Constant"); -} - -// *********************************************************************** -template <typename EvalT> -void Example::BCStrategy_Dirichlet_Constant<EvalT>:: - setup(const panzer::PhysicsBlock &side_pb, - const Teuchos::ParameterList &user_data) -{ - using std::pair; - using std::string; - using std::vector; - using Teuchos::RCP; - - // need the dof value to form the residual - this->required_dof_names.push_back(this->m_bc.equationSetName()); - - // unique residual name - this->residual_name = "Residual_" + this->m_bc.identifier(); - - // map residual to dof - this->residual_to_dof_names_map[residual_name] = this->m_bc.equationSetName(); - - // map residual to target field - this->residual_to_target_field_map[residual_name] = "Constant_" + this->m_bc.equationSetName(); - - // find the basis for this dof - const vector<pair<string, RCP<panzer::PureBasis>>> &dofs = side_pb.getProvidedDOFs(); - - for (vector<pair<string, RCP<panzer::PureBasis>>>::const_iterator dof_it = - dofs.begin(); - dof_it != dofs.end(); ++dof_it) - { - if (dof_it->first == this->m_bc.equationSetName()) - this->basis = dof_it->second; - } - - TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::is_null(this->basis), std::runtime_error, - "Error the name \"" << this->m_bc.equationSetName() - << "\" is not a valid DOF for the boundary condition:\n" - << this->m_bc << "\n"); -} - -// *********************************************************************** -template <typename EvalT> -void Example::BCStrategy_Dirichlet_Constant<EvalT>:: - buildAndRegisterEvaluators(PHX::FieldManager<panzer::Traits> &fm, - const panzer::PhysicsBlock &pb, - const panzer::ClosureModelFactory_TemplateManager<panzer::Traits> &factory, - const Teuchos::ParameterList &models, - const Teuchos::ParameterList &user_data) const -{ - using Teuchos::ParameterList; - using Teuchos::RCP; - using Teuchos::rcp; - - // provide a constant target value to map into residual - { - ParameterList p("BC Constant Dirichlet"); - p.set("Name", "Constant_" + this->m_bc.equationSetName()); - p.set("Data Layout", basis->functional); - p.set("Value", this->m_bc.params()->template get<double>("Value")); - - RCP<PHX::Evaluator<panzer::Traits>> op = - rcp(new panzer::Constant<EvalT, panzer::Traits>(p)); - - this->template registerEvaluator<EvalT>(fm, op); - } -} diff --git a/tlnos/src/Example_BCStrategy_Factory.hpp b/tlnos/src/Example_BCStrategy_Factory.hpp deleted file mode 100644 index 3cf912be..00000000 --- a/tlnos/src/Example_BCStrategy_Factory.hpp +++ /dev/null @@ -1,90 +0,0 @@ -// @HEADER -// *********************************************************************** -// -// Panzer: A partial differential equation assembly -// engine for strongly coupled complex multiphysics systems -// Copyright (2011) Sandia Corporation -// -// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, -// the U.S. Government retains certain rights in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and -// Eric C. Cyr (eccyr@sandia.gov) -// *********************************************************************** -// @HEADER - -#ifndef __Example_BCStrategyFactory_hpp__ -#define __Example_BCStrategyFactory_hpp__ - -#include "Teuchos_RCP.hpp" -#include "Panzer_Traits.hpp" -#include "Panzer_BCStrategy_TemplateManager.hpp" -#include "Panzer_BCStrategy_Factory.hpp" -#include "Panzer_BCStrategy_Factory_Defines.hpp" - -// Add my bcstrategies here -#include "Example_BCStrategy_Dirichlet_Constant.hpp" - -namespace Example -{ - -PANZER_DECLARE_BCSTRATEGY_TEMPLATE_BUILDER("Constant", - BCStrategy_Dirichlet_Constant, - BCStrategy_Dirichlet_Constant) - -struct BCStrategyFactory : public panzer::BCStrategyFactory -{ - - Teuchos::RCP<panzer::BCStrategy_TemplateManager<panzer::Traits>> - buildBCStrategy(const panzer::BC &bc, const Teuchos::RCP<panzer::GlobalData> &global_data) const - { - - Teuchos::RCP<panzer::BCStrategy_TemplateManager<panzer::Traits>> bcs_tm = - Teuchos::rcp(new panzer::BCStrategy_TemplateManager<panzer::Traits>); - - bool found = false; - - PANZER_BUILD_BCSTRATEGY_OBJECTS("Constant", - Example::BCStrategy_Dirichlet_Constant, - BCStrategy_Dirichlet_Constant) - - TEUCHOS_TEST_FOR_EXCEPTION(!found, std::logic_error, - "Error - the BC Strategy called \"" << bc.strategy() << "\" is not a valid identifier in the BCStrategyFactory. Either add a " - "valid implementation to your factory or fix your input file. The " - "relevant boundary condition is:\n\n" - << bc << std::endl); - - return bcs_tm; - } -}; - -} // namespace Example - -#endif diff --git a/tlnos/src/Example_ClosureModel_Factory.hpp b/tlnos/src/Example_ClosureModel_Factory.hpp deleted file mode 100644 index 9a8d7e51..00000000 --- a/tlnos/src/Example_ClosureModel_Factory.hpp +++ /dev/null @@ -1,76 +0,0 @@ -// @HEADER -// *********************************************************************** -// -// Panzer: A partial differential equation assembly -// engine for strongly coupled complex multiphysics systems -// Copyright (2011) Sandia Corporation -// -// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, -// the U.S. Government retains certain rights in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and -// Eric C. Cyr (eccyr@sandia.gov) -// *********************************************************************** -// @HEADER - -#ifndef __Example_ClosureModelFactory_hpp__ -#define __Example_ClosureModelFactory_hpp__ - -#include "Panzer_ClosureModel_Factory.hpp" - -namespace panzer -{ -class InputEquationSet; -} - -namespace Example -{ - -template <typename EvalT> -class ModelFactory : public panzer::ClosureModelFactory<EvalT> -{ - -public: - Teuchos::RCP<std::vector<Teuchos::RCP<PHX::Evaluator<panzer::Traits>>>> - buildClosureModels(const std::string &model_id, - const Teuchos::ParameterList &models, - const panzer::FieldLayoutLibrary &fl, - const Teuchos::RCP<panzer::IntegrationRule> &ir, - const Teuchos::ParameterList &default_params, - const Teuchos::ParameterList &user_data, - const Teuchos::RCP<panzer::GlobalData> &global_data, - PHX::FieldManager<panzer::Traits> &fm) const; -}; - -} // namespace Example - -#include "Example_ClosureModel_Factory_impl.hpp" - -#endif diff --git a/tlnos/src/Example_ClosureModel_Factory_TemplateBuilder.hpp b/tlnos/src/Example_ClosureModel_Factory_TemplateBuilder.hpp deleted file mode 100644 index 8b039db5..00000000 --- a/tlnos/src/Example_ClosureModel_Factory_TemplateBuilder.hpp +++ /dev/null @@ -1,66 +0,0 @@ -// @HEADER -// *********************************************************************** -// -// Panzer: A partial differential equation assembly -// engine for strongly coupled complex multiphysics systems -// Copyright (2011) Sandia Corporation -// -// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, -// the U.S. Government retains certain rights in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and -// Eric C. Cyr (eccyr@sandia.gov) -// *********************************************************************** -// @HEADER - -#ifndef __Example_ClosureModel_Factory_TemplateBuilder_hpp__ -#define __Example_ClosureModel_Factory_TemplateBuilder_hpp__ - -#include <string> -#include "Sacado_mpl_apply.hpp" -#include "Teuchos_RCP.hpp" -#include "Example_ClosureModel_Factory.hpp" - -namespace Example -{ - -class ClosureModelFactory_TemplateBuilder -{ -public: - template <typename EvalT> - Teuchos::RCP<panzer::ClosureModelFactoryBase> build() const - { - return Teuchos::rcp(static_cast<panzer::ClosureModelFactoryBase *>(new Example::ModelFactory<EvalT>)); - } -}; - -} // namespace Example - -#endif diff --git a/tlnos/src/Example_ClosureModel_Factory_impl.hpp b/tlnos/src/Example_ClosureModel_Factory_impl.hpp deleted file mode 100644 index 8965ef16..00000000 --- a/tlnos/src/Example_ClosureModel_Factory_impl.hpp +++ /dev/null @@ -1,144 +0,0 @@ -// @HEADER -// *********************************************************************** -// -// Panzer: A partial differential equation assembly -// engine for strongly coupled complex multiphysics systems -// Copyright (2011) Sandia Corporation -// -// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, -// the U.S. Government retains certain rights in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and -// Eric C. Cyr (eccyr@sandia.gov) -// *********************************************************************** -// @HEADER - -#ifndef __Example_ClosureModelFactoryT_hpp__ -#define __Example_ClosureModelFactoryT_hpp__ - -#include <iostream> -#include <sstream> -#include <typeinfo> -#include "Panzer_IntegrationRule.hpp" -#include "Panzer_BasisIRLayout.hpp" -#include "Panzer_Integrator_Scalar.hpp" -#include "Phalanx_FieldTag_Tag.hpp" -#include "Teuchos_ParameterEntry.hpp" -#include "Teuchos_TypeNameTraits.hpp" - -// ******************************************************************** -// ******************************************************************** -template <typename EvalT> -Teuchos::RCP<std::vector<Teuchos::RCP<PHX::Evaluator<panzer::Traits>>>> -Example::ModelFactory<EvalT>:: - buildClosureModels(const std::string &model_id, - const Teuchos::ParameterList &models, - const panzer::FieldLayoutLibrary &fl, - const Teuchos::RCP<panzer::IntegrationRule> &ir, - const Teuchos::ParameterList &default_params, - const Teuchos::ParameterList &user_data, - const Teuchos::RCP<panzer::GlobalData> &global_data, - PHX::FieldManager<panzer::Traits> &fm) const -{ - using PHX::Evaluator; - using std::string; - using std::vector; - using Teuchos::ParameterList; - using Teuchos::RCP; - using Teuchos::rcp; - - RCP<vector<RCP<Evaluator<panzer::Traits>>>> evaluators = - rcp(new vector<RCP<Evaluator<panzer::Traits>>>); - - if (!models.isSublist(model_id)) - { - models.print(std::cout); - std::stringstream msg; - msg << "Falied to find requested model, \"" << model_id - << "\", for equation set:\n" - << std::endl; - TEUCHOS_TEST_FOR_EXCEPTION(!models.isSublist(model_id), std::logic_error, msg.str()); - } - - std::vector<Teuchos::RCP<const panzer::PureBasis>> bases; - fl.uniqueBases(bases); - - const ParameterList &my_models = models.sublist(model_id); - - for (ParameterList::ConstIterator model_it = my_models.begin(); - model_it != my_models.end(); ++model_it) - { - - bool found = false; - - const std::string key = model_it->first; - ParameterList input; - const Teuchos::ParameterEntry &entry = model_it->second; - const ParameterList &plist = Teuchos::getValue<Teuchos::ParameterList>(entry); - - if (plist.isType<double>("Value")) - { - { // at IP - input.set("Name", key); - input.set("Value", plist.get<double>("Value")); - input.set("Data Layout", ir->dl_scalar); - RCP<Evaluator<panzer::Traits>> e = - rcp(new panzer::Constant<EvalT, panzer::Traits>(input)); - evaluators->push_back(e); - } - - for (std::vector<Teuchos::RCP<const panzer::PureBasis>>::const_iterator basis_itr = bases.begin(); - basis_itr != bases.end(); ++basis_itr) - { // at BASIS - input.set("Name", key); - input.set("Value", plist.get<double>("Value")); - Teuchos::RCP<const panzer::BasisIRLayout> basis = basisIRLayout(*basis_itr, *ir); - input.set("Data Layout", basis->functional); - RCP<Evaluator<panzer::Traits>> e = - rcp(new panzer::Constant<EvalT, panzer::Traits>(input)); - evaluators->push_back(e); - } - found = true; - } - - if (!found) - { - std::stringstream msg; - msg << "ClosureModelFactory failed to build evaluator for key \"" << key - << "\"\nin model \"" << model_id - << "\". Please correct the type or add support to the \nfactory." << std::endl; - TEUCHOS_TEST_FOR_EXCEPTION(!found, std::logic_error, msg.str()); - } - } - - return evaluators; -} - -#endif diff --git a/tlnos/src/Example_EquationSetFactory.hpp b/tlnos/src/Example_EquationSetFactory.hpp deleted file mode 100644 index f06c01d1..00000000 --- a/tlnos/src/Example_EquationSetFactory.hpp +++ /dev/null @@ -1,94 +0,0 @@ -// @HEADER -// *********************************************************************** -// -// Panzer: A partial differential equation assembly -// engine for strongly coupled complex multiphysics systems -// Copyright (2011) Sandia Corporation -// -// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, -// the U.S. Government retains certain rights in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and -// Eric C. Cyr (eccyr@sandia.gov) -// *********************************************************************** -// @HEADER - -#ifndef __PoissonExample_EquationSetFactory_hpp__ -#define __PoissonExample_EquationSetFactory_hpp__ - -#include "Panzer_EquationSet_Factory.hpp" -#include "Panzer_EquationSet_Factory_Defines.hpp" -#include "Panzer_CellData.hpp" - -// Add my equation sets here -#include "Example_PoissonEquationSet.hpp" - -namespace Example -{ - -// A macro that defines a class to make construction of the equation sets easier -// - The equation set is constructed over a list of automatic differention types -PANZER_DECLARE_EQSET_TEMPLATE_BUILDER("Poisson", PoissonEquationSet, PoissonEquationSet) - -// A user written factory that creates each equation set. The key member here -// is buildEquationSet -class EquationSetFactory : public panzer::EquationSetFactory -{ -public: - Teuchos::RCP<panzer::EquationSet_TemplateManager<panzer::Traits>> - buildEquationSet(const Teuchos::RCP<Teuchos::ParameterList> ¶ms, - const int &default_integration_order, - const panzer::CellData &cell_data, - const Teuchos::RCP<panzer::GlobalData> &global_data, - const bool build_transient_support) const - { - Teuchos::RCP<panzer::EquationSet_TemplateManager<panzer::Traits>> eq_set = - Teuchos::rcp(new panzer::EquationSet_TemplateManager<panzer::Traits>); - - bool found = false; // this is used by PANZER_BUILD_EQSET_OBJECTS - - // macro checks if(ies.name=="Poisson") then an EquationSet_Energy object is constructed - PANZER_BUILD_EQSET_OBJECTS("Poisson", PoissonEquationSet, PoissonEquationSet) - - // make sure your equation set has been found - if (!found) - { - std::string msg = "Error - the \"Equation Set\" called \"" + params->get<std::string>("Type") + - "\" is not a valid equation set identifier. Please supply the correct factory.\n"; - TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error, msg); - } - - return eq_set; - } -}; - -} // namespace Example - -#endif diff --git a/tlnos/src/Example_PoissonEquationSet.hpp b/tlnos/src/Example_PoissonEquationSet.hpp deleted file mode 100644 index f3cfbe59..00000000 --- a/tlnos/src/Example_PoissonEquationSet.hpp +++ /dev/null @@ -1,94 +0,0 @@ -// @HEADER -// *********************************************************************** -// -// Panzer: A partial differential equation assembly -// engine for strongly coupled complex multiphysics systems -// Copyright (2011) Sandia Corporation -// -// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, -// the U.S. Government retains certain rights in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and -// Eric C. Cyr (eccyr@sandia.gov) -// *********************************************************************** -// @HEADER - -#ifndef __PoissonExample_EquationSet_Energy_hpp__ -#define __PoissonExample_EquationSet_Energy_hpp__ - -#include <vector> -#include <string> - -#include "Teuchos_RCP.hpp" -#include "Panzer_EquationSet_DefaultImpl.hpp" -#include "Panzer_Traits.hpp" -#include "Phalanx_FieldManager.hpp" - -namespace Example -{ - -/** The equation set serves two roles. The first is to let the panzer library - * know which fields this equation set defines and their names. It registers - * the evaluators required for a particular equation set. The level of the - * granularity is largely up to a user. For instance this could be the momentum - * or continuity equation in Navier-Stokes, or it could simply be the Navier-Stokes - * equations. - * - * Generally, this inherits from the panzer::EquationSet_DefaultImpl which takes - * care of adding the gather (extract basis coefficients from solution vector) and - * scatter (using element matrices and vectors distribute and sum their values - * to a global linear system) evaluators. These use data members that must be set by - * the user. - */ -template <typename EvalT> -class PoissonEquationSet : public panzer::EquationSet_DefaultImpl<EvalT> -{ -public: - /** In the constructor you set all the fields provided by this - * equation set. - */ - PoissonEquationSet(const Teuchos::RCP<Teuchos::ParameterList> ¶ms, - const int &default_integration_order, - const panzer::CellData &cell_data, - const Teuchos::RCP<panzer::GlobalData> &global_data, - const bool build_transient_support); - - /** The specific evaluators are registered with the field manager argument. - */ - void buildAndRegisterEquationSetEvaluators(PHX::FieldManager<panzer::Traits> &fm, - const panzer::FieldLibrary &field_library, - const Teuchos::ParameterList &user_data) const; -}; - -} // namespace Example - -#include "Example_PoissonEquationSet_impl.hpp" - -#endif diff --git a/tlnos/src/Example_PoissonEquationSet_impl.hpp b/tlnos/src/Example_PoissonEquationSet_impl.hpp deleted file mode 100644 index 8990248e..00000000 --- a/tlnos/src/Example_PoissonEquationSet_impl.hpp +++ /dev/null @@ -1,213 +0,0 @@ -// @HEADER -// *********************************************************************** -// -// Panzer: A partial differential equation assembly -// engine for strongly coupled complex multiphysics systems -// Copyright (2011) Sandia Corporation -// -// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, -// the U.S. Government retains certain rights in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and -// Eric C. Cyr (eccyr@sandia.gov) -// *********************************************************************** -// @HEADER - -#ifndef USER_APP_EQUATIONSET_ENERGY_T_HPP -#define USER_APP_EQUATIONSET_ENERGY_T_HPP - -#include "Teuchos_ParameterList.hpp" -#include "Teuchos_StandardParameterEntryValidators.hpp" -#include "Teuchos_RCP.hpp" -#include "Teuchos_Assert.hpp" -#include "Phalanx_DataLayout_MDALayout.hpp" -#include "Phalanx_FieldManager.hpp" - -#include "Panzer_IntegrationRule.hpp" -#include "Panzer_BasisIRLayout.hpp" - -// include evaluators here -#include "Panzer_Integrator_BasisTimesScalar.hpp" -#include "Panzer_Integrator_GradBasisDotVector.hpp" -#include "Panzer_ScalarToVector.hpp" -#include "Panzer_Sum.hpp" -#include "Panzer_Constant.hpp" - -// *********************************************************************** -template <typename EvalT> -Example::PoissonEquationSet<EvalT>:: - PoissonEquationSet(const Teuchos::RCP<Teuchos::ParameterList> ¶ms, - const int &default_integration_order, - const panzer::CellData &cell_data, - const Teuchos::RCP<panzer::GlobalData> &global_data, - const bool build_transient_support) : panzer::EquationSet_DefaultImpl<EvalT>(params, default_integration_order, cell_data, global_data, build_transient_support) -{ - // ******************** - // Validate and parse parameter list - // ******************** - { - Teuchos::ParameterList valid_parameters; - this->setDefaultValidParameters(valid_parameters); - - valid_parameters.set("Model ID", "", "Closure model id associated with this equaiton set"); - valid_parameters.set("Basis Type", "HGrad", "Type of Basis to use"); - valid_parameters.set("Basis Order", 1, "Order of the basis"); - valid_parameters.set("Integration Order", -1, "Order of the integration rule"); - - params->validateParametersAndSetDefaults(valid_parameters); - } - - std::string basis_type = params->get<std::string>("Basis Type"); - int basis_order = params->get<int>("Basis Order"); - int integration_order = params->get<int>("Integration Order"); - std::string model_id = params->get<std::string>("Model ID"); - - // ******************** - // Panzer uses strings to match fields. In this section we define the - // name of the fields provided by this equation set. This is a bit strange - // in that this is not the fields necessarily required by this equation set. - // For instance for the momentum equations in Navier-Stokes only the velocity - // fields are added, the pressure field is added by continuity. - // - // In this case "TEMPERATURE" is the lone field. We also name the gradient - // for this field. These names automatically generate evaluators for "TEMPERATURE" - // and "GRAD_TEMPERATURE" gathering the basis coefficients of "TEMPERATURE" and - // the values of the TEMPERATURE and GRAD_TEMPERATURE fields at quadrature points. - // - // After all the equation set evaluators are added to a given field manager, the - // panzer code adds in appropriate scatter evaluators to distribute the - // entries into the residual and the Jacobian operator. These operators will be - // "required" by the field manager and will serve as roots of evaluation tree. - // The leaves of this tree will include the gather evaluators whose job it is to - // gather the solution from a vector. - // ******************** - - // ******************** - // Assemble DOF names and Residual names - // ******************** - - this->addDOF("TEMPERATURE", basis_type, basis_order, integration_order); - this->addDOFGrad("TEMPERATURE"); - if (this->buildTransientSupport()) - this->addDOFTimeDerivative("TEMPERATURE"); - - // ******************** - // Build Basis Functions and Integration Rules - // ******************** - - this->addClosureModel(model_id); - - this->setupDOFs(); -} - -// *********************************************************************** -template <typename EvalT> -void Example::PoissonEquationSet<EvalT>:: - buildAndRegisterEquationSetEvaluators(PHX::FieldManager<panzer::Traits> &fm, - const panzer::FieldLibrary &fl, - const Teuchos::ParameterList &user_data) const -{ - using Teuchos::ParameterList; - using Teuchos::RCP; - using Teuchos::rcp; - - Teuchos::RCP<panzer::IntegrationRule> ir = this->getIntRuleForDOF("TEMPERATURE"); - Teuchos::RCP<panzer::BasisIRLayout> basis = this->getBasisIRLayoutForDOF("TEMPERATURE"); - - // ******************** - // Energy Equation - // ******************** - - // Transient Operator: Assembles \int \dot{T} v - if (this->buildTransientSupport()) - { - ParameterList p("Transient Residual"); - p.set("Residual Name", "RESIDUAL_TEMPERATURE_TRANSIENT_OP"); // we are defining the name of this operator - p.set("Value Name", "DXDT_TEMPERATURE"); // this field is constructed by the panzer library - p.set("Basis", basis); - p.set("IR", ir); - p.set("Multiplier", 1.0); - - RCP<PHX::Evaluator<panzer::Traits>> op = - rcp(new panzer::Integrator_BasisTimesScalar<EvalT, panzer::Traits>(p)); - - this->template registerEvaluator<EvalT>(fm, op); - } - - // Diffusion Operator: Assembles \int \nabla T \cdot \nabla v - { - double thermal_conductivity = 1.0; - - ParameterList p("Diffusion Residual"); - p.set("Residual Name", "RESIDUAL_TEMPERATURE_DIFFUSION_OP"); - p.set("Flux Name", "GRAD_TEMPERATURE"); // this field is constructed by the panzer library - p.set("Basis", basis); - p.set("IR", ir); - p.set("Multiplier", thermal_conductivity); - - RCP<PHX::Evaluator<panzer::Traits>> op = - rcp(new panzer::Integrator_GradBasisDotVector<EvalT, panzer::Traits>(p)); - - this->template registerEvaluator<EvalT>(fm, op); - } - - // Source Operator - { - ParameterList p("Source Residual"); - p.set("Residual Name", "RESIDUAL_TEMPERATURE_SOURCE_OP"); - p.set("Value Name", "SOURCE_TEMPERATURE"); // this field must be provided by the closure model factory - // and specified by the user - p.set("Basis", basis); - p.set("IR", ir); - p.set("Multiplier", -1.0); - - RCP<PHX::Evaluator<panzer::Traits>> op = - rcp(new panzer::Integrator_BasisTimesScalar<EvalT, panzer::Traits>(p)); - - this->template registerEvaluator<EvalT>(fm, op); - } - - // Use a sum operator to form the overall residual for the equation - { - std::vector<std::string> sum_names; - - // these are the names of the residual values to sum together - sum_names.push_back("RESIDUAL_TEMPERATURE_DIFFUSION_OP"); - sum_names.push_back("RESIDUAL_TEMPERATURE_SOURCE_OP"); - if (this->buildTransientSupport()) - sum_names.push_back("RESIDUAL_TEMPERATURE_TRANSIENT_OP"); - - this->buildAndRegisterResidualSummationEvalautor(fm, "TEMPERATURE", sum_names); - } -} - -// *********************************************************************** - -#endif diff --git a/tlnos/src/ExodusInterface.h b/tlnos/src/ExodusInterface.h deleted file mode 100644 index e0847ac7..00000000 --- a/tlnos/src/ExodusInterface.h +++ /dev/null @@ -1,231 +0,0 @@ -/* -#@HEADER -# ************************************************************************ -# -# Moertel FE Package -# Copyright (2006) Sandia Corporation -# -# Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -# license for use of this work by or on behalf of the U.S. Government. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# 3. Neither the name of the Corporation nor the names of the -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Questions? Contact Glen Hansen (gahanse@sandia.gov) -# -# ************************************************************************ -#@HEADER -*/ - -#ifndef MOERTEL_EXODUS_H -#define MOERTEL_EXODUS_H - -#include <iostream> -#include <iomanip> -#include "Epetra_Map.h" -#include "Epetra_MultiVector.h" -#include "Epetra_Import.h" -#include "Galeri_AbstractGrid.h" - -// Exodus stuff - -#include "exodusII.h" - -using namespace std; - -class ExodusInterface -{ - -public: - ExodusInterface(Epetra_Comm &Comm) : Comm_(Comm) {} - - ~ExodusInterface() {} - - const Epetra_Comm &Comm() const - { - return (Comm_); - } - - void Write(const Galeri::FiniteElements::AbstractGrid &data, const string &BaseName, - const Epetra_MultiVector &Field) - { - - int comp_ws = sizeof(double); // = 8 - int io_ws = sizeof(double); // = 8 - - string FileName = BaseName + ".exo"; - int ex_id = ex_create(FileName.c_str(), EX_CLOBBER, &comp_ws, &io_ws); - - int num_dim = data.NumDimensions(); - int num_nodes = data.NumGlobalVertices(); - int num_elem = data.NumGlobalElements(); - int num_elem_blk = 1; - int num_node_sets = 0; - int num_side_sets = 0; - - int ex_err = ex_put_init(ex_id, FileName.c_str(), num_dim, - num_nodes, num_elem, num_elem_blk, - num_node_sets, num_side_sets); - - vector<double> coord(3); - vector<int> vertices(data.NumVerticesPerElement()); - - const Epetra_Map &RowMap = data.RowMap(); - // const Epetra_Map& VertexMap = data.VertexMap(); - - std::vector<double> x(data.NumMyVertices()); - std::vector<double> y(data.NumMyVertices()); - std::vector<double> z(data.NumMyVertices()); - - for (int i = 0; i < data.NumMyVertices(); ++i) - { - data.VertexCoord(i, &coord[0]); - x[i] = coord[0]; - y[i] = coord[1]; - z[i] = coord[2]; - } - - int n = 0; - if (Field.Comm().MyPID() == 0) - n = RowMap.NumGlobalElements(); - - Epetra_Map SingleProcMap(-1, n, 0, Field.Comm()); - Epetra_MultiVector SingleProcField(SingleProcMap, 1); - - Epetra_Import FieldImporter(SingleProcMap, RowMap); - SingleProcField.Import(Field, FieldImporter, Insert); - - if (Comm().MyPID() == 0) - { - switch (data.NumDimensions()) - { - case 2: - { - const char *coord_names[] = {"x", "y"}; - ex_err = ex_put_coord_names(ex_id, (char **)coord_names); - ex_err = ex_put_coord(ex_id, &x[0], &y[0], NULL); - } - break; - case 3: - { - const char *coord_names[] = {"x", "y", "z"}; - ex_err = ex_put_coord_names(ex_id, (char **)coord_names); - ex_err = ex_put_coord(ex_id, &x[0], &y[0], &z[0]); - } - break; - default: - throw(-1); - } - } - Comm().Barrier(); - - for (int ProcID = 0; ProcID < Comm().NumProc(); ++ProcID) - { - - if (Comm().MyPID() == ProcID) - { - - if (ProcID == 0) - { - string type = data.ElementType(); - - if (type == "GALERI_TRIANGLE") - { - const char *elem_type = "TRIANGLE"; - ex_err = ex_put_elem_block(ex_id, 1, (char *)elem_type, data.NumGlobalElements(), 3, 0); - } - else if (type == "GALERI_QUAD") - { - const char *elem_type = "QUAD4"; - ex_err = ex_put_elem_block(ex_id, 1, (char *)elem_type, data.NumGlobalElements(), 4, 0); - } - else if (type == "GALERI_TET") - { - const char *elem_type = "TETRA"; - ex_err = ex_put_elem_block(ex_id, 1, (char *)elem_type, data.NumGlobalElements(), 4, 0); - } - else if (type == "GALERI_HEX") - { - const char *elem_type = "HEX"; - ex_err = ex_put_elem_block(ex_id, 1, (char *)elem_type, data.NumGlobalElements(), 8, 0); - } - else - { - cerr << "Incorrect element type (" << type << ")" << endl; - throw(-1); - } - } - - std::vector<int> connect_tmp(data.NumMyElements() * data.NumVerticesPerElement()); - int cnt = 0; - - for (int i = 0; i < data.NumMyElements(); ++i) - { - data.ElementVertices(i, &vertices[0]); - for (int j = 0; j < data.NumVerticesPerElement(); ++j) - connect_tmp[cnt++] = data.VertexMap().GID(vertices[j]) + 1; - } - - ex_err = ex_put_elem_conn(ex_id, 1, &connect_tmp[0]); - } - - /* Write the field data out - - ex_err = ex_put_nodal_var(int exodus_file_id, int time_step, - int nodal_var_index, // which field set is being written - int num_nodes, // number of nodes worth of data - void *nodal_var_vals // the data - ); - */ - - int num_nodal_fields = 1; - std::vector<double> field(data.NumMyVertices()); - - ex_err = ex_put_var_param(ex_id, "N", num_nodal_fields); - - const char *var_names[] = {"u"}; - ex_err = ex_put_var_names(ex_id, "N", num_nodal_fields, (char **)var_names); - - // for(int i = 0; i < data.NumMyVertices(); i++) - // field[i] = SingleProcField[0][i]; - for (int i = 0; i < data.NumMyVertices(); i++) - field[i] = Field[0][i]; - - ex_err = ex_put_nodal_var(ex_id, 1, 1, data.NumMyVertices(), &field[0]); - - ex_err = ex_close(ex_id); - - Comm().Barrier(); - - } // for Procs, write elements - } - -private: - const Epetra_Comm &Comm_; -}; - -#endif diff --git a/tlnos/src/TOOLS/PDE_FEM.hpp b/tlnos/src/TOOLS/PDE_FEM.hpp deleted file mode 100644 index 362d5338..00000000 --- a/tlnos/src/TOOLS/PDE_FEM.hpp +++ /dev/null @@ -1,1055 +0,0 @@ -// @HEADER -// ************************************************************************ -// -// Rapid Optimization Library (ROL) Package -// Copyright (2014) Sandia Corporation -// -// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -// license for use of this work by or on behalf of the U.S. Government. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact lead developers: -// Drew Kouri (dpkouri@sandia.gov) and -// Denis Ridzal (dridzal@sandia.gov) -// -// ************************************************************************ -// @HEADER - -/*! \file data.hpp - \brief Generates and manages data for the Poisson example, including - all mesh and discretization data, matrices, etc. -*/ - -#ifndef ROL_PDEOPT_PDE_FEM_H -#define ROL_PDEOPT_PDE_FEM_H - -#include "Teuchos_GlobalMPISession.hpp" -#include "Teuchos_TimeMonitor.hpp" - -#include "Tpetra_DefaultPlatform.hpp" -#include "Tpetra_MultiVector.hpp" -#include "Tpetra_Vector.hpp" -#include "Tpetra_CrsGraph.hpp" -#include "Tpetra_CrsMatrix.hpp" -#include "Tpetra_Version.hpp" -#include "Tpetra_RowMatrixTransposer.hpp" -#include "MatrixMarket_Tpetra.hpp" - -#include "Intrepid_HGRAD_QUAD_C2_FEM.hpp" -#include "Intrepid_HGRAD_QUAD_C1_FEM.hpp" -#include "Intrepid_DefaultCubatureFactory.hpp" -#include "Intrepid_FunctionSpaceTools.hpp" -#include "Intrepid_CellTools.hpp" - -#include "Amesos2.hpp" -#include "./dofmanager.hpp" - -template <class Real> -class PDE_FEM -{ - -protected: - Teuchos::RCP<MeshManager<Real>> meshMgr_; - Teuchos::RCP<DofManager<Real>> dofMgr_; - std::vector<Teuchos::RCP<Intrepid::Basis<Real, Intrepid::FieldContainer<Real>>>> basisPtrs_; - Teuchos::RCP<Intrepid::DofCoordsInterface<Intrepid::FieldContainer<Real>>> coord_iface_; - Intrepid::FieldContainer<int> cellDofs_; - - Teuchos::RCP<Teuchos::ParameterList> parlist_; - Teuchos::RCP<const Teuchos::Comm<int>> commPtr_; - Teuchos::RCP<std::ostream> outStream_; - - int numLocalDofs_; - Intrepid::FieldContainer<int> ctn_; - Intrepid::FieldContainer<int> cte_; - - int myRank_; - int numProcs_; - - Real alpha_; - int basisOrder_; - - Teuchos::RCP<const Tpetra::Map<>> myCellMap_; - Teuchos::RCP<const Tpetra::Map<>> myOverlapMap_; - Teuchos::RCP<const Tpetra::Map<>> myUniqueMap_; - Teuchos::RCP<Tpetra::CrsGraph<>> matGraph_; - Teuchos::RCP<Tpetra::CrsMatrix<>> matA_; - Teuchos::RCP<Tpetra::CrsMatrix<>> matA_dirichlet_; - // Teuchos::RCP<Tpetra::CrsMatrix<> > matA_dirichlet_trans_; - Teuchos::RCP<Tpetra::CrsMatrix<>> matM_; - Teuchos::RCP<Tpetra::CrsMatrix<>> matM_dirichlet_; - // Teuchos::RCP<Tpetra::CrsMatrix<> > matM_dirichlet_trans_; - Teuchos::RCP<Tpetra::MultiVector<>> vecUd_; - Teuchos::RCP<Tpetra::MultiVector<>> vecF_; - Teuchos::RCP<Tpetra::MultiVector<>> vecF_overlap_; - Teuchos::RCP<Tpetra::MultiVector<>> vecF_dirichlet_; - - Teuchos::Array<Real> myCellMeasure_; - Teuchos::Array<int> myCellIds_; - // Elements on Boundary - std::vector<Teuchos::Array<int>> myBoundaryCellIds_; - // DBC - Teuchos::Array<int> myDirichletDofs_; - // BC Sides - std::vector<int> my_dbc_; - std::vector<int> my_nbc_; - - //Point load on Bundary! - std::vector<int> myPointLoadDofs_; - std::vector<Real> myPointLoadVals_; - - Teuchos::RCP<Amesos2::Solver<Tpetra::CrsMatrix<>, Tpetra::MultiVector<>>> solverA_; - // Teuchos::RCP<Amesos2::Solver< Tpetra::CrsMatrix<>, Tpetra::MultiVector<> > > solverA_trans_; - - shards::CellTopology cellType_; - - int sideDim_; - int spaceDim_; - int numNodesPerCell_; - int numCubPoints_; - int lfs_; - - int totalNumCells_; - int totalNumDofs_; - int numCells_; - - Teuchos::RCP<Intrepid::FieldContainer<Real>> cubPoints_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cubWeights_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cellNodes_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cellJac_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cellJacInv_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cellJacDet_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cellWeightedMeasure_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> valReference_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> gradReference_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> valPhysical_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> gradPhysical_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> valPhysicalWeighted_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> gradPhysicalWeighted_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> gradgradMats_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> valvalMats_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cubPointsPhysical_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> dataF_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> datavalVecF_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> dofPoints_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> dofPointsPhysical_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> dataUd_; - - bool verbose_; - -protected: -public: - // constructor - PDE_FEM() {} - // destructor - virtual ~PDE_FEM() {} - - virtual void Initialize(const Teuchos::RCP<const Teuchos::Comm<int>> &comm, - const Teuchos::RCP<Teuchos::ParameterList> &parlist, - const Teuchos::RCP<std::ostream> &outStream) - { - commPtr_ = comm; - parlist_ = parlist; - outStream_ = outStream; - myRank_ = comm->getRank(); - numProcs_ = comm->getSize(); - - verbose_ = parlist->sublist("PDE FEM").get("Verbose Output", false); - if (verbose_) - { - *outStream_ << "Total number of processors: " << numProcs_ << std::endl; - } - - basisOrder_ = parlist->sublist("PDE FEM").get<int>("Order of FE Discretization"); - } - - void SetDiscretization(const Teuchos::RCP<MeshManager<Real>> &meshMgr, - const std::vector<Teuchos::RCP<Intrepid::Basis<Real, Intrepid::FieldContainer<Real>>>> &basisPtrs) - { - meshMgr_ = meshMgr; - totalNumCells_ = meshMgr_->getNumCells(); - - basisPtrs_ = basisPtrs; - - // Retrieve some basic cell information. - cellType_ = (basisPtrs_[0])->getBaseCellTopology(); // get the cell type from any basis - spaceDim_ = cellType_.getDimension(); // retrieve spatial dimension - numNodesPerCell_ = cellType_.getNodeCount(); // retrieve number of nodes per cell - - sideDim_ = spaceDim_ - 1; - - coord_iface_ = Teuchos::rcp_dynamic_cast<Intrepid::DofCoordsInterface<Intrepid::FieldContainer<Real>>>(basisPtrs_[0]); - dofMgr_ = Teuchos::rcp(new DofManager<Real>(meshMgr_, basisPtrs_)); - } - - virtual void SetParallelStructure(void) - { - int cellSplit = parlist_->sublist("Geometry").get<int>("Partition type"); - /****************************************************/ - /*** Build parallel communication infrastructure. ***/ - /****************************************************/ - // Partition the cells in the mesh. We use a basic quasi-equinumerous partitioning, - // where the remainder, if any, is assigned to the last processor. - Teuchos::Array<int> myGlobIds_; - Teuchos::Array<int> cellOffsets_(numProcs_, 0); - int cellsPerProc = totalNumCells_ / numProcs_; - numCells_ = cellsPerProc; - switch (cellSplit) - { - case 0: - if (myRank_ == 0) - { // remainder in the first - numCells_ += totalNumCells_ % numProcs_; - } - for (int i = 1; i < numProcs_; ++i) - { - cellOffsets_[i] = cellOffsets_[i - 1] + cellsPerProc + (static_cast<int>(i == 1)) * (totalNumCells_ % numProcs_); - } - break; - case 1: - if (myRank_ == numProcs_ - 1) - { // remainder in the last - numCells_ += totalNumCells_ % numProcs_; - } - for (int i = 1; i < numProcs_; ++i) - { - cellOffsets_[i] = cellOffsets_[i - 1] + cellsPerProc; - } - break; - case 2: - if (myRank_ < (totalNumCells_ % numProcs_)) - { // spread remainder, starting from the first - numCells_++; - } - for (int i = 1; i < numProcs_; ++i) - { - cellOffsets_[i] = cellOffsets_[i - 1] + cellsPerProc + (static_cast<int>(i - 1 < (totalNumCells_ % numProcs_))); - } - break; - } - - cellDofs_ = *(dofMgr_->getCellDofs()); - numLocalDofs_ = cellDofs_.dimension(1); - if (verbose_) - { - *outStream_ << "Cell offsets across processors: " << cellOffsets_ - << std::endl; - } - for (int i = 0; i < numCells_; ++i) - { - myCellIds_.push_back(cellOffsets_[myRank_] + i); - for (int j = 0; j < numLocalDofs_; ++j) - { - myGlobIds_.push_back(cellDofs_(cellOffsets_[myRank_] + i, j)); - } - } - std::sort(myGlobIds_.begin(), myGlobIds_.end()); - myGlobIds_.erase(std::unique(myGlobIds_.begin(), myGlobIds_.end()), myGlobIds_.end()); - - // Build maps. - myOverlapMap_ = Teuchos::rcp(new Tpetra::Map<>(Teuchos::OrdinalTraits<Tpetra::global_size_t>::invalid(), - myGlobIds_, 0, commPtr_)); - //std::cout << std::endl << myOverlapMap_->getNodeElementList()<<std::endl; - /** One can also use the non-member function: - myOverlapMap_ = Tpetra::createNonContigMap<int,int>(myGlobIds_, commPtr_); - to build the overlap map. - **/ - myUniqueMap_ = Tpetra::createOneToOne<int, int>(myOverlapMap_); - //std::cout << std::endl << myUniqueMap_->getNodeElementList() << std::endl; - myCellMap_ = Teuchos::rcp(new Tpetra::Map<>(Teuchos::OrdinalTraits<Tpetra::global_size_t>::invalid(), - this->myCellIds_, 0, this->commPtr_)); - } - - virtual void SetUpLocalIntrepidArrays(void) - { - /****************************************************/ - /*** Set up local discretization data and arrays. ***/ - /****************************************************/ - // Cubature data. - Intrepid::DefaultCubatureFactory<Real> cubFactory; // create cubature factory - int cubDegree = 4; // set cubature degree, e.g., 2 - Teuchos::RCP<Intrepid::Cubature<Real>> cellCub = cubFactory.create(cellType_, cubDegree); // create default cubature - numCubPoints_ = cellCub->getNumPoints(); // retrieve number of cubature points - - lfs_ = dofMgr_->getLocalFieldSize(0); - // Discretization data. - cubPoints_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCubPoints_, spaceDim_)); - cubWeights_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCubPoints_)); - cubPointsPhysical_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, numCubPoints_, spaceDim_)); - dofPoints_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(lfs_, spaceDim_)); - dofPointsPhysical_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, lfs_, spaceDim_)); - cellNodes_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, numNodesPerCell_, spaceDim_)); - cellJac_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, numCubPoints_, spaceDim_, spaceDim_)); - cellJacInv_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, numCubPoints_, spaceDim_, spaceDim_)); - cellJacDet_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, numCubPoints_)); - cellWeightedMeasure_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, numCubPoints_)); - valReference_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(lfs_, numCubPoints_)); - gradReference_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(lfs_, numCubPoints_, spaceDim_)); - valPhysical_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, lfs_, numCubPoints_)); - gradPhysical_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, lfs_, numCubPoints_, spaceDim_)); - valPhysicalWeighted_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, lfs_, numCubPoints_)); - gradPhysicalWeighted_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, lfs_, numCubPoints_, spaceDim_)); - - // Geometric definition of the cells in the mesh, based on the cell-to-node map and the domain partition. - Intrepid::FieldContainer<Real> &nodes = *meshMgr_->getNodes(); - ctn_ = *meshMgr_->getCellToNodeMap(); - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < numNodesPerCell_; ++j) - { - for (int k = 0; k < spaceDim_; ++k) - { - (*cellNodes_)(i, j, k) = nodes(ctn_(myCellIds_[i], j), k); - } - } - } - - //Compute Intrepid Arrays - cellCub->getCubature(*cubPoints_, *cubWeights_); // retrieve cubature points and weights - (*basisPtrs_[0]).getValues(*gradReference_, *cubPoints_, Intrepid::OPERATOR_GRAD); // evaluate grad operator at cubature points - (*basisPtrs_[0]).getValues(*valReference_, *cubPoints_, Intrepid::OPERATOR_VALUE); // evaluate value operator at cubature points - - Intrepid::CellTools<Real>::setJacobian(*cellJac_, *cubPoints_, *cellNodes_, cellType_); // compute cell Jacobians - Intrepid::CellTools<Real>::setJacobianInv(*cellJacInv_, *cellJac_); // compute inverses of cell Jacobians - Intrepid::CellTools<Real>::setJacobianDet(*cellJacDet_, *cellJac_); // compute determinants of cell Jacobians - - Intrepid::FunctionSpaceTools::computeCellMeasure<Real>(*cellWeightedMeasure_, // compute weighted cell measure - *cellJacDet_, - *cubWeights_); - - Intrepid::FunctionSpaceTools::HGRADtransformGRAD<Real>(*gradPhysical_, // transform reference gradients into physical space - *cellJacInv_, - *gradReference_); - Intrepid::FunctionSpaceTools::multiplyMeasure<Real>(*gradPhysicalWeighted_, // multiply with weighted measure - *cellWeightedMeasure_, - *gradPhysical_); - - Intrepid::FunctionSpaceTools::HGRADtransformVALUE<Real>(*valPhysical_, // transform reference values into physical space - *valReference_); - Intrepid::FunctionSpaceTools::multiplyMeasure<Real>(*valPhysicalWeighted_, // multiply with weighted measure - *cellWeightedMeasure_, - *valPhysical_); - Intrepid::CellTools<Real>::mapToPhysicalFrame(*cubPointsPhysical_, // map reference cubature points to physical space - *cubPoints_, - *cellNodes_, - cellType_); - - ComputeCellTotalMeasures(); - } - - virtual void ComputeCellTotalMeasures(void) - { - for (int i = 0; i < numCells_; ++i) - { - Real temp = 0.0; - for (int j = 0; j < numCubPoints_; ++j) - { - temp += (*cellWeightedMeasure_)(i, j); - } - myCellMeasure_.push_back(temp); - } - std::cout << "First cell total measure: " << myCellMeasure_[0] << std::endl; - } - - virtual void ComputeLocalSystemMats(void) {} - - virtual void ComputeLocalForceVec(void) {} - - virtual void SetUpTrueDataOnNodes(void) {} - - virtual void AssembleSystemMats(void) - { - /****************************************/ - /*** Assemble global data structures. ***/ - /****************************************/ - // Assemble graph. - matGraph_ = Teuchos::rcp(new Tpetra::CrsGraph<>(myUniqueMap_, 0)); - Teuchos::ArrayRCP<const int> cellDofsArrayRCP = cellDofs_.getData(); - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < numLocalDofs_; ++j) - { - matGraph_->insertGlobalIndices(cellDofs_(myCellIds_[i], j), cellDofsArrayRCP(myCellIds_[i] * numLocalDofs_, numLocalDofs_)); - } - } - matGraph_->fillComplete(); - // Assemble matrices. - // Stiffness matrix A. - matA_ = Teuchos::rcp(new Tpetra::CrsMatrix<>(matGraph_)); - int numLocalMatEntries = numLocalDofs_ * numLocalDofs_; - Teuchos::ArrayRCP<const Real> gradgradArrayRCP = gradgradMats_->getData(); - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < numLocalDofs_; ++j) - { - matA_->sumIntoGlobalValues(cellDofs_(myCellIds_[i], j), - cellDofsArrayRCP(myCellIds_[i] * numLocalDofs_, numLocalDofs_), - gradgradArrayRCP(i * numLocalMatEntries + j * numLocalDofs_, numLocalDofs_)); - } - } - matA_->fillComplete(); - // Mass matrix M. - matM_ = Teuchos::rcp(new Tpetra::CrsMatrix<>(matGraph_)); - Teuchos::ArrayRCP<const Real> valvalArrayRCP = valvalMats_->getData(); - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < numLocalDofs_; ++j) - { - matM_->sumIntoGlobalValues(cellDofs_(myCellIds_[i], j), - cellDofsArrayRCP(myCellIds_[i] * numLocalDofs_, numLocalDofs_), - valvalArrayRCP(i * numLocalMatEntries + j * numLocalDofs_, numLocalDofs_)); - } - } - matM_->fillComplete(); - } - - virtual void AssembleRHSVector(void) - { - // Assemble vectors. - // vecF_ requires assembly using vecF_overlap_ and redistribution - vecF_ = Teuchos::rcp(new Tpetra::MultiVector<>(matA_->getRangeMap(), 1, true)); - vecF_overlap_ = Teuchos::rcp(new Tpetra::MultiVector<>(myOverlapMap_, 1, true)); - // assembly on the overlap map - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < numLocalDofs_; ++j) - { - vecF_overlap_->sumIntoGlobalValue(cellDofs_(myCellIds_[i], j), - 0, - (*datavalVecF_)[i * numLocalDofs_ + j]); - } - } - - //Assemble the point loads! - for (unsigned i = 0; i < myPointLoadDofs_.size(); ++i) - { - vecF_overlap_->sumIntoGlobalValue(myPointLoadDofs_[i], - 0, - myPointLoadVals_[i]); - } - - // change map - Tpetra::Export<> exporter(vecF_overlap_->getMap(), vecF_->getMap()); // redistribution - vecF_->doExport(*vecF_overlap_, exporter, Tpetra::ADD); // from the overlap map to the unique map - } - - virtual void AssembleDataVector(void) - { - // vecUd_ does not require assembly - vecUd_ = Teuchos::rcp(new Tpetra::MultiVector<>(matA_->getDomainMap(), 1, true)); - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < numLocalDofs_; ++j) - { - if (vecUd_->getMap()->isNodeGlobalElement(cellDofs_(myCellIds_[i], j))) - { - vecUd_->replaceGlobalValue(cellDofs_(myCellIds_[i], j), - 0, - (*dataUd_)[i * numLocalDofs_ + j]); - } - } - } - } - - // find the local index of a global cell - virtual int find_local_index(int globalCell) - { - return myCellMap_->getLocalElement(globalCell); - /* - for(int i=0; i<numCells_; i++) - { - if(myCellIds_[i] == globalCell) - return i; - } - return -1; -*/ - } - - // check to see if a globaldof is on dirichlet boundary - virtual bool check_myGlobalDof_on_boundary(int globalDof) - { - if (std::binary_search(myDirichletDofs_.begin(), myDirichletDofs_.end(), globalDof)) - { - return true; - } - return false; - } - - //create myBoundaryCellIds_ and myDirichletDofs_ - virtual void SetUpMyDBCInfo(bool ifUseCoordsToSpecifyBC, std::vector<int> dbc_side) - { - if (ifUseCoordsToSpecifyBC) - { - my_dbc_.resize(4); - my_dbc_ = {0, 1, 2, 3}; - } - else - { - my_dbc_ = dbc_side; - } - //Print to check my BC info - if (verbose_) - { - *outStream_ << "My dbc numbers: "; - for (unsigned i = 0; i < my_dbc_.size(); ++i) - { - *outStream_ << my_dbc_[i]; - } - *outStream_ << std::endl; - } - // - Teuchos::RCP<std::vector<std::vector<Intrepid::FieldContainer<int>>>> dirichletSideSets = meshMgr_->getSideSets(); - std::vector<std::vector<Intrepid::FieldContainer<int>>> &dss = *dirichletSideSets; - Teuchos::Array<int> mySortedCellIds_(myCellIds_); - std::sort(mySortedCellIds_.begin(), mySortedCellIds_.end()); - mySortedCellIds_.erase(std::unique(mySortedCellIds_.begin(), mySortedCellIds_.end()), mySortedCellIds_.end()); - - myBoundaryCellIds_.resize(dss[0].size()); - for (int i = 0; i < static_cast<int>(dss[0].size()); ++i) - { - for (int j = 0; j < dss[0][i].dimension(0); ++j) - { - if (std::binary_search(mySortedCellIds_.begin(), mySortedCellIds_.end(), dss[0][i](j))) - { - myBoundaryCellIds_[i].push_back(dss[0][i](j)); - } - } - } - - cte_ = *(meshMgr_->getCellToEdgeMap()); - Intrepid::FieldContainer<int> &nodeDofs = *(dofMgr_->getNodeDofs()); - //Intrepid::FieldContainer<int> &edgeDofs = *(dofMgr_->getEdgeDofs()); - std::vector<std::vector<int>> dofTags = (basisPtrs_[0])->getAllDofTags(); - int numDofsPerNode = 0; - int numDofsPerEdge = 0; - for (int j = 0; j < (basisPtrs_[0])->getCardinality(); ++j) - { - if (dofTags[j][0] == 0) - { - numDofsPerNode = dofTags[j][3]; - } - if (dofTags[j][0] == 1) - { - numDofsPerEdge = dofTags[j][3]; - } - } - // vector field - int nfields = basisPtrs_.size(); - numDofsPerNode = numDofsPerNode * nfields; - numDofsPerEdge = numDofsPerEdge * nfields; - - Intrepid::FieldContainer<Real> &nodes = *meshMgr_->getNodes(); - int n_dbc = my_dbc_.size(); - for (int i = 0; i < static_cast<int>(myBoundaryCellIds_.size()); ++i) - { - bool isdbc = false; - for (int i_dbc = 0; i_dbc < n_dbc; i_dbc++) - { - if (i == my_dbc_[i_dbc]) - { - isdbc = true; - break; - } - } - if (!isdbc) - continue; - - for (int j = 0; j < myBoundaryCellIds_[i].size(); ++j) - { - /* - int ifDBCCell = check_DBC_By_Coords(myBoundaryCellIds_[i][j], i); - if(ifDBCCell < 1) - continue; -*/ - std::vector<Real> x(spaceDim_); - const CellTopologyData *ctd = cellType_.getCellTopologyData(); - Teuchos::ArrayView<unsigned> locNodes(const_cast<unsigned *>(ctd->subcell[spaceDim_ - 1][i].node), cellType_.getVertexCount(spaceDim_ - 1, i)); - for (int l = 0; l < static_cast<int>(cellType_.getVertexCount(spaceDim_ - 1, i)); ++l) - { - x[0] = nodes(ctn_(myBoundaryCellIds_[i][j], locNodes[l]), 0); - x[1] = nodes(ctn_(myBoundaryCellIds_[i][j], locNodes[l]), 1); - // use coordinates to check if a DOF is DBC DOF - int ifDBCNode = check_DBC_Coords_Range(x); - if (ifDBCNode < 0) - { - continue; - } - else if (ifDBCNode == 0) - { - if (verbose_) - { - *outStream_ << "DBC node: " - << ctn_(myBoundaryCellIds_[i][j], locNodes[l]) - << ", fixing X direction" << std::endl; - } - myDirichletDofs_.push_back(nodeDofs(ctn_(myBoundaryCellIds_[i][j], locNodes[l]), 0)); - } - else if (ifDBCNode == 1 && numDofsPerNode >= 2) - { - if (verbose_) - { - *outStream_ << "DBC node: " - << ctn_(myBoundaryCellIds_[i][j], locNodes[l]) - << ", fixing Y direction" << std::endl; - } - myDirichletDofs_.push_back(nodeDofs(ctn_(myBoundaryCellIds_[i][j], locNodes[l]), 1)); - } - else - { - if (verbose_) - { - *outStream_ << "DBC node: " - << ctn_(myBoundaryCellIds_[i][j], locNodes[l]) - << ", fixing ALL direction" << std::endl; - } - for (int k = 0; k < numDofsPerNode; ++k) - { - myDirichletDofs_.push_back(nodeDofs(ctn_(myBoundaryCellIds_[i][j], locNodes[l]), k)); - } - } - } - // edge dofs are NOT in use - /* - for (int k=0; k<numDofsPerEdge; ++k) { - myDirichletDofs_.push_back(edgeDofs(cte_(myBoundaryCellIds_[i][j], i), k)); - } - */ - } - } - std::sort(myDirichletDofs_.begin(), myDirichletDofs_.end()); - myDirichletDofs_.erase(std::unique(myDirichletDofs_.begin(), myDirichletDofs_.end()), myDirichletDofs_.end()); - } - - virtual int check_DBC_Coords_Range(const std::vector<Real> &x) const - { - // return value : - // -1: not a DBC node - // 0: x direction fixed - // 1: y direction fixed - // 5: both x, y direction are fixed - return 5; - } - // - // - // - virtual void process_loading_information(const Teuchos::RCP<Teuchos::ParameterList> &parlist) {} - // - //note that the point load is only allowed to applied on the boundary, not inside the body! 2D only - virtual void check_and_Apply_PointLoad_By_Coords(int globalCellNum, int pointload_bc) - { - Intrepid::FieldContainer<Real> &nodes = *meshMgr_->getNodes(); - const CellTopologyData *ctd = cellType_.getCellTopologyData(); - Teuchos::ArrayView<unsigned> locNodes(const_cast<unsigned *>(ctd->subcell[spaceDim_ - 1][pointload_bc].node), cellType_.getVertexCount(spaceDim_ - 1, pointload_bc)); - std::vector<Real> x1(spaceDim_); - std::vector<Real> x2(spaceDim_); - std::vector<int> localNodeNum(2); - x1[0] = nodes(ctn_(globalCellNum, locNodes[0]), 0); - x1[1] = nodes(ctn_(globalCellNum, locNodes[0]), 1); - x2[0] = nodes(ctn_(globalCellNum, locNodes[1]), 0); - x2[1] = nodes(ctn_(globalCellNum, locNodes[1]), 1); - ApplyPointLoad(pointload_bc, globalCellNum, localNodeNum, x1, x2); - } - - virtual void ApplyPointLoad(const int pointload_bc, - const int globalCellNum, - const std::vector<int> &localNodeNum, - const std::vector<Real> &coord1, - const std::vector<Real> &coord2) - { - //Intrepid::FieldContainer<int> &nodeDofs = *(dofMgr_->getNodeDofs()); - //bool isLoadPosContainedInCurrentSegment = false; - //int whichNodeIsCloserToPos = -1; - return; - } - // - // - // - virtual void EnforceDBC(void) - { - // Apply Dirichlet conditions. - // zero out row and column, make matrix symmetric - Teuchos::RCP<Tpetra::Details::DefaultTypes::node_type> node = matA_->getNode(); - matA_dirichlet_ = matA_->clone(node); - matM_dirichlet_ = matM_->clone(node); - vecF_dirichlet_ = Teuchos::rcp(new Tpetra::MultiVector<>(matA_->getRangeMap(), 1, true)); - Tpetra::deep_copy(*vecF_dirichlet_, *vecF_); - - matA_dirichlet_->resumeFill(); - matM_dirichlet_->resumeFill(); - - int gDof; - for (int i = 0; i < numCells_; i++) - { - for (int j = 0; j < numLocalDofs_; j++) - { - gDof = cellDofs_(myCellIds_[i], j); - if (myUniqueMap_->isNodeGlobalElement(gDof) && check_myGlobalDof_on_boundary(gDof)) - { - size_t numRowEntries = matA_dirichlet_->getNumEntriesInGlobalRow(gDof); - Teuchos::Array<int> indices(numRowEntries, 0); - Teuchos::Array<Real> values(numRowEntries, 0); - Teuchos::Array<Real> canonicalValues(numRowEntries, 0); - Teuchos::Array<Real> zeroValues(numRowEntries, 0); - matA_dirichlet_->getGlobalRowCopy(gDof, indices, values, numRowEntries); - matM_dirichlet_->getGlobalRowCopy(gDof, indices, values, numRowEntries); - for (int k = 0; k < indices.size(); k++) - { - if (indices[k] == gDof) - { - canonicalValues[k] = 1.0; - } - } - matA_dirichlet_->replaceGlobalValues(gDof, indices, canonicalValues); - matM_dirichlet_->replaceGlobalValues(gDof, indices, zeroValues); - vecF_dirichlet_->replaceGlobalValue(gDof, 0, 0); - } - - if (!check_myGlobalDof_on_boundary(gDof)) - { - size_t numDBCDofs = myDirichletDofs_.size(); - Teuchos::Array<int> indices(numDBCDofs, 0); - Teuchos::Array<Real> zeroValues(numDBCDofs, 0); - for (int k = 0; k < indices.size(); k++) - { - indices[k] = myDirichletDofs_[k]; - } - matA_dirichlet_->replaceGlobalValues(gDof, indices, zeroValues); - matM_dirichlet_->replaceGlobalValues(gDof, indices, zeroValues); - } - } - } - matA_dirichlet_->fillComplete(); - matM_dirichlet_->fillComplete(); - } - - virtual void MatrixRemoveDBC(void) - { - // Apply Dirichlet conditions. - // zero out row and column, make matrix symmetric - Teuchos::RCP<Tpetra::Details::DefaultTypes::node_type> node = matA_->getNode(); - matA_dirichlet_ = matA_->clone(node); - matM_dirichlet_ = matM_->clone(node); - - matA_dirichlet_->resumeFill(); - matM_dirichlet_->resumeFill(); - - int gDof; - for (int i = 0; i < numCells_; i++) - { - for (int j = 0; j < numLocalDofs_; j++) - { - gDof = cellDofs_(myCellIds_[i], j); - if (myUniqueMap_->isNodeGlobalElement(gDof) && check_myGlobalDof_on_boundary(gDof)) - { - size_t numRowEntries = matA_dirichlet_->getNumEntriesInGlobalRow(gDof); - Teuchos::Array<int> indices(numRowEntries, 0); - Teuchos::Array<Real> values(numRowEntries, 0); - Teuchos::Array<Real> canonicalValues(numRowEntries, 0); - Teuchos::Array<Real> zeroValues(numRowEntries, 0); - matA_dirichlet_->getGlobalRowCopy(gDof, indices, values, numRowEntries); - matM_dirichlet_->getGlobalRowCopy(gDof, indices, values, numRowEntries); - for (int k = 0; k < indices.size(); k++) - { - if (indices[k] == gDof) - { - canonicalValues[k] = 1.0; - } - } - matA_dirichlet_->replaceGlobalValues(gDof, indices, canonicalValues); - matM_dirichlet_->replaceGlobalValues(gDof, indices, zeroValues); - } - - if (!check_myGlobalDof_on_boundary(gDof)) - { - size_t numDBCDofs = myDirichletDofs_.size(); - Teuchos::Array<int> indices(numDBCDofs, 0); - Teuchos::Array<Real> zeroValues(numDBCDofs, 0); - for (int k = 0; k < indices.size(); k++) - { - indices[k] = myDirichletDofs_[k]; - } - matA_dirichlet_->replaceGlobalValues(gDof, indices, zeroValues); - matM_dirichlet_->replaceGlobalValues(gDof, indices, zeroValues); - } - } - } - matA_dirichlet_->fillComplete(); - matM_dirichlet_->fillComplete(); - } - - virtual void VectorRemoveDBC(void) - { - // Apply Dirichlet conditions. - vecF_dirichlet_ = Teuchos::rcp(new Tpetra::MultiVector<>(matA_->getRangeMap(), 1, true)); - Tpetra::deep_copy(*vecF_dirichlet_, *vecF_); - - int gDof(0); - for (int i = 0; i < numCells_; i++) - { - for (int j = 0; j < numLocalDofs_; j++) - { - gDof = cellDofs_(myCellIds_[i], j); - if (myUniqueMap_->isNodeGlobalElement(gDof) && check_myGlobalDof_on_boundary(gDof)) - { - vecF_dirichlet_->replaceGlobalValue(gDof, 0, 0); - } - } - } - } - /* - virtual void GenerateTransposedMats() { - // Create matrix transposes. - Tpetra::RowMatrixTransposer<> transposerA(matA_dirichlet_); - Tpetra::RowMatrixTransposer<> transposerM(matM_dirichlet_); - matA_dirichlet_trans_ = transposerA.createTranspose(); - matM_dirichlet_trans_ = transposerM.createTranspose(); - } -*/ - - virtual void ConstructSolvers(void) - { - // Construct solver using Amesos2 factory. - try - { - solverA_ = Amesos2::create<Tpetra::CrsMatrix<>, Tpetra::MultiVector<>>("KLU2", matA_dirichlet_); - } - catch (std::invalid_argument e) - { - std::cout << e.what() << std::endl; - } - solverA_->numericFactorization(); - } - - /* - virtual void ConstructAdjointSolvers() { - // Construct solver using Amesos2 factory. - try{ - solverA_trans_ = Amesos2::create< Tpetra::CrsMatrix<>,Tpetra::MultiVector<> >("KLU2", matA_dirichlet_trans_); - } catch (std::invalid_argument e) { - std::cout << e.what() << std::endl; - } - solverA_trans_->numericFactorization(); - } -*/ - - Teuchos::RCP<Tpetra::CrsMatrix<>> getMatA(const bool &transpose = false) const - { - if (transpose) - { - //return matA_dirichlet_trans_; - return matA_dirichlet_; - } - else - { - return matA_dirichlet_; - } - } - - Teuchos::RCP<Tpetra::CrsMatrix<>> getMatB(const bool &transpose = false) const - { - if (transpose) - { - //return matM_dirichlet_trans_; - return matM_dirichlet_; - } - else - { - return matM_dirichlet_; - } - } - - Teuchos::RCP<Tpetra::CrsMatrix<>> getMatM() const - { - return matM_; - } - - Teuchos::RCP<Tpetra::CrsMatrix<>> getMatR() const - { - return matM_; - } - - Teuchos::RCP<Tpetra::MultiVector<>> getVecUd() const - { - return vecUd_; - } - - Teuchos::RCP<Tpetra::MultiVector<>> getVecF() const - { - return vecF_dirichlet_; - } - - Teuchos::RCP<Amesos2::Solver<Tpetra::CrsMatrix<>, Tpetra::MultiVector<>>> getSolver(const bool &transpose = false) const - { - if (transpose) - { - //return solverA_trans_; - return solverA_; - } - else - { - return solverA_; - } - } - - virtual Real funcTarget(const Real &x1, const Real &x2) const { return 0.0; } - - void printMeshData(std::ostream &outStream) const - { - - Teuchos::RCP<Intrepid::FieldContainer<Real>> nodesPtr = meshMgr_->getNodes(); - Teuchos::RCP<Intrepid::FieldContainer<int>> cellToNodeMapPtr = meshMgr_->getCellToNodeMap(); - Intrepid::FieldContainer<Real> &nodes = *nodesPtr; - Intrepid::FieldContainer<int> &cellToNodeMap = *cellToNodeMapPtr; - outStream << "Number of nodes = " << meshMgr_->getNumNodes() << std::endl; - outStream << "Number of cells = " << meshMgr_->getNumCells() << std::endl; - outStream << "Number of edges = " << meshMgr_->getNumEdges() << std::endl; - // Print mesh to file. - if ((myRank_ == 0)) - { - std::ofstream meshfile; - meshfile.open("cell_to_node_quad.txt"); - for (int i = 0; i < cellToNodeMap.dimension(0); ++i) - { - for (int j = 0; j < cellToNodeMap.dimension(1); ++j) - { - meshfile << cellToNodeMap(i, j) << " "; - } - meshfile << std::endl; - } - meshfile.close(); - - meshfile.open("cell_to_node_tri.txt"); - for (int i = 0; i < cellToNodeMap.dimension(0); ++i) - { - for (int j = 0; j < 3; ++j) - { - meshfile << cellToNodeMap(i, j) << " "; - } - meshfile << std::endl; - for (int j = 2; j < 5; ++j) - { - meshfile << cellToNodeMap(i, j % 4) << " "; - } - meshfile << std::endl; - } - meshfile.close(); - - meshfile.open("nodes.txt"); - meshfile.precision(16); - for (int i = 0; i < nodes.dimension(0); ++i) - { - for (int j = 0; j < nodes.dimension(1); ++j) - { - meshfile << std::scientific << nodes(i, j) << " "; - } - meshfile << std::endl; - } - meshfile.close(); - /* This somewhat clunky output is for gnuplot. - meshfile.open("mesh.txt"); - for (int i=0; i<cellToNodeMap.dimension(0); ++i) { - meshfile << nodes(cellToNodeMap(i,0), 0) << " " << nodes(cellToNodeMap(i,0), 1) << std::endl; - meshfile << nodes(cellToNodeMap(i,1), 0) << " " << nodes(cellToNodeMap(i,1), 1) << std::endl; - meshfile << nodes(cellToNodeMap(i,2), 0) << " " << nodes(cellToNodeMap(i,2), 1) << std::endl; - meshfile << nodes(cellToNodeMap(i,3), 0) << " " << nodes(cellToNodeMap(i,3), 1) << std::endl; - meshfile << nodes(cellToNodeMap(i,0), 0) << " " << nodes(cellToNodeMap(i,0), 1) << std::endl; - meshfile << nodes(cellToNodeMap(i,1), 0) << " " << nodes(cellToNodeMap(i,1), 1) << std::endl; - meshfile << nodes(cellToNodeMap(i,2), 0) << " " << nodes(cellToNodeMap(i,2), 1) << std::endl; - } - meshfile.close(); - */ - } //myRank 0 print - } // prinf function end - - void outputTpetraData() const - { - Tpetra::MatrixMarket::Writer<Tpetra::CrsMatrix<>> matWriter; - matWriter.writeSparseFile("stiffness_mat", matA_); - matWriter.writeSparseFile("dirichlet_mat", matA_dirichlet_); - matWriter.writeSparseFile("mass_mat", matM_); - matWriter.writeDenseFile("Ud_vec", vecUd_); - } - - void outputTpetraVector(const Teuchos::RCP<const Tpetra::MultiVector<>> &vec, - const std::string &filename) const - { - Tpetra::MatrixMarket::Writer<Tpetra::CrsMatrix<>> vecWriter; - vecWriter.writeDenseFile(filename, vec); - } - - // ACCESSOR FUNCTIONS - Teuchos::RCP<MeshManager<Real>> &GetMeshManager(void) - { - TEUCHOS_TEST_FOR_EXCEPTION(meshMgr_ == Teuchos::null, std::logic_error, - ">>> (PDE_FEM::GetMeshManager): MeshManager not initialized!"); - return meshMgr_; - } - - Teuchos::RCP<Intrepid::Basis<Real, Intrepid::FieldContainer<Real>>> &GetBasisPtr(const int ind) - { - TEUCHOS_TEST_FOR_EXCEPTION(ind > spaceDim_ - 1 || ind < 0, std::logic_error, - ">>> (PDE_FEM::GetBasisPtr): ind out of bounds!"); - TEUCHOS_TEST_FOR_EXCEPTION(basisPtrs_.size() == 0, std::logic_error, - ">>> (PDE_FEM::GetBasisPtr): BasisPntrs not initialized!"); - return basisPtrs_[ind]; - } - - int GetBasisOrder(void) const - { - return basisOrder_; - } - - int GetSpaceDim(void) const - { - return spaceDim_; - } - - int GetNumCells(void) const - { - return numCells_; - } - - int GetNumLocalDofs(void) const - { - return numLocalDofs_; - } - - int GetNumCubPoints(void) const - { - return numCubPoints_; - } - - int GetLocalFieldSize(void) const - { - return lfs_; - } - -}; // class PDE_FEM - -#endif diff --git a/tlnos/src/TOOLS/bfsc_dof_mesh.hpp b/tlnos/src/TOOLS/bfsc_dof_mesh.hpp deleted file mode 100644 index 29089d28..00000000 --- a/tlnos/src/TOOLS/bfsc_dof_mesh.hpp +++ /dev/null @@ -1,554 +0,0 @@ -// @HEADER -// ************************************************************************ -// -// Rapid Optimization Library (ROL) Package -// Copyright (2014) Sandia Corporation -// -// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -// license for use of this work by or on behalf of the U.S. Government. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact lead developers: -// Drew Kouri (dpkouri@sandia.gov) and -// Denis Ridzal (dridzal@sandia.gov) -// -// ************************************************************************ -// @HEADER - -/*! \file DofManager.hpp - \brief Sets up data structures for the indexing of the global degrees - of freedom (Dof's). -*/ - -#include "Teuchos_ParameterList.hpp" -#include "Intrepid_FieldContainer.hpp" - -template <class Real> -class DofManager -{ - - typedef Intrepid::FieldContainer<Real> FCR; - typedef Intrepid::FieldContainer<int> FCI; - - enum FieldType - { - VELX, - VELY, - PRES - }; - - /* Backward-facing step geometry. - - *************************************************** - * * * * - * 3 * 4 * 5 * - * * * * - ********** * * * * * * * * * * * * * * * * * * * ** - * 1 * 2 * - * * * - ****************************************** -*/ - -private: - Real channelH_; // channel height (height of regions 1+4) - Real channelW_; // channel width (width of regions 3+4+5) - Real stepH_; // step height (height of region 1) - Real stepW_; // step width (width of region 3) - Real observeW_; // width of observation region (width of region 1) - - int nx1_; - int nx2_; - int nx3_; - int nx4_; - int nx5_; - int ny1_; - int ny2_; - int ny3_; - int ny4_; - int ny5_; - - int ref_; - - int numCells_; - int numNodes_; - int numEdges_; - int numMeshEntities_; - - FCR meshNodes_; - FCI meshCellToNodeMap_; - FCI meshCellToEdgeMap_; - - int numDofs_; - int numPres_; - int numVelX_; - int numVelY_; - int numLocalDofs_; - int numLocalPres_; - int numLocalVelX_; - int numLocalVelY_; - - FCI dofArray_; - FCI cellDofs_; - FCI cellPres_; - FCI cellVelX_; - FCI cellVelY_; - -public: - DofManager(Teuchos::ParameterList &parlist) - { - // Geometry data. - channelH_ = parlist.sublist("Navier Stokes").get("Channel height", 1.0); - channelW_ = parlist.sublist("Navier Stokes").get("Channel width", 8.0); - stepH_ = parlist.sublist("Navier Stokes").get("Step height", 0.5); - stepW_ = parlist.sublist("Navier Stokes").get("Step width", 1.0); - observeW_ = parlist.sublist("Navier Stokes").get("Observation width", 3.0); - // Mesh data. - ref_ = parlist.sublist("Navier Stokes").get("Refinement level", 1); - nx1_ = parlist.sublist("Navier Stokes").get("Observation region NX", 4 * ref_); - ny1_ = parlist.sublist("Navier Stokes").get("Observation region NY", 5 * ref_); - nx2_ = parlist.sublist("Navier Stokes").get("Laminar flow region NX", 2 * ref_); - ny2_ = ny1_; - nx3_ = parlist.sublist("Navier Stokes").get("Inflow region NX", 1 * ref_); - ny3_ = parlist.sublist("Navier Stokes").get("Inflow region NY", 2 * ref_); - nx4_ = nx1_; - ny4_ = ny3_; - nx5_ = nx2_; - ny5_ = ny3_; - numCells_ = (nx1_ + nx2_) * ny1_ + (nx3_ + nx1_ + nx2_) * ny3_; - numNodes_ = (nx1_ + nx2_ + 1) * ny1_ + (nx3_ + nx1_ + nx2_ + 1) * (ny3_ + 1); - numEdges_ = (2 * (nx1_ + nx2_) + 1) * ny1_ + (2 * (nx3_ + nx1_ + nx2_) + 1) * ny3_ + (nx3_ + nx1_ + nx2_); - numMeshEntities_ = numCells_ + numNodes_ + numEdges_; - // Mesh and Dof data structures. - numLocalPres_ = 4; - numLocalVelX_ = 9; - numLocalVelY_ = 9; - numLocalDofs_ = numLocalPres_ + numLocalVelX_ + numLocalVelY_; - computeMeshNodes(meshNodes_); - computeMeshCellToNodeMap(meshCellToNodeMap_); - computeMeshCellToEdgeMap(meshCellToEdgeMap_); - computeDofArray(dofArray_, numDofs_); - computeCellDofs(cellDofs_, dofArray_, meshCellToNodeMap_, meshCellToEdgeMap_); - computeCellPres(cellPres_, cellDofs_); - computeCellVelX(cellVelX_, cellDofs_); - computeCellVelY(cellVelY_, cellDofs_); - } - - void computeMeshNodes(FCR &nodes) const - { - - Real dy1 = stepH_ / ny1_; - Real dy3 = (channelH_ - stepH_) / ny3_; - Real dx1 = observeW_ / nx1_; - Real dx2 = (channelW_ - stepW_ - observeW_) / nx2_; - Real dx3 = stepW_ / nx3_; - int nodeCt = 0; - nodes.resize(numNodes_, 2); - - // bottom region - for (int j = 0; j < ny1_; ++j) - { - for (int i = 0; i <= nx1_; ++i) - { - nodes(nodeCt, 0) = stepW_ + i * dx1; - nodes(nodeCt, 1) = j * dy1; - ++nodeCt; - } - for (int i = 0; i < nx2_; ++i) - { - nodes(nodeCt, 0) = stepW_ + observeW_ + (i + 1) * dx2; - nodes(nodeCt, 1) = j * dy1; - ++nodeCt; - } - } - - // top region - for (int j = 0; j <= ny3_; ++j) - { - for (int i = 0; i <= nx3_; ++i) - { - nodes(nodeCt, 0) = i * dx3; - nodes(nodeCt, 1) = stepH_ + j * dy3; - ++nodeCt; - } - for (int i = 0; i < nx1_; ++i) - { - nodes(nodeCt, 0) = stepW_ + (i + 1) * dx1; - nodes(nodeCt, 1) = stepH_ + j * dy3; - ++nodeCt; - } - for (int i = 0; i < nx2_; ++i) - { - nodes(nodeCt, 0) = stepW_ + observeW_ + (i + 1) * dx2; - nodes(nodeCt, 1) = stepH_ + j * dy3; - ++nodeCt; - } - } - - } // computeMeshNodes - - void computeMeshCellToNodeMap(FCI &ctn) - { - - int cellCt = 0; - ctn.resize(numCells_, 4); - - // bottom region - for (int j = 0; j < ny1_ - 1; ++j) - { - for (int i = 0; i < nx1_ + nx2_; ++i) - { - ctn(cellCt, 0) = j * (nx1_ + nx2_ + 1) + i; - ctn(cellCt, 1) = j * (nx1_ + nx2_ + 1) + (i + 1); - ctn(cellCt, 2) = (j + 1) * (nx1_ + nx2_ + 1) + (i + 1); - ctn(cellCt, 3) = (j + 1) * (nx1_ + nx2_ + 1) + i; - ++cellCt; - } - } - - // transition region - for (int i = 0; i < nx1_ + nx2_; ++i) - { - ctn(cellCt, 0) = (ny1_ - 1) * (nx1_ + nx2_ + 1) + i; - ctn(cellCt, 1) = (ny1_ - 1) * (nx1_ + nx2_ + 1) + (i + 1); - ctn(cellCt, 2) = ny1_ * (nx1_ + nx2_ + 1) + nx3_ + (i + 1); - ctn(cellCt, 3) = ny1_ * (nx1_ + nx2_ + 1) + nx3_ + i; - ++cellCt; - } - - // top region - for (int j = 0; j < ny3_; ++j) - { - for (int i = 0; i < nx3_ + nx1_ + nx2_; ++i) - { - ctn(cellCt, 0) = ny1_ * (nx1_ + nx2_ + 1) + j * (nx3_ + nx1_ + nx2_ + 1) + i; - ctn(cellCt, 1) = ny1_ * (nx1_ + nx2_ + 1) + j * (nx3_ + nx1_ + nx2_ + 1) + (i + 1); - ctn(cellCt, 2) = ny1_ * (nx1_ + nx2_ + 1) + (j + 1) * (nx3_ + nx1_ + nx2_ + 1) + (i + 1); - ctn(cellCt, 3) = ny1_ * (nx1_ + nx2_ + 1) + (j + 1) * (nx3_ + nx1_ + nx2_ + 1) + i; - ++cellCt; - } - } - - } // computeMeshCellToNodeMap - - void computeMeshCellToEdgeMap(FCI &cte) - { - - int cellCt = 0; - cte.resize(numCells_, 4); - - // bottom region - for (int j = 0; j < ny1_ - 1; ++j) - { - for (int i = 0; i < nx1_ + nx2_; ++i) - { - cte(cellCt, 0) = j * (2 * (nx1_ + nx2_) + 1) + i; - cte(cellCt, 1) = j * (2 * (nx1_ + nx2_) + 1) + (nx1_ + nx2_) + (i + 1); - cte(cellCt, 2) = (j + 1) * (2 * (nx1_ + nx2_) + 1) + i; - cte(cellCt, 3) = j * (2 * (nx1_ + nx2_) + 1) + (nx1_ + nx2_) + i; - ++cellCt; - } - } - - // transition region - for (int i = 0; i < nx1_ + nx2_; ++i) - { - cte(cellCt, 0) = (ny1_ - 1) * (2 * (nx1_ + nx2_) + 1) + i; - cte(cellCt, 1) = (ny1_ - 1) * (2 * (nx1_ + nx2_) + 1) + (nx1_ + nx2_) + (i + 1); - cte(cellCt, 2) = ny1_ * (2 * (nx1_ + nx2_) + 1) + nx3_ + i; - cte(cellCt, 3) = (ny1_ - 1) * (2 * (nx1_ + nx2_) + 1) + (nx1_ + nx2_) + i; - ++cellCt; - } - - // top region - for (int j = 0; j < ny3_; ++j) - { - for (int i = 0; i < nx3_ + nx1_ + nx2_; ++i) - { - cte(cellCt, 0) = ny1_ * (2 * (nx1_ + nx2_) + 1) + j * (2 * (nx3_ + nx1_ + nx2_) + 1) + i; - cte(cellCt, 1) = ny1_ * (2 * (nx1_ + nx2_) + 1) + j * (2 * (nx3_ + nx1_ + nx2_) + 1) + (nx3_ + nx1_ + nx2_) + (i + 1); - cte(cellCt, 2) = ny1_ * (2 * (nx1_ + nx2_) + 1) + (j + 1) * (2 * (nx3_ + nx1_ + nx2_) + 1) + i; - cte(cellCt, 3) = ny1_ * (2 * (nx1_ + nx2_) + 1) + j * (2 * (nx3_ + nx1_ + nx2_) + 1) + (nx3_ + nx1_ + nx2_) + i; - ++cellCt; - } - } - - } // computeMeshCellToEdgeMap - - void computeDofArray(FCI &dof, int &numDofs, const int &globOrder = 1) - { - - dof.resize(numMeshEntities_, 3); - int dofCt = -1; - - if (globOrder == 1) - { - // - // This is the independent node id --> edge id --> cell id ordering: - // - // VelX VelY Pres - // -------------- - // n1 1 1 1 - // n2 1 1 1 - // ... - // e1 1 1 0 - // e2 1 1 0 - // ... - // c1 1 1 0 - // c2 1 1 0 - // ... - // - for (int i = 0; i < numNodes_; ++i) - { - // dof(i, 1) --> 1 Velocity X - // dof(i, 1) --> 1 Velocity Y - // dof(i, 2) --> 1 Pressure - dof(i, 0) = ++dofCt; // VelX - dof(i, 1) = ++dofCt; // VelY - dof(i, 2) = ++dofCt; // Pres - } - for (int i = numNodes_; i < numNodes_ + numEdges_; ++i) - { - // dof(i, 1) --> 1 Velocity X - // dof(i, 1) --> 1 Velocity Y - // dof(i, 2) --> 0 Pressure - dof(i, 0) = ++dofCt; // VelX - dof(i, 1) = ++dofCt; // VelY - dof(i, 2) = -1; - } - for (int i = numNodes_ + numEdges_; i < numMeshEntities_; ++i) - { - // dof(i, 1) --> 1 Velocity X - // dof(i, 1) --> 1 Velocity Y - // dof(i, 2) --> 0 Pressure - dof(i, 0) = ++dofCt; // VelX - dof(i, 1) = ++dofCt; // VelY - dof(i, 2) = -1; - } - } - else if (globOrder == 2) - { - // - // This is the cell-driven cell node id --> cell edge id --> cell id ordering: - // - // VelX VelY Pres - // -------------- - // cell 1 - // n1 1 1 1 - // n2 1 1 1 - // ... - // e1 1 1 0 - // e2 1 1 0 - // ... - // c1 1 1 0 - // c2 1 1 0 - // ... - // cell 2 - // ... - // (unique ids only, of course) - // - // TO BE IMPLEMENTED!!! - } - numDofs = dofCt + 1; - } // computeDofArray - - void computeCellDofs(FCI &cdofs, const FCI &dofs, const FCI &ctn, const FCI &cte) - { - - cdofs.resize(numCells_, numLocalDofs_); - - for (int i = 0; i < numCells_; ++i) - { - int ct = -1; - int gid0 = ctn(i, 0); - int gid1 = ctn(i, 1); - int gid2 = ctn(i, 2); - int gid3 = ctn(i, 3); - int gid4 = numNodes_ + cte(i, 0); - int gid5 = numNodes_ + cte(i, 1); - int gid6 = numNodes_ + cte(i, 2); - int gid7 = numNodes_ + cte(i, 3); - int gid8 = numNodes_ + numEdges_ + i; - cdofs(i, ++ct) = dofs(gid0, 0); - cdofs(i, ++ct) = dofs(gid0, 1); - cdofs(i, ++ct) = dofs(gid0, 2); - cdofs(i, ++ct) = dofs(gid1, 0); - cdofs(i, ++ct) = dofs(gid1, 1); - cdofs(i, ++ct) = dofs(gid1, 2); - cdofs(i, ++ct) = dofs(gid2, 0); - cdofs(i, ++ct) = dofs(gid2, 1); - cdofs(i, ++ct) = dofs(gid2, 2); - cdofs(i, ++ct) = dofs(gid3, 0); - cdofs(i, ++ct) = dofs(gid3, 1); - cdofs(i, ++ct) = dofs(gid3, 2); - cdofs(i, ++ct) = dofs(gid4, 0); - cdofs(i, ++ct) = dofs(gid4, 1); - cdofs(i, ++ct) = dofs(gid5, 0); - cdofs(i, ++ct) = dofs(gid5, 1); - cdofs(i, ++ct) = dofs(gid6, 0); - cdofs(i, ++ct) = dofs(gid6, 1); - cdofs(i, ++ct) = dofs(gid7, 0); - cdofs(i, ++ct) = dofs(gid7, 1); - cdofs(i, ++ct) = dofs(gid8, 0); - cdofs(i, ++ct) = dofs(gid8, 1); - } - } // computeCellDofs - - void computeCellPres(FCI &cpres, const FCI &cdofs) - { - cpres.resize(numCells_, numLocalPres_); - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < numLocalPres_; ++j) - { - cpres(i, j) = cdofs(i, j * 3 + 2); - } - } - } // computeCellPres - - void computeCellVelX(FCI &cvelx, const FCI &cdofs) - { - cvelx.resize(numCells_, numLocalVelX_); - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < numLocalPres_; ++j) - { - cvelx(i, j) = cdofs(i, j * 3); - } - for (int k = 0; k < numLocalVelX_ - numLocalPres_; ++k) - { - cvelx(i, k + numLocalPres_) = cdofs(i, 4 * 3 + k * 2); - } - } - } // computeCellVelX - - void computeCellVelY(FCI &cvely, const FCI &cdofs) - { - cvely.resize(numCells_, numLocalVelY_); - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < numLocalPres_; ++j) - { - cvely(i, j) = cdofs(i, j * 3 + 1); - } - for (int k = 0; k < numLocalVelY_ - numLocalPres_; ++k) - { - cvely(i, k + numLocalPres_) = cdofs(i, 4 * 3 + k * 2 + 1); - } - } - } // computeCellVelY - - std::vector<int> &getCellDofs(const int &cid, const FieldType &ft) const - { - std::vector<int> dofVec; - int nPres = 4; - int nVelX = 9; - int nVelY = 9; - switch (ft) - { - case VELX: - break; - - case VELY: - break; - - case PRES: - for (int i = 0; i < nPres; ++i) - { - dofVec.push_back(cellDofs_(cid)); - } - break; - } - return dofVec; - } // getDofArray - - void setRefinementLevel(const int &refLevel) - { - ref_ = refLevel; - } // setRefinementLevel - - int getNumCells() const - { - return numCells_; - } // getNumCells - - int getNumNodes() const - { - return numNodes_; - } // getNumNodes - - int getNumEdges() const - { - return numEdges_; - } // getNumEdges - - const FCR &getMeshNodes() const - { - return meshNodes_; - } // getMeshNodes - - const FCI &getMeshCellToNodeMap() const - { - return meshCellToNodeMap_; - } // getMeshCellToNodeMap - - const FCI &getMeshCellToEdgeMap() const - { - return meshCellToEdgeMap_; - } // getMeshCellToEdgeMap - - int getNumDofs() const - { - return numDofs_; - } // getNumDofs - - const FCI &getDofArray() const - { - return dofArray_; - } // getDofArray - - const FCI &getCellDofs() const - { - return cellDofs_; - } // getCellDofs - - const FCI &getCellPres() const - { - return cellPres_; - } // getCellPres - - const FCI &getCellVelX() const - { - return cellVelX_; - } // getCellVelX - - const FCI &getCellVelY() const - { - return cellVelY_; - } // getCellVelY -}; diff --git a/tlnos/src/TOOLS/dofmanager.hpp b/tlnos/src/TOOLS/dofmanager.hpp deleted file mode 100644 index 6fb62a89..00000000 --- a/tlnos/src/TOOLS/dofmanager.hpp +++ /dev/null @@ -1,419 +0,0 @@ -// @HEADER -// ************************************************************************ -// -// Rapid Optimization Library (ROL) Package -// Copyright (2014) Sandia Corporation -// -// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -// license for use of this work by or on behalf of the U.S. Government. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact lead developers: -// Drew Kouri (dpkouri@sandia.gov) and -// Denis Ridzal (dridzal@sandia.gov) -// -// ************************************************************************ -// @HEADER - -/*! \file dofmanager.hpp - \brief Given a mesh with connectivity information, sets up data - structures for the indexing of the global degrees of - freedom (Dofs). -*/ - -#ifndef DOFMANAGER_HPP -#define DOFMANAGER_HPP - -#include "Teuchos_ParameterList.hpp" -#include "Intrepid_FieldContainer.hpp" -#include "Intrepid_Basis.hpp" -#include "meshmanager.hpp" - -template <class Real> -class DofManager -{ - -private: - Teuchos::RCP<MeshManager<Real>> meshManager_; - std::vector<Teuchos::RCP<Intrepid::Basis<Real, Intrepid::FieldContainer<Real>>>> intrepidBasis_; - - int numCells_; // number of mesh cells - int numNodes_; // number of mesh nodes - int numEdges_; // number of mesh edges - - Teuchos::RCP<Intrepid::FieldContainer<int>> meshCellToNodeMap_; - Teuchos::RCP<Intrepid::FieldContainer<int>> meshCellToEdgeMap_; - - // Local dof information. - int numBases_; // number of bases (fields) - int numLocalNodes_; // number of nodes in the basic cell topology - int numLocalEdges_; // number of edges in the basic cell topology - int numLocalFaces_; // number of faces in the basic cell topology - int numLocalNodeDofs_; // number of local (single-cell) node dofs for all bases - int numLocalEdgeDofs_; // number of local (single-cell) edge dofs for all bases - int numLocalFaceDofs_; // number of local (single-cell) face dofs for all bases - int numLocalDofs_; // total number of local (single-cell) face dofs for all bases - std::vector<int> numDofsPerNode_; // number of dofs per node in a cell (assumed constant), per basis - std::vector<int> numDofsPerEdge_; // number of dofs per edge in a cell (assumed constant), per basis - std::vector<int> numDofsPerFace_; // number of dofs per face in a cell (assumed constant), per basis - std::vector<std::vector<int>> fieldPattern_; // local indexing of fields into the array [0,1,...,numLocalDofs-1]; - // contains [number of bases] index vectors, where each index vector - // is of size [basis cardinality] - // Global dof information. - int numNodeDofs_; // number of global node dofs - int numEdgeDofs_; // number of global edge dofs - int numFaceDofs_; // number of global face dofs - int numDofs_; // total number of global dofs - - Teuchos::RCP<Intrepid::FieldContainer<int>> nodeDofs_; // global node dofs, of size [numNodes_ x numLocalNodeDofs_] - Teuchos::RCP<Intrepid::FieldContainer<int>> edgeDofs_; // global edge dofs, of size [numEdges_ x numLocalEdgeDofs_] - Teuchos::RCP<Intrepid::FieldContainer<int>> faceDofs_; // global face dofs, of size [numFaces_ x numLocalFaceDofs_] - Teuchos::RCP<Intrepid::FieldContainer<int>> cellDofs_; // global cell dofs, of size [numCells_ x numLocalDofs_]; - // ordered by subcell (node, then edge, then face) and basis index - - std::vector<Teuchos::RCP<Intrepid::FieldContainer<int>>> fieldDofs_; // global cell dofs, indexed by field/basis, of size [numCells_ x basis cardinality]; - // ordered by subcell (node, then edge, then face) - -public: - DofManager(Teuchos::RCP<MeshManager<Real>> &meshManager, - std::vector<Teuchos::RCP<Intrepid::Basis<Real, Intrepid::FieldContainer<Real>>>> &intrepidBasis) - { - - meshManager_ = meshManager; - intrepidBasis_ = intrepidBasis; - numCells_ = meshManager_->getNumCells(); - numNodes_ = meshManager_->getNumNodes(); - numEdges_ = meshManager_->getNumEdges(); - - // Mesh data structures. - meshCellToNodeMap_ = meshManager_->getCellToNodeMap(); - meshCellToEdgeMap_ = meshManager_->getCellToEdgeMap(); - - // Local degree-of-freedom footprint. - numBases_ = static_cast<int>(intrepidBasis_.size()); - numDofsPerNode_.resize(numBases_, 0); - numDofsPerEdge_.resize(numBases_, 0); - numDofsPerFace_.resize(numBases_, 0); - numLocalDofs_ = 0; - for (int i = 0; i < numBases_; ++i) - { - std::vector<std::vector<int>> dofTags = (intrepidBasis_[i])->getAllDofTags(); - for (int j = 0; j < (intrepidBasis_[i])->getCardinality(); j++) - { - if (dofTags[j][0] == 0) - { - numDofsPerNode_[i] = dofTags[j][3]; - } - else if (dofTags[j][0] == 1) - { - numDofsPerEdge_[i] = dofTags[j][3]; - } - else if (dofTags[j][0] == 2) - { - numDofsPerFace_[i] = dofTags[j][3]; - } - } - numLocalDofs_ += (intrepidBasis_[i])->getCardinality(); - } - numLocalNodeDofs_ = 0; - numLocalEdgeDofs_ = 0; - numLocalFaceDofs_ = 0; - for (int i = 0; i < numBases_; ++i) - { - numLocalNodeDofs_ += numDofsPerNode_[i]; - numLocalEdgeDofs_ += numDofsPerEdge_[i]; - numLocalFaceDofs_ += numDofsPerFace_[i]; - } - numLocalNodes_ = static_cast<int>((intrepidBasis_[0])->getBaseCellTopology().getVertexCount()); - numLocalEdges_ = static_cast<int>((intrepidBasis_[0])->getBaseCellTopology().getEdgeCount()); - numLocalFaces_ = 1; - computeFieldPattern(); - - // Global data structures. - computeDofArrays(); - computeCellDofs(); - computeFieldDofs(); - } - - Teuchos::RCP<Intrepid::FieldContainer<int>> getNodeDofs() const - { - return nodeDofs_; - } - - Teuchos::RCP<Intrepid::FieldContainer<int>> getEdgeDofs() const - { - return edgeDofs_; - } - - Teuchos::RCP<Intrepid::FieldContainer<int>> getFaceDofs() const - { - return faceDofs_; - } - - Teuchos::RCP<Intrepid::FieldContainer<int>> getCellDofs() const - { - return cellDofs_; - } - - std::vector<Teuchos::RCP<Intrepid::FieldContainer<int>>> getFieldDofs() const - { - return fieldDofs_; - } - - Teuchos::RCP<Intrepid::FieldContainer<int>> getFieldDofs(const int &fieldNumber) const - { - return fieldDofs_[fieldNumber]; - } - - int getNumNodeDofs() const - { - return numNodeDofs_; - } - - int getNumEdgeDofs() const - { - return numEdgeDofs_; - } - - int getNumFaceDofs() const - { - return numFaceDofs_; - } - - int getNumDofs() const - { - return numDofs_; - } - - int getNumFields() const - { - return numBases_; - } - - int getLocalFieldSize(const int &fieldNumber) const - { - return (intrepidBasis_[fieldNumber])->getCardinality(); - } - - std::vector<std::vector<int>> getFieldPattern() const - { - return fieldPattern_; - } - - std::vector<int> getFieldPattern(const int &fieldNumber) const - { - return fieldPattern_[fieldNumber]; - } - -private: - void computeDofArrays() - { - - nodeDofs_ = Teuchos::rcp(new Intrepid::FieldContainer<int>(numNodes_, numLocalNodeDofs_)); - edgeDofs_ = Teuchos::rcp(new Intrepid::FieldContainer<int>(numEdges_, numLocalEdgeDofs_)); - faceDofs_ = Teuchos::rcp(new Intrepid::FieldContainer<int>(numCells_, numLocalFaceDofs_)); - - Intrepid::FieldContainer<int> &nodeDofs = *nodeDofs_; - Intrepid::FieldContainer<int> &edgeDofs = *edgeDofs_; - Intrepid::FieldContainer<int> &faceDofs = *faceDofs_; - - int dofCt = -1; - - // - // This is the independent node id --> edge id --> cell id ordering. - // For example, for a Q2-Q2-Q1 basis (Taylor-Hood), we would have: - // - // Q2 Q2 Q1 - // -------------- - // n1 1 1 1 - // n2 1 1 1 - // ... - // e1 1 1 0 - // e2 1 1 0 - // ... - // c1 1 1 0 - // c2 1 1 0 - // ... - // - - // count node dofs - for (int i = 0; i < numNodes_; ++i) - { - int locNodeCt = -1; - for (int j = 0; j < numBases_; ++j) - { - for (int k = 0; k < numDofsPerNode_[j]; ++k) - { - nodeDofs(i, ++locNodeCt) = ++dofCt; - } - } - } - numNodeDofs_ = dofCt + 1; - - // count edge dofs - for (int i = 0; i < numEdges_; ++i) - { - int locEdgeCt = -1; - for (int j = 0; j < numBases_; ++j) - { - for (int k = 0; k < numDofsPerEdge_[j]; ++k) - { - edgeDofs(i, ++locEdgeCt) = ++dofCt; - } - } - } - numEdgeDofs_ = dofCt + 1 - numNodeDofs_; - - // count face dofs - for (int i = 0; i < numCells_; ++i) - { - int locFaceCt = -1; - for (int j = 0; j < numBases_; ++j) - { - for (int k = 0; k < numDofsPerFace_[j]; ++k) - { - faceDofs(i, ++locFaceCt) = ++dofCt; - } - } - } - numFaceDofs_ = dofCt + 1 - numNodeDofs_ - numEdgeDofs_; - - numDofs_ = numNodeDofs_ + numEdgeDofs_ + numFaceDofs_; - - } // computeDofArrays - - void computeCellDofs() - { - - cellDofs_ = Teuchos::rcp(new Intrepid::FieldContainer<int>(numCells_, numLocalDofs_)); - - // Grab object references, for easier indexing. - Intrepid::FieldContainer<int> &cdofs = *cellDofs_; - Intrepid::FieldContainer<int> &nodeDofs = *nodeDofs_; - Intrepid::FieldContainer<int> &edgeDofs = *edgeDofs_; - Intrepid::FieldContainer<int> &faceDofs = *faceDofs_; - Intrepid::FieldContainer<int> &ctn = *meshCellToNodeMap_; - Intrepid::FieldContainer<int> &cte = *meshCellToEdgeMap_; - - for (int i = 0; i < numCells_; ++i) - { - int ct = -1; - for (int j = 0; j < numLocalNodes_; ++j) - { - for (int k = 0; k < numLocalNodeDofs_; ++k) - { - cdofs(i, ++ct) = nodeDofs(ctn(i, j), k); - } - } - for (int j = 0; j < numLocalEdges_; ++j) - { - for (int k = 0; k < numLocalEdgeDofs_; ++k) - { - cdofs(i, ++ct) = edgeDofs(cte(i, j), k); - } - } - for (int j = 0; j < numLocalFaces_; ++j) - { - for (int k = 0; k < numLocalFaceDofs_; ++k) - { - cdofs(i, ++ct) = faceDofs(i, k); - } - } - } - } // computeCellDofs - - void computeFieldPattern() - { - - fieldPattern_.resize(numBases_); - - int dofCt = -1; - - // count node dofs - for (int i = 0; i < numLocalNodes_; ++i) - { - for (int j = 0; j < numBases_; ++j) - { - for (int k = 0; k < numDofsPerNode_[j]; ++k) - { - fieldPattern_[j].push_back(++dofCt); - } - } - } - - // count edge dofs - for (int i = 0; i < numLocalEdges_; ++i) - { - for (int j = 0; j < numBases_; ++j) - { - for (int k = 0; k < numDofsPerEdge_[j]; ++k) - { - fieldPattern_[j].push_back(++dofCt); - } - } - } - - // count face dofs - for (int i = 0; i < numLocalFaces_; ++i) - { - for (int j = 0; j < numBases_; ++j) - { - for (int k = 0; k < numDofsPerFace_[j]; ++k) - { - fieldPattern_[j].push_back(++dofCt); - } - } - } - - } // computeFieldPattern - - void computeFieldDofs() - { - - fieldDofs_.resize(numBases_); - - Intrepid::FieldContainer<int> &cdofs = *cellDofs_; - - for (int fieldNum = 0; fieldNum < numBases_; ++fieldNum) - { - int basisCard = intrepidBasis_[fieldNum]->getCardinality(); - fieldDofs_[fieldNum] = Teuchos::rcp(new Intrepid::FieldContainer<int>(numCells_, basisCard)); - Intrepid::FieldContainer<int> &fdofs = *(fieldDofs_[fieldNum]); - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < basisCard; ++j) - { - fdofs(i, j) = cdofs(i, fieldPattern_[fieldNum][j]); - } - } - } - } // computeFieldDofs -}; - -#endif diff --git a/tlnos/src/TOOLS/elasticity.hpp b/tlnos/src/TOOLS/elasticity.hpp deleted file mode 100644 index 47c7c4f4..00000000 --- a/tlnos/src/TOOLS/elasticity.hpp +++ /dev/null @@ -1,947 +0,0 @@ -// @HEADER -// ************************************************************************ -// -// Rapid Optimization Library (ROL) Package -// Copyright (2014) Sandia Corporation -// -// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -// license for use of this work by or on behalf of the U.S. Government. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact lead developers: -// Drew Kouri (dpkouri@sandia.gov) and -// Denis Ridzal (dridzal@sandia.gov) -// -// ************************************************************************ -// @HEADER - -#ifndef ROL_PDEOPT_ELASTICITY_H -#define ROL_PDEOPT_ELASTICITY_H - -#include "Intrepid_DefaultCubatureFactory.hpp" -#include "Intrepid_HGRAD_QUAD_C2_FEM.hpp" -#include "Intrepid_HGRAD_QUAD_C1_FEM.hpp" -#include "../TOOLS/PDE_FEM.hpp" -#include "../TOOLS/materials.hpp" - -#include "ROL_Types.hpp" - -template <class Real> -class Elasticity : public PDE_FEM<Real> -{ -protected: - Real E_; - Real poissonR_; - bool planeStrain_; - - // dbc cases - int DBC_Case_; - // parametrized loads - std::vector<Real> param_; - // geometry and loads information - Real xmin_; - Real ymin_; - Real xmax_; - Real ymax_; - // body force - Real bodyforce_Magnitude_; - Real bodyforce_Angle_; - // traction - int traction_Side_; - Real traction_Magnitude_; - Real traction_Angle_; - // point load - Real pointload_loc_x_; - Real pointload_loc_y_; - Real pointload_Magnitude_; - Real pointload_Angle_; - std::vector<int> my_pointload_bc_; - // - - std::vector<Teuchos::RCP<Material<Real>>> material_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> BMat_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> BMatWeighted_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> CBMat_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> NMat_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> NMatWeighted_; - int materialTensorDim_; - - // for boundary integration of traction force - Teuchos::RCP<Intrepid::FieldContainer<Real>> NMatWeighted_Side; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cub_points_side; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cub_weights_side; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cub_points_side_refcell; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cub_points_side_physical; - Teuchos::RCP<Intrepid::FieldContainer<Real>> jacobian_side_refcell; - Teuchos::RCP<Intrepid::FieldContainer<Real>> jacobian_det_side_refcell; - Teuchos::RCP<Intrepid::FieldContainer<Real>> weighted_measure_side_refcell; - Teuchos::RCP<Intrepid::FieldContainer<Real>> value_of_basis_at_cub_points_side_refcell; - Teuchos::RCP<Intrepid::FieldContainer<Real>> transformed_value_of_basis_at_cub_points_side_refcell; - Teuchos::RCP<Intrepid::FieldContainer<Real>> weighted_transformed_value_of_basis_at_cub_points_side_refcell; - Teuchos::RCP<Intrepid::FieldContainer<Real>> tractions; - Teuchos::RCP<Intrepid::FieldContainer<Real>> tractions_on_dofs; - - bool verbose_; - - Real DegreesToRadians(const Real deg) const - { - return deg * static_cast<Real>(M_PI) / static_cast<Real>(180); - } - - void PrintLoadingInformation(void) - { - if (verbose_) - { - *this->outStream_ << std::endl - << std::string(80, '-') << std::endl; - *this->outStream_ << std::string(20, ' ') << "LOADING INFORMATION" << std::endl; - *this->outStream_ << std::string(80, '-') << std::endl; - *this->outStream_ << " Volumetric Force Magnitude: " << param_[0] << std::endl; - *this->outStream_ << " Volumetric Force Angle: " << param_[1] << std::endl; - *this->outStream_ << " Traction Side: " << traction_Side_ << std::endl; - *this->outStream_ << " Traction Force Magnitude: " << param_[2] << std::endl; - *this->outStream_ << " Traction Force Angle: " << param_[3] << std::endl; - *this->outStream_ << " Point Force Location: " - << "(" << pointload_loc_x_ - << ", " << pointload_loc_y_ << ")" << std::endl; - *this->outStream_ << " Point Force Magnitude: " << param_[4] << std::endl; - *this->outStream_ << " Point Force Angle: " << param_[5] << std::endl; - *this->outStream_ << std::string(80, '-') << std::endl - << std::endl; - } - } - // -public: - Elasticity() {} - virtual ~Elasticity() {} - - virtual void Initialize(const Teuchos::RCP<const Teuchos::Comm<int>> &comm, - const Teuchos::RCP<Teuchos::ParameterList> &parlist, - const Teuchos::RCP<std::ostream> &outStream) - { - /****************************************************************************/ - /*** Initialize the base PDE_FEM class. *************************************/ - /****************************************************************************/ - PDE_FEM<Real>::Initialize(comm, parlist, outStream); - - /****************************************************************************/ - /*** Grab the elasticity information. ***************************************/ - /****************************************************************************/ - Teuchos::ParameterList &Elist = parlist->sublist("Elasticity"); - planeStrain_ = Elist.get<bool>("Plane Strain"); - E_ = Elist.get<Real>("Young's Modulus"); - poissonR_ = Elist.get<Real>("Poisson Ratio"); - Teuchos::ParameterList &Glist = parlist->sublist("Geometry"); - xmin_ = Glist.get<Real>("X0"); - ymin_ = Glist.get<Real>("Y0"); - xmax_ = Glist.get<Real>("Width"); - ymax_ = Glist.get<Real>("Height"); - // DBC cases - DBC_Case_ = Elist.get<int>("DBC Case"); - - /****************************************************************************/ - /*** Initialize mesh / finite element fields / degree-of-freedom manager. ***/ - /****************************************************************************/ - Teuchos::ParameterList &Plist = parlist->sublist("PDE FEM"); - verbose_ = Plist.get("Verbose Output", false); - int basisOrder = Plist.get<int>("Order of FE Discretization"); - Teuchos::RCP<MeshManager<Real>> meshMgr = Teuchos::rcp(new MeshManager_Rectangle<Real>(*parlist)); - int spaceDim = 2; - std::vector<Teuchos::RCP<Intrepid::Basis<Real, Intrepid::FieldContainer<Real>>>> basisPtrs(spaceDim, Teuchos::null); - for (int k = 0; k < spaceDim; ++k) - { - if (basisOrder == 1) - { - basisPtrs[k] = Teuchos::rcp(new Intrepid::Basis_HGRAD_QUAD_C1_FEM<Real, Intrepid::FieldContainer<Real>>); - } - else if (basisOrder == 2) - { - basisPtrs[k] = Teuchos::rcp(new Intrepid::Basis_HGRAD_QUAD_C2_FEM<Real, Intrepid::FieldContainer<Real>>); - } - else - { - TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error, - ">>> (Elasticity::Initialize): Basis Order is out of bounds!"); - } - } - PDE_FEM<Real>::SetDiscretization(meshMgr, basisPtrs); - PDE_FEM<Real>::printMeshData(*outStream); - } - - // for rectangular domain - virtual void process_loading_information(const Teuchos::RCP<Teuchos::ParameterList> &parlist) - { - Teuchos::ParameterList &Elist = parlist->sublist("Elasticity"); - bodyforce_Magnitude_ = Elist.get<Real>("Bodyforce Magnitude"); - bodyforce_Angle_ = Elist.get<Real>("Bodyforce Angle"); - traction_Side_ = Elist.get<int>("Traction Side"); - traction_Magnitude_ = Elist.get<Real>("Traction Magnitude"); - traction_Angle_ = Elist.get<Real>("Traction Angle"); - pointload_loc_x_ = Elist.get<Real>("Pointload Location X"); - pointload_loc_y_ = Elist.get<Real>("Pointload Location Y"); - pointload_Magnitude_ = Elist.get<Real>("Pointload Magnitude"); - pointload_Angle_ = Elist.get<Real>("Pointload Angle"); - - param_.clear(); - param_.resize(6); - param_[0] = bodyforce_Magnitude_; - param_[1] = bodyforce_Angle_; - param_[2] = traction_Magnitude_; - param_[3] = traction_Angle_; - param_[4] = pointload_Magnitude_; - param_[5] = pointload_Angle_; - - PrintLoadingInformation(); - - this->my_nbc_.push_back(traction_Side_); - - // calculate the distance of the point load to the boundary - // and move it to the closesd boundary point only works for - // rectangular domain first make sure the point load is in - // the domain - TEUCHOS_TEST_FOR_EXCEPTION(pointload_loc_x_ < xmin_, std::invalid_argument, - ">>> (elasticity::process_loading_information): x location of point load is less than xmin!"); - TEUCHOS_TEST_FOR_EXCEPTION(pointload_loc_x_ > xmax_, std::invalid_argument, - ">>> (elasticity::process_loading_information): x location of point load is greater than xmax!"); - TEUCHOS_TEST_FOR_EXCEPTION(pointload_loc_y_ < ymin_, std::invalid_argument, - ">>> (elasticity::process_loading_information): y location of point load is less than ymin!"); - TEUCHOS_TEST_FOR_EXCEPTION(pointload_loc_y_ > ymax_, std::invalid_argument, - ">>> (elasticity::process_loading_information): y location of point load is greater than ymax!"); - // - Real distx1 = std::abs(pointload_loc_x_ - xmin_); - Real distx2 = std::abs(pointload_loc_x_ - xmax_); - Real movx = std::min(distx1, distx2); - Real disty1 = std::abs(pointload_loc_y_ - ymin_); - Real disty2 = std::abs(pointload_loc_y_ - ymax_); - Real movy = std::min(disty1, disty2); - // slight perturbation - // pointload will be moved to the closest boundary node eventually - // perturbation trick to avoid parrallel issues - Real eps = 1e-8 * (std::min((xmax_ - xmin_), (ymax_ - ymin_))); - if (movx <= movy && distx1 <= distx2) - { - // mov load to the left boundary - pointload_loc_x_ = xmin_ + eps; - my_pointload_bc_.push_back(3); - // perturb y - if (disty1 <= disty2) - { - pointload_loc_y_ = pointload_loc_y_ + eps; - } - else - { - pointload_loc_y_ = pointload_loc_y_ - eps; - } - } - else if (movx <= movy && distx1 > distx2) - { - // mov load to the right boundary - pointload_loc_x_ = xmax_ - eps; - my_pointload_bc_.push_back(1); - //perturb y - if (disty1 <= disty2) - { - pointload_loc_y_ = pointload_loc_y_ + eps; - } - else - { - pointload_loc_y_ = pointload_loc_y_ - eps; - } - } - else if (movx > movy && disty1 <= disty2) - { - // mov load to the bottom boundary - pointload_loc_y_ = ymin_ + eps; - my_pointload_bc_.push_back(0); - // perturb x - if (distx1 <= distx2) - { - pointload_loc_x_ = pointload_loc_x_ + eps; - } - else - { - pointload_loc_x_ = pointload_loc_x_ - eps; - } - } - else - { - // mov load to the top boundary - pointload_loc_y_ = ymax_ - eps; - my_pointload_bc_.push_back(2); - // perturb x - if (distx1 <= distx2) - { - pointload_loc_x_ = pointload_loc_x_ + eps; - } - else - { - pointload_loc_x_ = pointload_loc_x_ - eps; - } - } - - // print to check - if (verbose_) - { - *this->outStream_ << "Load processing finished." << std::endl; - *this->outStream_ << "My nbc numbers: "; - for (unsigned i = 0; i < this->my_nbc_.size(); i++) - { - *this->outStream_ << this->my_nbc_[i]; - } - *this->outStream_ << std::endl; - *this->outStream_ << "My pbc numbers: "; - for (unsigned i = 0; i < my_pointload_bc_.size(); i++) - { - *this->outStream_ << my_pointload_bc_[i]; - } - *this->outStream_ << std::endl; - *this->outStream_ << "My pointload location: " << pointload_loc_x_ - << ", " << pointload_loc_y_ << std::endl; - } - } - - virtual void CreateMaterial(void) - { - int numCells = PDE_FEM<Real>::GetNumCells(); - int spaceDim = PDE_FEM<Real>::GetSpaceDim(); - for (int i = 0; i < numCells; ++i) - { - Teuchos::RCP<Material<Real>> CellMaterial = Teuchos::rcp(new Material<Real>()); - CellMaterial->InitializeMaterial(spaceDim, planeStrain_, E_, poissonR_); - materialTensorDim_ = CellMaterial->GetMaterialTensorDim(); - material_.push_back(CellMaterial); - } - } - - virtual void ComputeLocalSystemMats(void) - { - int spaceDim = PDE_FEM<Real>::GetSpaceDim(); - int numCells = PDE_FEM<Real>::GetNumCells(); - int numCubPoints = PDE_FEM<Real>::GetNumCubPoints(); - int lfs = PDE_FEM<Real>::GetLocalFieldSize(); - int full_lfs = lfs * spaceDim; - - this->gradgradMats_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells, full_lfs, full_lfs)); - this->valvalMats_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells, full_lfs, full_lfs)); - - // construct mats - CreateMaterial(); - - BMat_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells, full_lfs, numCubPoints, materialTensorDim_)); - BMatWeighted_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells, full_lfs, numCubPoints, materialTensorDim_)); - CBMat_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells, full_lfs, numCubPoints, materialTensorDim_)); - NMat_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells, full_lfs, numCubPoints, spaceDim)); - NMatWeighted_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells, full_lfs, numCubPoints, spaceDim)); - Construct_N_B_mats(); - Construct_CBmats(); - - // compute local grad.grad (stiffness) matrices - Intrepid::FunctionSpaceTools::integrate<Real>(*this->gradgradMats_, - *CBMat_, - *BMatWeighted_, - Intrepid::COMP_CPP); - // compute local val.val (mass) matrices - Intrepid::FunctionSpaceTools::integrate<Real>(*this->valvalMats_, - *NMat_, - *NMatWeighted_, - Intrepid::COMP_CPP); - } - - // new - // constructing Nmat on side - void Construct_Nmat_on_Side(int numCub) - { - int spaceDim = PDE_FEM<Real>::GetSpaceDim(); - int lfs = PDE_FEM<Real>::GetLocalFieldSize(); - int full_lfs = lfs * spaceDim; - NMatWeighted_Side = Teuchos::rcp(new Intrepid::FieldContainer<Real>(1, full_lfs, numCub, spaceDim)); - NMatWeighted_Side->initialize(0.0); - - if (spaceDim == 2) - { - for (int j = 0; j < numCub; ++j) - { - for (int k = 0; k < lfs; ++k) - { - (*NMatWeighted_Side)(0, k * spaceDim + 0, j, 0) = (*weighted_transformed_value_of_basis_at_cub_points_side_refcell)(0, k, j); - (*NMatWeighted_Side)(0, k * spaceDim + 1, j, 1) = (*weighted_transformed_value_of_basis_at_cub_points_side_refcell)(0, k, j); - } - } - } - - if (spaceDim == 3) - { - for (int j = 0; j < numCub; ++j) - { - for (int k = 0; k < lfs; ++k) - { - (*NMatWeighted_Side)(0, k * spaceDim + 0, j, 0) = (*weighted_transformed_value_of_basis_at_cub_points_side_refcell)(0, k, j); - (*NMatWeighted_Side)(0, k * spaceDim + 1, j, 1) = (*weighted_transformed_value_of_basis_at_cub_points_side_refcell)(0, k, j); - (*NMatWeighted_Side)(0, k * spaceDim + 2, j, 2) = (*weighted_transformed_value_of_basis_at_cub_points_side_refcell)(0, k, j); - } - } - } - } - - // adding point load to right hand side vector - virtual void AddPointLoadToRHS(void) - { - int n_pbc = my_pointload_bc_.size(); - for (int i = 0; i < n_pbc; ++i) - { - int pbc_num = my_pointload_bc_[i]; - for (int j = 0; j < this->myBoundaryCellIds_[pbc_num].size(); ++j) - { - int myGlobalCellId = this->myBoundaryCellIds_[pbc_num][j]; - // apply possible point loads - this->check_and_Apply_PointLoad_By_Coords(myGlobalCellId, pbc_num); - } - } - } - - // adding traction boundary data into right hand side vector - virtual void ModifyLocalForceVecWithSideTractions(void) - { - - int cellDim = PDE_FEM<Real>::GetSpaceDim(); - int lfs = PDE_FEM<Real>::GetLocalFieldSize(); //number of dof each dimension - int full_lfs = lfs * cellDim; - int numNodesPerCell = this->numNodesPerCell_; - - shards::CellTopology sideType(shards::getCellTopologyData<shards::Line<>>()); - int cubDegree = 10; - Intrepid::DefaultCubatureFactory<Real> cubFactory; // create cubature factory - Teuchos::RCP<Intrepid::Cubature<Real>> sideCub = cubFactory.create(sideType, cubDegree); - int numCubPointsSide = sideCub->getNumPoints(); - if (verbose_) - { - *this->outStream_ << "numCubPointsSide: " << numCubPointsSide << std::endl; - } - - int sideDim = this->sideDim_; - int n_nbc = this->my_nbc_.size(); - Teuchos::RCP<Intrepid::FieldContainer<Real>> thiscellNodes; - thiscellNodes = Teuchos::rcp(new Intrepid::FieldContainer<Real>(1, numNodesPerCell, cellDim)); - Intrepid::FieldContainer<Real> &nodes = *(this->meshMgr_)->getNodes(); - - if (verbose_) - { - *this->outStream_ << "n_nbc: " << n_nbc << std::endl; - } - for (int i = 0; i < n_nbc; i++) - { - int nbc_num = this->my_nbc_[i]; - //std::cout << "nbc_num: " << nbc_num << std::endl; - for (int j = 0; j < this->myBoundaryCellIds_[nbc_num].size(); ++j) - { - int myGlobalCellId = this->myBoundaryCellIds_[nbc_num][j]; - //*this->outStream_ << "myGlobalCellId: " << myGlobalCellId << std::endl; - - // apply traction - for (int m = 0; m < numNodesPerCell; ++m) - { - for (int n = 0; n < cellDim; ++n) - { - (*thiscellNodes)(0, m, n) = nodes(this->ctn_(myGlobalCellId, m), n); - } - } - //std::cout << "first node coords: " << (*thiscellNodes)(0, 0, 0) - // << ", " << (*thiscellNodes)(0, 0, 1) << std::endl; - cub_points_side = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCubPointsSide, sideDim)); - cub_weights_side = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCubPointsSide)); - cub_points_side_refcell = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCubPointsSide, cellDim)); - cub_points_side_physical = Teuchos::rcp(new Intrepid::FieldContainer<Real>(1, numCubPointsSide, cellDim)); - jacobian_side_refcell = Teuchos::rcp(new Intrepid::FieldContainer<Real>(1, numCubPointsSide, cellDim, cellDim)); - jacobian_det_side_refcell = Teuchos::rcp(new Intrepid::FieldContainer<Real>(1, numCubPointsSide)); - weighted_measure_side_refcell = Teuchos::rcp(new Intrepid::FieldContainer<Real>(1, numCubPointsSide)); - value_of_basis_at_cub_points_side_refcell = Teuchos::rcp(new Intrepid::FieldContainer<Real>(lfs, numCubPointsSide)); - transformed_value_of_basis_at_cub_points_side_refcell = Teuchos::rcp(new Intrepid::FieldContainer<Real>(1, lfs, numCubPointsSide)); - weighted_transformed_value_of_basis_at_cub_points_side_refcell = Teuchos::rcp(new Intrepid::FieldContainer<Real>(1, lfs, numCubPointsSide)); - tractions = Teuchos::rcp(new Intrepid::FieldContainer<Real>(1, numCubPointsSide, cellDim)); - tractions_on_dofs = Teuchos::rcp(new Intrepid::FieldContainer<Real>(1, full_lfs)); - - // compute traction b.c. contributions and adjust rhs - sideCub->getCubature(*cub_points_side, *cub_weights_side); - - // compute geometric cell information - Intrepid::CellTools<Real>::mapToReferenceSubcell(*cub_points_side_refcell, - *cub_points_side, - sideDim, - nbc_num, - this->cellType_); - - Intrepid::CellTools<Real>::setJacobian(*jacobian_side_refcell, - *cub_points_side_refcell, - *thiscellNodes, - this->cellType_); - - Intrepid::CellTools<Real>::setJacobianDet(*jacobian_det_side_refcell, - *jacobian_side_refcell); - - // compute weighted edge measure - Intrepid::FunctionSpaceTools::computeEdgeMeasure<Real>(*weighted_measure_side_refcell, - *jacobian_side_refcell, - *cub_weights_side, - nbc_num, - this->cellType_); - - // tabulate values of basis functions at side cubature points, in the reference parent cell domain - (*this->basisPtrs_[0]).getValues(*value_of_basis_at_cub_points_side_refcell, *cub_points_side_refcell, Intrepid::OPERATOR_VALUE); - // transform - Intrepid::FunctionSpaceTools::HGRADtransformVALUE<Real>( - *transformed_value_of_basis_at_cub_points_side_refcell, - *value_of_basis_at_cub_points_side_refcell); - - // multiply with weighted measure - Intrepid::FunctionSpaceTools::multiplyMeasure<Real>( - *weighted_transformed_value_of_basis_at_cub_points_side_refcell, - *weighted_measure_side_refcell, - *transformed_value_of_basis_at_cub_points_side_refcell); - - Construct_Nmat_on_Side(numCubPointsSide); - - // compute Neumann data - // map side cubature points in reference parent cell domain to physical space - Intrepid::CellTools<Real>::mapToPhysicalFrame(*cub_points_side_physical, - *cub_points_side_refcell, - *thiscellNodes, - this->cellType_); - //std::cout << "cub_points_side_physical:" << (*cub_points_side_physical)(0,0,0) - // << ", " << (*cub_points_side_physical)(0,0,1) << std::endl; - // now compute data - std::vector<Real> x(cellDim), F(cellDim); - for (int m = 0; m < numCubPointsSide; ++m) - { - for (int n = 0; n < cellDim; ++n) - { - x[n] = (*cub_points_side_physical)(0, m, n); - } - funcRHS_NBC(F, x); - for (int n = 0; n < cellDim; ++n) - { - (*tractions)(0, m, n) = F[n]; - } - } - Intrepid::FunctionSpaceTools::integrate<Real>(*tractions_on_dofs, - *tractions, - *NMatWeighted_Side, - Intrepid::COMP_CPP); - - // adjust RHS - for (int m = 0; m < full_lfs; ++m) - { - (*this->datavalVecF_)(this->find_local_index(myGlobalCellId), m) += (*tractions_on_dofs)(0, m); - } - - //check tractions on dofs - //*this->outStream_<<"tractions_on_dofs: "; - //for(int m=0; m<full_lfs; ++m) - // *this->outStream_<<(*tractions_on_dofs)(0, m)<<", "; - //*this->outStream_<<std::endl; - } - } - } - - virtual void ComputeLocalForceVec(void) - { - int spaceDim = PDE_FEM<Real>::GetSpaceDim(); - int numCells = PDE_FEM<Real>::GetNumCells(); - int numCubPoints = PDE_FEM<Real>::GetNumCubPoints(); - int lfs = PDE_FEM<Real>::GetLocalFieldSize(); - int full_lfs = lfs * spaceDim; - this->dataF_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells, numCubPoints, spaceDim)); - this->datavalVecF_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells, full_lfs)); - - std::vector<Real> x(spaceDim), F(spaceDim); - for (int i = 0; i < numCells; ++i) - { // evaluate functions at these points - for (int j = 0; j < numCubPoints; ++j) - { - for (int k = 0; k < spaceDim; ++k) - { - x[k] = (*this->cubPointsPhysical_)(i, j, k); - } - funcRHS_BodyForce(F, x); - for (int k = 0; k < spaceDim; ++k) - { - (*this->dataF_)(i, j, k) = F[k]; - } - } - } - Intrepid::FunctionSpaceTools::integrate<Real>(*this->datavalVecF_, // compute local data.val vectors for RHS F - *this->dataF_, - *NMatWeighted_, - Intrepid::COMP_CPP); - - // new - if (verbose_) - { - *this->outStream_ << "Modifying local force vectors using boundary tractions" << std::endl; - } - ModifyLocalForceVecWithSideTractions(); - AddPointLoadToRHS(); - if (verbose_) - { - *this->outStream_ << "Modifying Done!" << std::endl; - } - } - - virtual void updateF(const std::vector<Real> ¶m) - { - //Real diff = std::sqrt(std::pow(param_[0]-param[0],2) - // + std::pow(param_[1]-param[1],2) - // + std::pow(param_[2]-param[2],2) - // + std::pow(param_[3]-param[3],2) - // + std::pow(param_[4]-param[4],2) - // + std::pow(param_[5]-param[5],2)); - //if (diff > ROL::ROL_EPSILON<Real>()) { - param_ = param; - - ComputeLocalForceVec(); - PDE_FEM<Real>::AssembleRHSVector(); - PDE_FEM<Real>::VectorRemoveDBC(); - - PrintLoadingInformation(); - //} - } - - void Construct_N_B_mats(void) - { - //std::cout<<"Computing N and B mats."<<std::endl; - BMat_->initialize(0.0); - NMat_->initialize(0.0); - BMatWeighted_->initialize(0.0); - NMatWeighted_->initialize(0.0); - - if (this->spaceDim_ == 2) - { - for (int i = 0; i < this->numCells_; ++i) - { // evaluate functions at these points - for (int j = 0; j < this->numCubPoints_; ++j) - { - for (int k = 0; k < this->lfs_; ++k) - { - (*NMat_)(i, k * this->spaceDim_ + 0, j, 0) = (*this->valPhysical_)(i, k, j); - (*NMat_)(i, k * this->spaceDim_ + 1, j, 1) = (*this->valPhysical_)(i, k, j); - (*NMatWeighted_)(i, k * this->spaceDim_ + 0, j, 0) = (*this->valPhysicalWeighted_)(i, k, j); - (*NMatWeighted_)(i, k * this->spaceDim_ + 1, j, 1) = (*this->valPhysicalWeighted_)(i, k, j); - - (*BMat_)(i, k * this->spaceDim_ + 0, j, 0) = (*this->gradPhysical_)(i, k, j, 0); - (*BMat_)(i, k * this->spaceDim_ + 1, j, 1) = (*this->gradPhysical_)(i, k, j, 1); - (*BMat_)(i, k * this->spaceDim_ + 0, j, 2) = (*this->gradPhysical_)(i, k, j, 1); - (*BMat_)(i, k * this->spaceDim_ + 1, j, 2) = (*this->gradPhysical_)(i, k, j, 0); - - (*BMatWeighted_)(i, k * this->spaceDim_ + 0, j, 0) = (*this->gradPhysicalWeighted_)(i, k, j, 0); - (*BMatWeighted_)(i, k * this->spaceDim_ + 1, j, 1) = (*this->gradPhysicalWeighted_)(i, k, j, 1); - (*BMatWeighted_)(i, k * this->spaceDim_ + 0, j, 2) = (*this->gradPhysicalWeighted_)(i, k, j, 1); - (*BMatWeighted_)(i, k * this->spaceDim_ + 1, j, 2) = (*this->gradPhysicalWeighted_)(i, k, j, 0); - } - } - } - } - - if (this->spaceDim_ == 3) - { - for (int i = 0; i < this->numCells_; ++i) - { // evaluate functions at these points - for (int j = 0; j < this->numCubPoints_; ++j) - { - for (int k = 0; k < this->lfs_; ++k) - { - (*NMat_)(i, k * this->spaceDim_ + 0, j, 0) = (*this->valPhysical_)(i, k, j); - (*NMat_)(i, k * this->spaceDim_ + 1, j, 1) = (*this->valPhysical_)(i, k, j); - (*NMat_)(i, k * this->spaceDim_ + 2, j, 2) = (*this->valPhysical_)(i, k, j); - (*NMatWeighted_)(i, k * this->spaceDim_ + 0, j, 0) = (*this->valPhysicalWeighted_)(i, k, j); - (*NMatWeighted_)(i, k * this->spaceDim_ + 1, j, 1) = (*this->valPhysicalWeighted_)(i, k, j); - (*NMatWeighted_)(i, k * this->spaceDim_ + 2, j, 2) = (*this->valPhysicalWeighted_)(i, k, j); - - (*BMat_)(i, k * this->spaceDim_ + 0, j, 0) = (*this->gradPhysical_)(i, k, j, 0); - (*BMat_)(i, k * this->spaceDim_ + 1, j, 1) = (*this->gradPhysical_)(i, k, j, 1); - (*BMat_)(i, k * this->spaceDim_ + 2, j, 2) = (*this->gradPhysical_)(i, k, j, 2); - (*BMat_)(i, k * this->spaceDim_ + 1, j, 3) = (*this->gradPhysical_)(i, k, j, 2); - (*BMat_)(i, k * this->spaceDim_ + 2, j, 3) = (*this->gradPhysical_)(i, k, j, 1); - (*BMat_)(i, k * this->spaceDim_ + 0, j, 4) = (*this->gradPhysical_)(i, k, j, 2); - (*BMat_)(i, k * this->spaceDim_ + 2, j, 4) = (*this->gradPhysical_)(i, k, j, 0); - (*BMat_)(i, k * this->spaceDim_ + 0, j, 5) = (*this->gradPhysical_)(i, k, j, 1); - (*BMat_)(i, k * this->spaceDim_ + 1, j, 5) = (*this->gradPhysical_)(i, k, j, 0); - - (*BMatWeighted_)(i, k * this->spaceDim_ + 0, j, 0) = (*this->gradPhysicalWeighted_)(i, k, j, 0); - (*BMatWeighted_)(i, k * this->spaceDim_ + 1, j, 1) = (*this->gradPhysicalWeighted_)(i, k, j, 1); - (*BMatWeighted_)(i, k * this->spaceDim_ + 2, j, 2) = (*this->gradPhysicalWeighted_)(i, k, j, 2); - (*BMatWeighted_)(i, k * this->spaceDim_ + 1, j, 3) = (*this->gradPhysicalWeighted_)(i, k, j, 2); - (*BMatWeighted_)(i, k * this->spaceDim_ + 2, j, 3) = (*this->gradPhysicalWeighted_)(i, k, j, 1); - (*BMatWeighted_)(i, k * this->spaceDim_ + 0, j, 4) = (*this->gradPhysicalWeighted_)(i, k, j, 2); - (*BMatWeighted_)(i, k * this->spaceDim_ + 2, j, 4) = (*this->gradPhysicalWeighted_)(i, k, j, 0); - (*BMatWeighted_)(i, k * this->spaceDim_ + 0, j, 5) = (*this->gradPhysicalWeighted_)(i, k, j, 1); - (*BMatWeighted_)(i, k * this->spaceDim_ + 1, j, 5) = (*this->gradPhysicalWeighted_)(i, k, j, 0); - } - } - } - } - } - - // test matrices - virtual void test_mats(void) - { - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_Jaco_Mat; - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_Grad_Mat; - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_N_Mat; - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_B_Mat; - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_K_Mat; - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_M_Mat; - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_F_Vec; - - test_Jaco_Mat = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->spaceDim_, this->spaceDim_)); - test_Grad_Mat = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->lfs_, this->spaceDim_)); - test_N_Mat = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numLocalDofs_, this->spaceDim_)); - test_B_Mat = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numLocalDofs_, materialTensorDim_)); - test_K_Mat = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numLocalDofs_, this->numLocalDofs_)); - test_M_Mat = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numLocalDofs_, this->numLocalDofs_)); - test_F_Vec = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numLocalDofs_, 1)); - - for (int i = 0; i < this->spaceDim_; i++) - { - for (int j = 0; j < this->spaceDim_; j++) - { - (*test_Jaco_Mat)(i, j) = (*this->cellJac_)(0, 0, i, j); - } - } - for (int i = 0; i < this->numLocalDofs_; i++) - { - for (int j = 0; j < this->spaceDim_; j++) - { - if (i < this->lfs_) - { - (*test_Grad_Mat)(i, j) = (*this->gradReference_)(i, 0, j); - } - (*test_N_Mat)(i, j) = (*NMat_)(0, i, 0, j); - } - for (int j = 0; j < materialTensorDim_; j++) - { - (*test_B_Mat)(i, j) = (*BMat_)(0, i, 0, j); - } - for (int j = 0; j < this->numLocalDofs_; j++) - { - (*test_K_Mat)(i, j) = (*this->gradgradMats_)(0, i, j); - (*test_M_Mat)(i, j) = (*this->valvalMats_)(0, i, j); - } - (*test_F_Vec)(i, 0) = (*this->datavalVecF_)(0, i); - } - std::cout << *test_Jaco_Mat << std::endl; - std::cout << *test_Grad_Mat << std::endl; - std::cout << *test_N_Mat << std::endl; - std::cout << *test_B_Mat << std::endl; - std::cout << *test_K_Mat << std::endl; - std::cout << *test_M_Mat << std::endl; - std::cout << *test_F_Vec << std::endl; - } - - virtual void Construct_CBmats(void) - { - //std::cout<<"Computing CB mats."<<std::endl; - CBMat_->initialize(0.0); - for (int i = 0; i < this->numCells_; ++i) - { - Teuchos::RCP<Intrepid::FieldContainer<Real>> materialMat = material_[i]->GetMaterialTensor(); - for (int j = 0; j < this->numCubPoints_; ++j) - { - for (int m = 0; m < this->lfs_ * this->spaceDim_; m++) - { - for (int n = 0; n < materialTensorDim_; n++) - { - for (int k = 0; k < materialTensorDim_; k++) - { - (*CBMat_)(i, m, j, n) += (*BMat_)(i, m, j, k) * (*materialMat)(k, n); - } - } - } - } - } - } - - // load functions, can be parametrized - // modification for stochastic loads should be made here - virtual void funcRHS_BodyForce(std::vector<Real> &F, - const std::vector<Real> &x) const - { - Real theta = DegreesToRadians(param_[1]); - F.clear(); - F.resize(this->spaceDim_); - F[0] = param_[0] * std::cos(theta); - F[1] = param_[0] * std::sin(theta); - } - - virtual void funcRHS_NBC(std::vector<Real> &F, - const std::vector<Real> &x) const - { - Real theta = DegreesToRadians(param_[3]); - F.clear(); - F.resize(this->spaceDim_); - F[0] = param_[2] * std::cos(theta); - F[1] = param_[2] * std::sin(theta); - } - - virtual void funcRHS_PtLoad(std::vector<Real> &F) const - { - Real theta = DegreesToRadians(param_[5]); - F.clear(); - F.resize(this->spaceDim_); - F[0] = param_[4] * std::cos(theta); - F[1] = param_[4] * std::sin(theta); - } - // - // - - virtual void ApplyPointLoad(const int pointload_bc, - const int globalCellNum, - const std::vector<int> &localNodeNum, - const std::vector<Real> &coord1, - const std::vector<Real> &coord2) - { - Teuchos::RCP<Intrepid::FieldContainer<int>> nodeDofs = this->dofMgr_->getNodeDofs(); - bool isLoadPosContainedInCurrentSegment = false; - int whichNodeIsCloser = -1; - // if update F, provides parametrized computation of F[0] and F[1] - std::vector<Real> F; - funcRHS_PtLoad(F); - // - Real x11 = coord1[0], x12 = coord1[1]; - Real x21 = coord2[0], x22 = coord2[1]; - Real fx = pointload_loc_x_; - Real fy = pointload_loc_y_; - int pbc_num = pointload_bc; - - if (pbc_num == 0 || pbc_num == 2) - { - if (((x11 - fx) * (x21 - fx) < 0) && ((x12 - fy) * (x22 - fy) > 0)) - { - isLoadPosContainedInCurrentSegment = true; - if (std::abs(x11 - fx) <= std::abs(x21 - fx)) - { - whichNodeIsCloser = 1; - } - else - { - whichNodeIsCloser = 2; - } - } - } - if (pbc_num == 1 || pbc_num == 3) - { - if (((x11 - fx) * (x21 - fx) > 0) && ((x12 - fy) * (x22 - fy) < 0)) - { - isLoadPosContainedInCurrentSegment = true; - if (std::abs(x12 - fy) <= std::abs(x22 - fy)) - { - whichNodeIsCloser = 1; - } - else - { - whichNodeIsCloser = 2; - } - } - } - if (isLoadPosContainedInCurrentSegment) - { - int ctn = this->ctn_(globalCellNum, localNodeNum[whichNodeIsCloser - 1]); - this->myPointLoadDofs_.resize(2); - this->myPointLoadVals_.resize(2); - this->myPointLoadDofs_[0] = (*nodeDofs)(ctn, 0); - this->myPointLoadDofs_[1] = (*nodeDofs)(ctn, 1); - this->myPointLoadVals_[0] = F[0]; - this->myPointLoadVals_[1] = F[1]; - // print to check - if (verbose_) - { - *this->outStream_ << "Point load applied, at cell: " << globalCellNum << std::endl; - *this->outStream_ << "Point load values: " << F[0] << ", " << F[1] << std::endl; - if (whichNodeIsCloser == 1) - { - *this->outStream_ << "Point load position: " << x11 << ", " << x12 << std::endl; - } - else - { - *this->outStream_ << "Point load position: " << x21 << ", " << x22 << std::endl; - } - } - } - } - // ApplyPointLoad - - // DBC cases, add more to extend - virtual int check_DBC_Coords_Range(const std::vector<Real> &x) const - { - // return value : - // -1: not a DBC node - // 0: x direction fixed - // 1: y direction fixed - // 5: both x, y direction are fixed - // - Real x1 = x[0], x2 = x[1], eps(1e-6); - switch (DBC_Case_) - { - case 0: - { // Fix bottom two corners, left corner x, y, right corner only y - if ((x2 < ymin_ + eps) && (x1 < xmin_ + eps)) - return 5; - if ((x2 < ymin_ + eps) && (x1 > xmax_ - eps)) - return 1; - break; - } - case 1: - { // Fix bottom two corners, both x, y - if ((x2 < ymin_ + eps) && - ((x1 < xmin_ + eps) || (x1 > xmax_ - eps))) - return 5; - break; - } - case 2: - { // Fix left boundary, both x, y - if (x1 < xmin_ + eps) - return 5; - break; - } - case 3: - { // Fix bottom boundary, both x, y - if (x2 < ymin_ + eps) - return 5; - break; - } - case 4: - { // Fix ALL boundary, both x, y - return 5; - break; - } - } - return -1; - } - -}; // class Elasticity - -#endif diff --git a/tlnos/src/TOOLS/elasticitySIMP.hpp b/tlnos/src/TOOLS/elasticitySIMP.hpp deleted file mode 100644 index dd3f5f1d..00000000 --- a/tlnos/src/TOOLS/elasticitySIMP.hpp +++ /dev/null @@ -1,296 +0,0 @@ -// @HEADER -// ************************************************************************ -// -// Rapid Optimization Library (ROL) Package -// Copyright (2014) Sandia Corporation -// -// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -// license for use of this work by or on behalf of the U.S. Government. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact lead developers: -// Drew Kouri (dpkouri@sandia.gov) and -// Denis Ridzal (dridzal@sandia.gov) -// -// ************************************************************************ -// @HEADER - -#ifndef ROL_PDEOPT_ELASTICITYSIMP_H -#define ROL_PDEOPT_ELASTICITYSIMP_H - -#include "Intrepid_HGRAD_QUAD_C2_FEM.hpp" -#include "Intrepid_HGRAD_QUAD_C1_FEM.hpp" -#include "../TOOLS/elasticity.hpp" -#include "../TOOLS/materials.hpp" - -template <class Real> -class ElasticitySIMP : public Elasticity<Real> -{ -protected: - Real initDensity_; - Real minDensity_; - int powerP_; - - std::vector<Teuchos::RCP<Material_SIMP<Real>>> SIMPmaterial_; - Teuchos::RCP<Tpetra::MultiVector<>> myDensity_; - Teuchos::RCP<Tpetra::MultiVector<>> myCellArea_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> CBMat0_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> gradgradMats0_; - -public: - ElasticitySIMP() {} - ~ElasticitySIMP() {} - - virtual void ElasticitySIMP_Initialize(const Teuchos::RCP<const Teuchos::Comm<int>> &comm, - const Teuchos::RCP<Teuchos::ParameterList> &parlist, - const Teuchos::RCP<std::ostream> &outStream) - { - this->Initialize(comm, parlist, outStream); - // new material parameters - Teuchos::ParameterList &list = this->parlist_->sublist("ElasticitySIMP"); - powerP_ = list.get<int>("SIMP Power"); - initDensity_ = list.get<Real>("Initial Density"); - minDensity_ = list.get<Real>("Minimum Density"); - } - - virtual void SetSIMPParallelStructure() - { - PDE_FEM<Real>::SetParallelStructure(); - this->myCellMap_ = Teuchos::rcp(new Tpetra::Map<>(Teuchos::OrdinalTraits<Tpetra::global_size_t>::invalid(), - this->myCellIds_, 0, this->commPtr_)); - } - - Teuchos::RCP<const Tpetra::Map<>> getDomainMapA() const - { - return this->matA_->getDomainMap(); - } - - Teuchos::RCP<const Tpetra::Map<>> getCellMap() const - { - return this->myCellMap_; - } - - Teuchos::RCP<Tpetra::MultiVector<>> getMaterialDensity() const - { - return myDensity_; - } - - // return cell measures - Teuchos::RCP<Tpetra::MultiVector<>> getCellAreas() - { - myCellArea_ = Teuchos::rcp(new Tpetra::MultiVector<>(this->myCellMap_, 1, true)); - for (int i = 0; i < this->numCells_; i++) - { - myCellArea_->replaceGlobalValue(this->myCellIds_[i], 0, this->myCellMeasure_[i]); - } - return myCellArea_; - } - // - void ApplyBCToVec(const Teuchos::RCP<Tpetra::MultiVector<>> &u) - { - Real zero(0.0); - // u is myOverlapMap_ - for (int i = 0; i < this->myDirichletDofs_.size(); ++i) - { - if (this->myOverlapMap_->isNodeGlobalElement(this->myDirichletDofs_[i])) - u->replaceGlobalValue(this->myDirichletDofs_[i], 0, zero); - } - } - - void resetMaterialDensity(const Real val) - { - myDensity_ = Teuchos::rcp(new Tpetra::MultiVector<>(this->myCellMap_, 1, true)); - myDensity_->putScalar(val); - renewMaterialVector(); - } - - void updateMaterialDensity(const Teuchos::RCP<const Tpetra::MultiVector<>> &newDensity) - { - myDensity_ = Teuchos::rcp(new Tpetra::MultiVector<>(this->myCellMap_, 1, true)); - Tpetra::deep_copy(*myDensity_, *newDensity); - renewMaterialVector(); - } - - void renewMaterialVector() - { - Teuchos::ArrayRCP<const Real> densData = myDensity_->get1dView(); - for (int i = 0; i < this->numCells_; i++) - { - Real dens = densData[myDensity_->getMap()->getLocalElement(this->myCellIds_[i])]; - SIMPmaterial_[i]->setDensity(dens); - } - } - - virtual void CreateMaterial() - { - for (int i = 0; i < this->numCells_; i++) - { - Teuchos::RCP<Material_SIMP<Real>> CellMaterial = Teuchos::rcp(new Material_SIMP<Real>()); - CellMaterial->InitializeSIMP(this->spaceDim_, this->planeStrain_, this->E_, - this->poissonR_, initDensity_, powerP_, minDensity_); - this->materialTensorDim_ = CellMaterial->GetMaterialTensorDim(); - SIMPmaterial_.push_back(CellMaterial); - } - resetMaterialDensity(initDensity_); - } - - virtual void ComputeLocalSystemMats(bool ifInitial) - { - int full_lfs = this->lfs_ * this->spaceDim_; - if (!ifInitial) - { - renewMaterialVector(); - this->gradgradMats_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numCells_, full_lfs, full_lfs)); - Construct_CBmats(ifInitial); - Intrepid::FunctionSpaceTools::integrate<Real>(*this->gradgradMats_, // compute local grad.grad (stiffness) matrices - *this->CBMat_, - *this->BMatWeighted_, - Intrepid::COMP_CPP); - return; - } - CreateMaterial(); - this->gradgradMats0_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numCells_, full_lfs, full_lfs)); - this->gradgradMats_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numCells_, full_lfs, full_lfs)); - this->valvalMats_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numCells_, full_lfs, full_lfs)); - - this->BMat_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numCells_, full_lfs, this->numCubPoints_, this->materialTensorDim_)); - this->BMatWeighted_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numCells_, full_lfs, this->numCubPoints_, this->materialTensorDim_)); - CBMat0_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numCells_, full_lfs, this->numCubPoints_, this->materialTensorDim_)); - this->CBMat_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numCells_, full_lfs, this->numCubPoints_, this->materialTensorDim_)); - this->NMat_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numCells_, full_lfs, this->numCubPoints_, this->spaceDim_)); - this->NMatWeighted_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numCells_, full_lfs, this->numCubPoints_, this->spaceDim_)); - this->Construct_N_B_mats(); - Construct_CBmats(ifInitial); - Intrepid::FunctionSpaceTools::integrate<Real>(*this->gradgradMats0_, // compute local grad.grad (stiffness) matrices - *CBMat0_, - *this->BMatWeighted_, - Intrepid::COMP_CPP); - Intrepid::FunctionSpaceTools::integrate<Real>(*this->gradgradMats_, // compute local grad.grad (stiffness) matrices - *this->CBMat_, - *this->BMatWeighted_, - Intrepid::COMP_CPP); - Intrepid::FunctionSpaceTools::integrate<Real>(*this->valvalMats_, // compute local val.val (mass) matrices - *this->NMat_, - *this->NMatWeighted_, - Intrepid::COMP_CPP); - } - - // test matrices - virtual void test_mats() - { - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_Jaco_Mat; - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_Grad_Mat; - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_N_Mat; - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_B_Mat; - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_K0_Mat; - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_K_Mat; - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_M_Mat; - Teuchos::RCP<Intrepid::FieldContainer<Real>> test_F_Vec; - - test_Jaco_Mat = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->spaceDim_, this->spaceDim_)); - test_Grad_Mat = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->lfs_, this->spaceDim_)); - test_N_Mat = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numLocalDofs_, this->spaceDim_)); - test_B_Mat = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numLocalDofs_, this->materialTensorDim_)); - test_K0_Mat = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numLocalDofs_, this->numLocalDofs_)); - test_K_Mat = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numLocalDofs_, this->numLocalDofs_)); - test_M_Mat = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numLocalDofs_, this->numLocalDofs_)); - test_F_Vec = Teuchos::rcp(new Intrepid::FieldContainer<Real>(this->numLocalDofs_, 1)); - - for (int i = 0; i < this->spaceDim_; i++) - { - for (int j = 0; j < this->spaceDim_; j++) - { - (*test_Jaco_Mat)(i, j) = (*this->cellJac_)(0, 0, i, j); - } - } - for (int i = 0; i < this->numLocalDofs_; i++) - { - for (int j = 0; j < this->spaceDim_; j++) - { - if (i < this->lfs_) - (*test_Grad_Mat)(i, j) = (*this->gradReference_)(i, 0, j); - - (*test_N_Mat)(i, j) = (*this->NMat_)(0, i, 0, j); - } - for (int j = 0; j < this->materialTensorDim_; j++) - { - (*test_B_Mat)(i, j) = (*this->BMat_)(0, i, 0, j); - } - for (int j = 0; j < this->numLocalDofs_; j++) - { - (*test_K0_Mat)(i, j) = (*this->gradgradMats0_)(0, i, j); - (*test_K_Mat)(i, j) = (*this->gradgradMats_)(0, i, j); - (*test_M_Mat)(i, j) = (*this->valvalMats_)(0, i, j); - } - (*test_F_Vec)(i, 0) = (*this->datavalVecF_)(0, i); - } - std::cout << *(SIMPmaterial_[0]->GetMaterialTensor()) << std::endl; - std::cout << *test_Jaco_Mat << std::endl; - std::cout << *test_Grad_Mat << std::endl; - std::cout << *test_N_Mat << std::endl; - std::cout << *test_B_Mat << std::endl; - std::cout << *test_M_Mat << std::endl; - std::cout << *test_F_Vec << std::endl; - std::cout << *test_K0_Mat << std::endl; - std::cout << *test_K_Mat << std::endl; - } - - void Construct_CBmats(const bool ifInitial) - { - if (ifInitial) - CBMat0_->initialize(0.0); - - this->CBMat_->initialize(0.0); - Real SIMPScale; - for (int i = 0; i < this->numCells_; ++i) - { - - SIMPScale = SIMPmaterial_[i]->getSIMPScaleFactor(); - Teuchos::RCP<Intrepid::FieldContainer<Real>> materialMat = SIMPmaterial_[i]->GetMaterialTensor(); - for (int j = 0; j < this->numCubPoints_; ++j) - { - for (int m = 0; m < this->lfs_ * this->spaceDim_; m++) - { - for (int n = 0; n < this->materialTensorDim_; n++) - { - for (int k = 0; k < this->materialTensorDim_; k++) - { - if (ifInitial) - (*CBMat0_)(i, m, j, n) += (*this->BMat_)(i, m, j, k) * (*materialMat)(k, n); - (*this->CBMat_)(i, m, j, n) += SIMPScale * (*this->BMat_)(i, m, j, k) * (*materialMat)(k, n); - } - } - } - } - } - } - -}; // class ElasticitySIMPData - -#endif diff --git a/tlnos/src/TOOLS/materials.hpp b/tlnos/src/TOOLS/materials.hpp deleted file mode 100644 index 2b8aeba7..00000000 --- a/tlnos/src/TOOLS/materials.hpp +++ /dev/null @@ -1,252 +0,0 @@ -// @HEADER -// ************************************************************************ -// -// Rapid Optimization Library (ROL) Package -// Copyright (2014) Sandia Corporation -// -// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -// license for use of this work by or on behalf of the U.S. Government. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact lead developers: -// Drew Kouri (dpkouri@sandia.gov) and -// Denis Ridzal (dridzal@sandia.gov) -// -// ************************************************************************ -// @HEADER - -/*! \file materials.hpp -*/ - -#ifndef MATERIALS_HPP -#define MATERIALS_HPP - -#include "Intrepid_FieldContainer.hpp" - -/** \class Materials -*/ - -template <class Real> -class Material -{ -private: - int dim_; - int tensorMatSize_; - - bool planeStrain_; - Real modulus_; - Real poissonRatio_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> materialTensor_; - -public: - Material() {} - virtual ~Material() {} - - virtual void InitializeMaterial(const int dim, const bool planeStrain, - const Real modulus, const Real poissonRatio) - { - TEUCHOS_TEST_FOR_EXCEPTION(dim > 3 || dim < 1, std::invalid_argument, - ">>> ERROR (InitializeMaterial): dim less than one or greater than three!"); - dim_ = dim; - planeStrain_ = planeStrain; - modulus_ = modulus; - poissonRatio_ = poissonRatio; - if (dim_ == 1) - { - tensorMatSize_ = 1; - } - else if (dim_ == 2) - { - tensorMatSize_ = 3; - } - else - { - tensorMatSize_ = 6; - } - - ComputeMaterialTensor(); - } - - void ComputeMaterialTensor(void) - { - materialTensor_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(tensorMatSize_, tensorMatSize_)); - materialTensor_->initialize(0.0); - if (dim_ == 1) - { - (*materialTensor_)(0, 0) = modulus_; - } - else if (dim_ == 2 && !planeStrain_) - { - Real one(1), half(0.5); - Real factor1 = modulus_ / (one - poissonRatio_ * poissonRatio_); - (*materialTensor_)(0, 0) = factor1; - (*materialTensor_)(0, 1) = factor1 * poissonRatio_; - (*materialTensor_)(1, 0) = factor1 * poissonRatio_; - (*materialTensor_)(1, 1) = factor1; - (*materialTensor_)(2, 2) = factor1 * half * (one - poissonRatio_); - } - else if (dim_ == 2 && planeStrain_) - { - Real one(1), two(2), half(0.5); - Real factor2 = modulus_ / (one + poissonRatio_) / (one - two * poissonRatio_); - (*materialTensor_)(0, 0) = factor2 * (one - poissonRatio_); - (*materialTensor_)(0, 1) = factor2 * poissonRatio_; - (*materialTensor_)(1, 0) = factor2 * poissonRatio_; - (*materialTensor_)(1, 1) = factor2 * (one - poissonRatio_); - (*materialTensor_)(2, 2) = factor2 * half * (one - two * poissonRatio_); - } - else - { - Real one(1), two(2), half(0.5); - Real lam = modulus_ * poissonRatio_ / (one + poissonRatio_) / (one - two * poissonRatio_); - Real mu = half * modulus_ / (one + poissonRatio_); - (*materialTensor_)(0, 0) = lam + two * mu; - (*materialTensor_)(0, 1) = lam; - (*materialTensor_)(0, 2) = lam; - (*materialTensor_)(1, 0) = lam; - (*materialTensor_)(1, 1) = lam + two * mu; - (*materialTensor_)(1, 2) = lam; - (*materialTensor_)(2, 0) = lam; - (*materialTensor_)(2, 1) = lam; - (*materialTensor_)(2, 2) = lam + two * mu; - (*materialTensor_)(3, 3) = mu; - (*materialTensor_)(4, 4) = mu; - (*materialTensor_)(5, 5) = mu; - } - } - - const Teuchos::RCP<Intrepid::FieldContainer<Real>> GetMaterialTensor(void) const - { - return materialTensor_; - } - - int GetMaterialTensorDim(void) const - { - return tensorMatSize_; - } - - Real GetYoungsModulus(void) const - { - return modulus_; - } - - Real GetPoissonRatio(void) const - { - return poissonRatio_; - } - - Real GetBulkModulus(void) const {} - - Real GetShearModulus(void) const - { - Real half(0.5), one(1); - return half * modulus_ / (one + poissonRatio_); - } - - void CheckMaterialTensor(void) - { - std::cout << *materialTensor_ << std::endl; - } -}; - -// new class for topology optimization -template <class Real> -class Material_SIMP : public Material<Real> -{ -private: - Real density_; - int powerP_; - Real minDensity_; - -public: - virtual void InitializeSIMP(const int dim, const bool planeStrain, - const Real modulus, const Real poissonRatio, - const Real density, const int powerP, const Real minDensity) - { - TEUCHOS_TEST_FOR_EXCEPTION(powerP < 1, std::invalid_argument, - ">>> ERROR (InitializeSIMP): SIMP power is less than one!"); - Material<Real>::InitializeMaterial(dim, planeStrain, modulus, poissonRatio); - density_ = density; - powerP_ = powerP; - minDensity_ = minDensity; - } - - Real getSIMPScaleFactor(void) const - { - TEUCHOS_TEST_FOR_EXCEPTION(powerP_ < 1, std::invalid_argument, - ">>> ERROR (getSIMPScaleFactor): SIMP power is less than one!"); - Real one(1); - return minDensity_ + (one - minDensity_) * std::pow(density_, powerP_); - } - - Real getSIMPFirstDerivativeScaleFactor(void) const - { - TEUCHOS_TEST_FOR_EXCEPTION(powerP_ < 1, std::invalid_argument, - ">>> ERROR (getSIMPFirstDerivativeScaleFactor): SIMP power is less than one!"); - Real one(1); - return (one - minDensity_) * powerP_ * (std::pow(density_, powerP_ - 1)); - } - - Real getSIMPSecondDerivativeScaleFactor(void) const - { - TEUCHOS_TEST_FOR_EXCEPTION(powerP_ < 1, std::invalid_argument, - ">>> ERROR (getSIMPSecondDerivativeScaleFactor): SIMP power is less than one!"); - Real one(1), scale(0); - if (powerP_ > 1) - { - scale = (one - minDensity_) * powerP_ * (powerP_ - 1) * (std::pow(density_, powerP_ - 2)); - } - return scale; - } - - void setDensity(const Real dens) - { - density_ = dens; - } - - // the following function is not in use - Teuchos::RCP<Intrepid::FieldContainer<Real>> computeScaledMaterialTensor(const Real scale) const - { - Real zero(0); - int TMS = Material<Real>::getMaterialTensorDim(); - Teuchos::RCP<Intrepid::FieldContainer<Real>> scaledMaterialTensor = Teuchos::rcp(new Intrepid::FieldContainer<Real>(TMS, TMS)); - scaledMaterialTensor->initialize(zero); - - for (int i = 0; i < TMS; i++) - { - for (int j = 0; j < TMS; j++) - { - (*scaledMaterialTensor)(i, j) = scale * (*Material<Real>::gerMaterialTensor())(i, j); - } - } - return scaledMaterialTensor; - } -}; - -#endif diff --git a/tlnos/src/TOOLS/meshmanager.hpp b/tlnos/src/TOOLS/meshmanager.hpp deleted file mode 100644 index 1ce27a78..00000000 --- a/tlnos/src/TOOLS/meshmanager.hpp +++ /dev/null @@ -1,711 +0,0 @@ -// @HEADER -// ************************************************************************ -// -// Rapid Optimization Library (ROL) Package -// Copyright (2014) Sandia Corporation -// -// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -// license for use of this work by or on behalf of the U.S. Government. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact lead developers: -// Drew Kouri (dpkouri@sandia.gov) and -// Denis Ridzal (dridzal@sandia.gov) -// -// ************************************************************************ -// @HEADER - -/*! \file meshmanager.hpp - \brief Defines the MeshManger classes. -*/ - -#ifndef MESHMANAGER_HPP -#define MESHMANAGER_HPP - -#include "Teuchos_ParameterList.hpp" -#include "Intrepid_FieldContainer.hpp" - -/** \class MeshManager - \brief This is the pure virtual parent class for mesh construction - and management; it enables the generation of a few select - meshes and the setup of data structures for computing - cell/subcell adjacencies, for example, the cell-to-node - adjacency map and the cell-to-edge adjacency map. -*/ -template <class Real> -class MeshManager -{ - -public: - /** \brief Destructor - */ - virtual ~MeshManager() {} - - /** \brief Returns node coordinates. - Format: number_of_nodes x 2 (Real) - (node_index) x, y coordinates - */ - virtual Teuchos::RCP<Intrepid::FieldContainer<Real>> getNodes() const = 0; - - /** \brief Returns cell to node adjacencies. - Format: number_of_cells x number_of_nodes_per_cell (int) - (cell_index) node_index1 node_index2 ... - */ - virtual Teuchos::RCP<Intrepid::FieldContainer<int>> getCellToNodeMap() const = 0; - - /** \brief Returns cell to edge adjacencies. - Format: number_of_cells x number_of_edges_per_cell (int) - (cell_index) edge_index1 edge_index2 ... - */ - virtual Teuchos::RCP<Intrepid::FieldContainer<int>> getCellToEdgeMap() const = 0; - - /** \brief Returns sideset information. - Format: The std::vector components are indexed by the local side number (0, 1, 2, ...); - the FieldConTainer is a 1D array of cell indices. - Input: Sideset number. Its meaning is context-dependent. - */ - virtual Teuchos::RCP<std::vector<std::vector<Intrepid::FieldContainer<int>>>> getSideSets() const = 0; - - /** \brief Returns number of cells. - */ - virtual int getNumCells() const = 0; - - /** \brief Returns number of nodes. - */ - virtual int getNumNodes() const = 0; - - /** \brief Returns number of edges. - */ - virtual int getNumEdges() const = 0; - -}; // MeshManager - -/** \class MeshManager_BackwardFacingStepChannel - \brief Mesh construction and mesh management for the - backward-facing step channel geometry, on - quadrilateral grids. -*/ -template <class Real> -class MeshManager_BackwardFacingStepChannel : public MeshManager<Real> -{ - - /* Backward-facing step geometry. - - *************************************************** - * * * * - * 3 * 4 * 5 * - * * * * - ********** * * * * * * * * * * * * * * * * * * * ** - * 1 * 2 * - * * * - ****************************************** - -*/ - -private: - Real channelH_; // channel height (height of regions 1+4) - Real channelW_; // channel width (width of regions 3+4+5) - Real stepH_; // step height (height of region 1) - Real stepW_; // step width (width of region 3) - Real observeW_; // width of observation region (width of region 1) - - int ref_; // mesh refinement level - - int nx1_; - int nx2_; - int nx3_; - int nx4_; - int nx5_; - int ny1_; - int ny2_; - int ny3_; - int ny4_; - int ny5_; - - int numCells_; - int numNodes_; - int numEdges_; - - Teuchos::RCP<Intrepid::FieldContainer<Real>> meshNodes_; - Teuchos::RCP<Intrepid::FieldContainer<int>> meshCellToNodeMap_; - Teuchos::RCP<Intrepid::FieldContainer<int>> meshCellToEdgeMap_; - -public: - MeshManager_BackwardFacingStepChannel(Teuchos::ParameterList &parlist) - { - // Geometry data. - channelH_ = parlist.sublist("Geometry").get("Channel height", 1.0); - channelW_ = parlist.sublist("Geometry").get("Channel width", 8.0); - stepH_ = parlist.sublist("Geometry").get("Step height", 0.5); - stepW_ = parlist.sublist("Geometry").get("Step width", 1.0); - observeW_ = parlist.sublist("Geometry").get("Observation width", 3.0); - // Mesh data. - ref_ = parlist.sublist("Geometry").get("Refinement level", 1); - nx1_ = parlist.sublist("Geometry").get("Observation region NX", 4 * ref_); - ny1_ = parlist.sublist("Geometry").get("Observation region NY", 5 * ref_); - nx2_ = parlist.sublist("Geometry").get("Laminar flow region NX", 2 * ref_); - ny2_ = ny1_; - nx3_ = parlist.sublist("Geometry").get("Inflow region NX", 1 * ref_); - ny3_ = parlist.sublist("Geometry").get("Inflow region NY", 2 * ref_); - nx4_ = nx1_; - ny4_ = ny3_; - nx5_ = nx2_; - ny5_ = ny3_; - numCells_ = (nx1_ + nx2_) * ny1_ + (nx3_ + nx1_ + nx2_) * ny3_; - numNodes_ = (nx1_ + nx2_ + 1) * ny1_ + (nx3_ + nx1_ + nx2_ + 1) * (ny3_ + 1); - numEdges_ = (2 * (nx1_ + nx2_) + 1) * ny1_ + (2 * (nx3_ + nx1_ + nx2_) + 1) * ny3_ + (nx3_ + nx1_ + nx2_); - // Compute mesh data structures. - computeNodes(); - computeCellToNodeMap(); - computeCellToEdgeMap(); - } - - Teuchos::RCP<Intrepid::FieldContainer<Real>> getNodes() const - { - return meshNodes_; - } - - Teuchos::RCP<Intrepid::FieldContainer<int>> getCellToNodeMap() const - { - return meshCellToNodeMap_; - } - - Teuchos::RCP<Intrepid::FieldContainer<int>> getCellToEdgeMap() const - { - return meshCellToEdgeMap_; - } - - int getNumCells() const - { - return numCells_; - } // getNumCells - - int getNumNodes() const - { - return numNodes_; - } // getNumNodes - - int getNumEdges() const - { - return numEdges_; - } // getNumEdges - -private: - void computeNodes() - { - - meshNodes_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numNodes_, 2)); - Intrepid::FieldContainer<Real> &nodes = *meshNodes_; - - Real dy1 = stepH_ / ny1_; - Real dy3 = (channelH_ - stepH_) / ny3_; - Real dx1 = observeW_ / nx1_; - Real dx2 = (channelW_ - stepW_ - observeW_) / nx2_; - Real dx3 = stepW_ / nx3_; - int nodeCt = 0; - - // bottom region - for (int j = 0; j < ny1_; ++j) - { - for (int i = 0; i <= nx1_; ++i) - { - nodes(nodeCt, 0) = stepW_ + i * dx1; - nodes(nodeCt, 1) = j * dy1; - ++nodeCt; - } - for (int i = 0; i < nx2_; ++i) - { - nodes(nodeCt, 0) = stepW_ + observeW_ + (i + 1) * dx2; - nodes(nodeCt, 1) = j * dy1; - ++nodeCt; - } - } - - // top region - for (int j = 0; j <= ny3_; ++j) - { - for (int i = 0; i <= nx3_; ++i) - { - nodes(nodeCt, 0) = i * dx3; - nodes(nodeCt, 1) = stepH_ + j * dy3; - ++nodeCt; - } - for (int i = 0; i < nx1_; ++i) - { - nodes(nodeCt, 0) = stepW_ + (i + 1) * dx1; - nodes(nodeCt, 1) = stepH_ + j * dy3; - ++nodeCt; - } - for (int i = 0; i < nx2_; ++i) - { - nodes(nodeCt, 0) = stepW_ + observeW_ + (i + 1) * dx2; - nodes(nodeCt, 1) = stepH_ + j * dy3; - ++nodeCt; - } - } - - } // computeNodes - - void computeCellToNodeMap() - { - - meshCellToNodeMap_ = Teuchos::rcp(new Intrepid::FieldContainer<int>(numCells_, 4)); - Intrepid::FieldContainer<int> &ctn = *meshCellToNodeMap_; - - int cellCt = 0; - - // bottom region - for (int j = 0; j < ny1_ - 1; ++j) - { - for (int i = 0; i < nx1_ + nx2_; ++i) - { - ctn(cellCt, 0) = j * (nx1_ + nx2_ + 1) + i; - ctn(cellCt, 1) = j * (nx1_ + nx2_ + 1) + (i + 1); - ctn(cellCt, 2) = (j + 1) * (nx1_ + nx2_ + 1) + (i + 1); - ctn(cellCt, 3) = (j + 1) * (nx1_ + nx2_ + 1) + i; - ++cellCt; - } - } - - // transition region - for (int i = 0; i < nx1_ + nx2_; ++i) - { - ctn(cellCt, 0) = (ny1_ - 1) * (nx1_ + nx2_ + 1) + i; - ctn(cellCt, 1) = (ny1_ - 1) * (nx1_ + nx2_ + 1) + (i + 1); - ctn(cellCt, 2) = ny1_ * (nx1_ + nx2_ + 1) + nx3_ + (i + 1); - ctn(cellCt, 3) = ny1_ * (nx1_ + nx2_ + 1) + nx3_ + i; - ++cellCt; - } - - // top region - for (int j = 0; j < ny3_; ++j) - { - for (int i = 0; i < nx3_ + nx1_ + nx2_; ++i) - { - ctn(cellCt, 0) = ny1_ * (nx1_ + nx2_ + 1) + j * (nx3_ + nx1_ + nx2_ + 1) + i; - ctn(cellCt, 1) = ny1_ * (nx1_ + nx2_ + 1) + j * (nx3_ + nx1_ + nx2_ + 1) + (i + 1); - ctn(cellCt, 2) = ny1_ * (nx1_ + nx2_ + 1) + (j + 1) * (nx3_ + nx1_ + nx2_ + 1) + (i + 1); - ctn(cellCt, 3) = ny1_ * (nx1_ + nx2_ + 1) + (j + 1) * (nx3_ + nx1_ + nx2_ + 1) + i; - ++cellCt; - } - } - - } // computeCellToNodeMap - - void computeCellToEdgeMap() - { - - meshCellToEdgeMap_ = Teuchos::rcp(new Intrepid::FieldContainer<int>(numCells_, 4)); - Intrepid::FieldContainer<int> &cte = *meshCellToEdgeMap_; - - int cellCt = 0; - - // bottom region - for (int j = 0; j < ny1_ - 1; ++j) - { - for (int i = 0; i < nx1_ + nx2_; ++i) - { - cte(cellCt, 0) = j * (2 * (nx1_ + nx2_) + 1) + i; - cte(cellCt, 1) = j * (2 * (nx1_ + nx2_) + 1) + (nx1_ + nx2_) + (i + 1); - cte(cellCt, 2) = (j + 1) * (2 * (nx1_ + nx2_) + 1) + i; - cte(cellCt, 3) = j * (2 * (nx1_ + nx2_) + 1) + (nx1_ + nx2_) + i; - ++cellCt; - } - } - - // transition region - for (int i = 0; i < nx1_ + nx2_; ++i) - { - cte(cellCt, 0) = (ny1_ - 1) * (2 * (nx1_ + nx2_) + 1) + i; - cte(cellCt, 1) = (ny1_ - 1) * (2 * (nx1_ + nx2_) + 1) + (nx1_ + nx2_) + (i + 1); - cte(cellCt, 2) = ny1_ * (2 * (nx1_ + nx2_) + 1) + nx3_ + i; - cte(cellCt, 3) = (ny1_ - 1) * (2 * (nx1_ + nx2_) + 1) + (nx1_ + nx2_) + i; - ++cellCt; - } - - // top region - for (int j = 0; j < ny3_; ++j) - { - for (int i = 0; i < nx3_ + nx1_ + nx2_; ++i) - { - cte(cellCt, 0) = ny1_ * (2 * (nx1_ + nx2_) + 1) + j * (2 * (nx3_ + nx1_ + nx2_) + 1) + i; - cte(cellCt, 1) = ny1_ * (2 * (nx1_ + nx2_) + 1) + j * (2 * (nx3_ + nx1_ + nx2_) + 1) + (nx3_ + nx1_ + nx2_) + (i + 1); - cte(cellCt, 2) = ny1_ * (2 * (nx1_ + nx2_) + 1) + (j + 1) * (2 * (nx3_ + nx1_ + nx2_) + 1) + i; - cte(cellCt, 3) = ny1_ * (2 * (nx1_ + nx2_) + 1) + j * (2 * (nx3_ + nx1_ + nx2_) + 1) + (nx3_ + nx1_ + nx2_) + i; - ++cellCt; - } - } - - } // computeCellToEdgeMap - - void setRefinementLevel(const int &refLevel) - { - ref_ = refLevel; - computeNodes(); - computeCellToNodeMap(); - computeCellToEdgeMap(); - } // setRefinementLevel - -}; // MeshManager_BackwardFacingStepChannel - -/** \class MeshManager_Rectangle - \brief Mesh construction and mesh management for the - backward-facing step channel geometry, on - quadrilateral grids. -*/ -template <class Real> -class MeshManager_Rectangle : public MeshManager<Real> -{ - - /* Rectangle geometry. - - *********************** - * * : - * * | - * * height - * * | - * * : - * * - *********************** - (X0,Y0) :--width--: - -*/ - -private: - Real width_; // rectangle height - Real height_; // rectangle width - Real X0_; // x coordinate of bottom left corner - Real Y0_; // y coordinate of bottom left corner - - int nx_; - int ny_; - - int numCells_; - int numNodes_; - int numEdges_; - - Teuchos::RCP<Intrepid::FieldContainer<Real>> meshNodes_; - Teuchos::RCP<Intrepid::FieldContainer<int>> meshCellToNodeMap_; - Teuchos::RCP<Intrepid::FieldContainer<int>> meshCellToEdgeMap_; - - Teuchos::RCP<std::vector<std::vector<Intrepid::FieldContainer<int>>>> meshSideSets_; - -public: - MeshManager_Rectangle(Teuchos::ParameterList &parlist) - { - // Geometry data. - width_ = parlist.sublist("Geometry").get("Width", 3.0); - height_ = parlist.sublist("Geometry").get("Height", 1.0); - X0_ = parlist.sublist("Geometry").get("X0", 0.0); - Y0_ = parlist.sublist("Geometry").get("Y0", 0.0); - // Mesh data. - nx_ = parlist.sublist("Geometry").get("NX", 3); - ny_ = parlist.sublist("Geometry").get("NY", 1); - numCells_ = nx_ * ny_; - numNodes_ = (nx_ + 1) * (ny_ + 1); - numEdges_ = (nx_ + 1) * ny_ + (ny_ + 1) * nx_; - // Compute and store mesh data structures. - computeNodes(); - computeCellToNodeMap(); - computeCellToEdgeMap(); - computeSideSets(); - } - - Teuchos::RCP<Intrepid::FieldContainer<Real>> getNodes() const - { - return meshNodes_; - } - - Teuchos::RCP<Intrepid::FieldContainer<int>> getCellToNodeMap() const - { - return meshCellToNodeMap_; - } - - Teuchos::RCP<Intrepid::FieldContainer<int>> getCellToEdgeMap() const - { - return meshCellToEdgeMap_; - } - - Teuchos::RCP<std::vector<std::vector<Intrepid::FieldContainer<int>>>> getSideSets() const - { - return meshSideSets_; - } - - int getNumCells() const - { - return numCells_; - } // getNumCells - - int getNumNodes() const - { - return numNodes_; - } // getNumNodes - - int getNumEdges() const - { - return numEdges_; - } // getNumEdges - -private: - void computeNodes() - { - - meshNodes_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numNodes_, 2)); - Intrepid::FieldContainer<Real> &nodes = *meshNodes_; - - Real dx = width_ / nx_; - Real dy = height_ / ny_; - int nodeCt = 0; - - for (int j = 0; j <= ny_; ++j) - { - Real ycoord = Y0_ + j * dy; - for (int i = 0; i <= nx_; ++i) - { - nodes(nodeCt, 0) = X0_ + i * dx; - nodes(nodeCt, 1) = ycoord; - ++nodeCt; - } - } - - } // computeNodes - - void computeCellToNodeMap() - { - - meshCellToNodeMap_ = Teuchos::rcp(new Intrepid::FieldContainer<int>(numCells_, 4)); - Intrepid::FieldContainer<int> &ctn = *meshCellToNodeMap_; - - int cellCt = 0; - - for (int j = 0; j < ny_; ++j) - { - for (int i = 0; i < nx_; ++i) - { - ctn(cellCt, 0) = j * (nx_ + 1) + i; - ctn(cellCt, 1) = j * (nx_ + 1) + (i + 1); - ctn(cellCt, 2) = (j + 1) * (nx_ + 1) + (i + 1); - ctn(cellCt, 3) = (j + 1) * (nx_ + 1) + i; - ++cellCt; - } - } - - } // computeCellToNodeMap - - void computeCellToEdgeMap() - { - - meshCellToEdgeMap_ = Teuchos::rcp(new Intrepid::FieldContainer<int>(numCells_, 4)); - Intrepid::FieldContainer<int> &cte = *meshCellToEdgeMap_; - - int cellCt = 0; - - for (int j = 0; j < ny_; ++j) - { - for (int i = 0; i < nx_; ++i) - { - cte(cellCt, 0) = j * (2 * nx_ + 1) + i; - cte(cellCt, 1) = j * (2 * nx_ + 1) + nx_ + (i + 1); - cte(cellCt, 2) = (j + 1) * (2 * nx_ + 1) + i; - cte(cellCt, 3) = j * (2 * nx_ + 1) + nx_ + i; - ++cellCt; - } - } - - } // computeCellToEdgeMap - - void computeSideSets() - { - - meshSideSets_ = Teuchos::rcp(new std::vector<std::vector<Intrepid::FieldContainer<int>>>(1)); - int numSides = 4; - (*meshSideSets_)[0].resize(numSides); - (*meshSideSets_)[0][0].resize(nx_); - (*meshSideSets_)[0][1].resize(ny_); - (*meshSideSets_)[0][2].resize(nx_); - (*meshSideSets_)[0][3].resize(ny_); - - for (int i = 0; i < nx_; ++i) - { - (*meshSideSets_)[0][0](i) = i; - } - for (int i = 0; i < ny_; ++i) - { - (*meshSideSets_)[0][1](i) = (i + 1) * nx_ - 1; - } - for (int i = 0; i < nx_; ++i) - { - (*meshSideSets_)[0][2](i) = i + nx_ * (ny_ - 1); - } - for (int i = 0; i < ny_; ++i) - { - (*meshSideSets_)[0][3](i) = i * nx_; - } - - } // computeSideSets - -}; // MeshManager_Rectangle - -template <class Real> -class MeshManager_Interval : public MeshManager<Real> -{ - - /* Interval geometry [X0,X0+width] */ - -private: - Real width_; // Interval width - Real X0_; // x coordinate left corner - - int nx_; - - int numCells_; - int numNodes_; - int numEdges_; - - Teuchos::RCP<Intrepid::FieldContainer<Real>> meshNodes_; - Teuchos::RCP<Intrepid::FieldContainer<int>> meshCellToNodeMap_; - Teuchos::RCP<Intrepid::FieldContainer<int>> meshCellToEdgeMap_; - - Teuchos::RCP<std::vector<std::vector<Intrepid::FieldContainer<int>>>> meshSideSets_; - -public: - MeshManager_Interval(Teuchos::ParameterList &parlist) - { - - // Geometry data - width_ = parlist.sublist("Geometry").get("Width", 1.0); - X0_ = parlist.sublist("Geometry").get("X0", 0.0); - - // Mesh data - nx_ = parlist.sublist("Geometry").get("NX", 10); - - numCells_ = nx_; - numNodes_ = nx_ + 1; - numEdges_ = 2; - - // Compute and store mesh data structures - computeNodes(); - computeCellToNodeMap(); - computeCellToEdgeMap(); - computeSideSets(); - } - - Teuchos::RCP<Intrepid::FieldContainer<Real>> getNodes() const - { - return meshNodes_; - } - - Teuchos::RCP<Intrepid::FieldContainer<int>> getCellToNodeMap() const - { - return meshCellToNodeMap_; - } - - Teuchos::RCP<Intrepid::FieldContainer<int>> getCellToEdgeMap() const - { - return meshCellToEdgeMap_; - } - - Teuchos::RCP<std::vector<std::vector<Intrepid::FieldContainer<int>>>> getSideSets() const - { - return meshSideSets_; - } - - int getNumCells() const - { - return numCells_; - } - - int getNumNodes() const - { - return numNodes_; - } // getNumNodes - - int getNumEdges() const - { - return numEdges_; - } // getNumEdges - -private: - void computeNodes() - { - - meshNodes_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numNodes_, 1)); - Intrepid::FieldContainer<Real> &nodes = *meshNodes_; - - Real dx = width_ / nx_; - - for (int i = 0; i < nx_; ++i) - { - nodes(i, 0) = X0_ + i * dx; - } - } // computeNodes - - void computeCellToNodeMap() - { - - meshCellToNodeMap_ = Teuchos::rcp(new Intrepid::FieldContainer<int>(numCells_, 2)); - Intrepid::FieldContainer<int> &ctn = *meshCellToNodeMap_; - - for (int i = 0; i < nx_; ++i) - { - ctn(i, 0) = i; - ctn(i, 1) = i + 1; - } - } // computeCellToNodeMap - - void computeCellToEdgeMap() - { - - meshCellToEdgeMap_ = Teuchos::rcp(new Intrepid::FieldContainer<int>(numCells_, 1)); - Intrepid::FieldContainer<int> &cte = *meshCellToEdgeMap_; - - for (int i = 0; i < nx_; ++i) - { - cte(i, 0) = i; - } - } - - void computeSideSets() - { - - using Intrepid::FieldContainer; - using std::vector; - - meshSideSets_ = Teuchos::rcp(new vector<vector<FieldContainer<int>>>(1)); - int numSides = 2; - - (*meshSideSets_)[0].resize(numSides); - (*meshSideSets_)[0][0](0) = 0; - (*meshSideSets_)[0][1](0) = numCells_ + 1; - - } // computeSideSets - -}; // MeshManager_Interval - -#endif diff --git a/tlnos/src/constraint.hpp b/tlnos/src/constraint.hpp deleted file mode 100644 index 538c89fb..00000000 --- a/tlnos/src/constraint.hpp +++ /dev/null @@ -1,218 +0,0 @@ -// @HEADER -// ************************************************************************ -// -// Rapid Optimization Library (ROL) Package -// Copyright (2014) Sandia Corporation -// -// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -// license for use of this work by or on behalf of the U.S. Government. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact lead developers: -// Drew Kouri (dpkouri@sandia.gov) and -// Denis Ridzal (dridzal@sandia.gov) -// -// ************************************************************************ -// @HEADER - -/*! \file constraint.hpp - \brief Defines the SimOpt constraint for the 'poisson' example. -*/ - -#ifndef ROL_PDEOPT_POISSON_CONSTRAINT_H -#define ROL_PDEOPT_POISSON_CONSTRAINT_H - -#include "ROL_EqualityConstraint_SimOpt.hpp" -#include "ROL_TpetraMultiVector.hpp" -#include "Amesos2.hpp" -#include "data.hpp" - -template <class Real> -class EqualityConstraint_PDEOPT_Poisson : public ROL::EqualityConstraint_SimOpt<Real> -{ -private: - Teuchos::RCP<PoissonData<Real>> data_; - -public: - EqualityConstraint_PDEOPT_Poisson(const Teuchos::RCP<PoissonData<Real>> &data, - const Teuchos::RCP<Teuchos::ParameterList> &parlist) - { - data_ = data; - } - - using ROL::EqualityConstraint_SimOpt<Real>::value; - void value(ROL::Vector<Real> &c, const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol) - { - Teuchos::RCP<Tpetra::MultiVector<>> cp = - (Teuchos::dyn_cast<ROL::TpetraMultiVector<Real>>(c)).getVector(); - Teuchos::RCP<const Tpetra::MultiVector<>> up = - (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real>>(u)).getVector(); - Teuchos::RCP<const Tpetra::MultiVector<>> zp = - (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real>>(z)).getVector(); - - Real one(1); - - // A*u - data_->getMatA()->apply(*up, *cp); - - // B*z + A*u - data_->getMatB()->apply(*zp, *cp, Teuchos::NO_TRANS, one, one); - - // A*u + B*z - f - cp->update(-one, *(data_->getVecF()), one); - } - - void applyJacobian_1(ROL::Vector<Real> &jv, const ROL::Vector<Real> &v, const ROL::Vector<Real> &u, - const ROL::Vector<Real> &z, Real &tol) - { - Teuchos::RCP<Tpetra::MultiVector<>> jvp = - (Teuchos::dyn_cast<ROL::TpetraMultiVector<Real>>(jv)).getVector(); - Teuchos::RCP<const Tpetra::MultiVector<>> vp = - (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real>>(v)).getVector(); - - // A*v - data_->getMatA()->apply(*vp, *jvp); - } - - void applyJacobian_2(ROL::Vector<Real> &jv, const ROL::Vector<Real> &v, const ROL::Vector<Real> &u, - const ROL::Vector<Real> &z, Real &tol) - { - Teuchos::RCP<Tpetra::MultiVector<>> jvp = - (Teuchos::dyn_cast<ROL::TpetraMultiVector<Real>>(jv)).getVector(); - Teuchos::RCP<const Tpetra::MultiVector<>> vp = - (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real>>(v)).getVector(); - - // B*v - data_->getMatB()->apply(*vp, *jvp); - } - - void applyAdjointJacobian_1(ROL::Vector<Real> &ajv, const ROL::Vector<Real> &v, const ROL::Vector<Real> &u, - const ROL::Vector<Real> &z, Real &tol) - { - Teuchos::RCP<Tpetra::MultiVector<>> ajvp = - (Teuchos::dyn_cast<ROL::TpetraMultiVector<Real>>(ajv)).getVector(); - Teuchos::RCP<const Tpetra::MultiVector<>> vp = - (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real>>(v)).getVector(); - - // A'*v - bool transpose = true; - data_->getMatA(transpose)->apply(*vp, *ajvp); - } - - void applyAdjointJacobian_2(ROL::Vector<Real> &ajv, const ROL::Vector<Real> &v, const ROL::Vector<Real> &u, - const ROL::Vector<Real> &z, Real &tol) - { - Teuchos::RCP<Tpetra::MultiVector<>> ajvp = - (Teuchos::dyn_cast<ROL::TpetraMultiVector<Real>>(ajv)).getVector(); - Teuchos::RCP<const Tpetra::MultiVector<>> vp = - (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real>>(v)).getVector(); - - // B'*v - bool transpose = true; - data_->getMatB(transpose)->apply(*vp, *ajvp); - } - - void applyAdjointHessian_11(ROL::Vector<Real> &ahwv, const ROL::Vector<Real> &w, const ROL::Vector<Real> &v, - const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol) - { - ahwv.zero(); - } - - void applyAdjointHessian_12(ROL::Vector<Real> &ahwv, const ROL::Vector<Real> &w, const ROL::Vector<Real> &v, - const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol) - { - ahwv.zero(); - } - - void applyAdjointHessian_21(ROL::Vector<Real> &ahwv, const ROL::Vector<Real> &w, const ROL::Vector<Real> &v, - const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol) - { - ahwv.zero(); - } - - void applyAdjointHessian_22(ROL::Vector<Real> &ahwv, const ROL::Vector<Real> &w, const ROL::Vector<Real> &v, - const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol) - { - ahwv.zero(); - } - - void applyInverseJacobian_1(ROL::Vector<Real> &ijv, const ROL::Vector<Real> &v, const ROL::Vector<Real> &u, - const ROL::Vector<Real> &z, Real &tol) - { - Teuchos::RCP<Tpetra::MultiVector<>> ijvp = - (Teuchos::dyn_cast<ROL::TpetraMultiVector<Real>>(ijv)).getVector(); - Teuchos::RCP<const Tpetra::MultiVector<>> vp = - (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real>>(v)).getVector(); - - data_->getSolver()->setX(ijvp); - data_->getSolver()->setB(vp); - data_->getSolver()->solve(); - - /* - // Construct solver using Amesos2 factory. - Teuchos::RCP<Amesos2::Solver< Tpetra::CrsMatrix<>, Tpetra::MultiVector<> > > solver; - try{ - solver = Amesos2::create< Tpetra::CrsMatrix<>,Tpetra::MultiVector<> >("KLU2", data_->getMatA(), ijvp, vp); - } catch (std::invalid_argument e) { - std::cout << e.what() << std::endl; - } - solver->numericFactorization(); - solver->solve(); - */ - } - - void applyInverseAdjointJacobian_1(ROL::Vector<Real> &iajv, const ROL::Vector<Real> &v, const ROL::Vector<Real> &u, - const ROL::Vector<Real> &z, Real &tol) - { - Teuchos::RCP<Tpetra::MultiVector<>> iajvp = - (Teuchos::dyn_cast<ROL::TpetraMultiVector<Real>>(iajv)).getVector(); - Teuchos::RCP<const Tpetra::MultiVector<>> vp = - (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real>>(v)).getVector(); - - bool transpose = true; - data_->getSolver(transpose)->setX(iajvp); - data_->getSolver(transpose)->setB(vp); - data_->getSolver(transpose)->solve(); - - /* - bool transpose = true; - // Construct solver using Amesos2 factory. - Teuchos::RCP<Amesos2::Solver< Tpetra::CrsMatrix<>, Tpetra::MultiVector<> > > solver; - try{ - solver = Amesos2::create< Tpetra::CrsMatrix<>,Tpetra::MultiVector<> >("KLU2", data_->getMatA(transpose), iajvp, vp); - } catch (std::invalid_argument e) { - std::cout << e.what() << std::endl; - } - solver->numericFactorization(); - solver->solve(); - */ - } -}; - -#endif diff --git a/tlnos/src/data.hpp b/tlnos/src/data.hpp deleted file mode 100644 index b1c080a0..00000000 --- a/tlnos/src/data.hpp +++ /dev/null @@ -1,843 +0,0 @@ -// @HEADER -// ************************************************************************ -// -// Rapid Optimization Library (ROL) Package -// Copyright (2014) Sandia Corporation -// -// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -// license for use of this work by or on behalf of the U.S. Government. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact lead developers: -// Drew Kouri (dpkouri@sandia.gov) and -// Denis Ridzal (dridzal@sandia.gov) -// -// ************************************************************************ -// @HEADER - -/*! \file data.hpp - \brief Generates and manages data for the Poisson example, including - all mesh and discretization data, matrices, etc. -*/ - -#ifndef ROL_PDEOPT_POISSON_DATA_H -#define ROL_PDEOPT_POISSON_DATA_H - -#include "Teuchos_GlobalMPISession.hpp" -#include "Teuchos_TimeMonitor.hpp" - -#include "Tpetra_DefaultPlatform.hpp" -#include "Tpetra_MultiVector.hpp" -#include "Tpetra_Vector.hpp" -#include "Tpetra_CrsGraph.hpp" -#include "Tpetra_CrsMatrix.hpp" -#include "Tpetra_Version.hpp" -#include "Tpetra_RowMatrixTransposer.hpp" -#include "MatrixMarket_Tpetra.hpp" - -#include "Intrepid_HGRAD_QUAD_C2_FEM.hpp" -#include "Intrepid_HGRAD_QUAD_C1_FEM.hpp" -#include "Intrepid_DefaultCubatureFactory.hpp" -#include "Intrepid_FunctionSpaceTools.hpp" -#include "Intrepid_CellTools.hpp" - -#include "Amesos2.hpp" - -#include "TOOLS/dofmanager.hpp" - -template <class Real> -class PoissonData -{ - -private: - Teuchos::RCP<MeshManager<Real>> meshMgr_; - Teuchos::RCP<DofManager<Real>> dofMgr_; - std::vector<Teuchos::RCP<Intrepid::Basis<Real, Intrepid::FieldContainer<Real>>>> basisPtrs_; - - Teuchos::RCP<const Teuchos::Comm<int>> commPtr_; - int myRank_; - int numProcs_; - - Real alpha_; - int basisOrder_; - - Teuchos::RCP<const Tpetra::Map<>> myOverlapMap_; - Teuchos::RCP<const Tpetra::Map<>> myUniqueMap_; - Teuchos::RCP<Tpetra::CrsGraph<>> matGraph_; - Teuchos::RCP<Tpetra::CrsMatrix<>> matA_; - Teuchos::RCP<Tpetra::CrsMatrix<>> matA_dirichlet_; - Teuchos::RCP<Tpetra::CrsMatrix<>> matA_dirichlet_trans_; - Teuchos::RCP<Tpetra::CrsMatrix<>> matM_; - Teuchos::RCP<Tpetra::CrsMatrix<>> matM_dirichlet_; - Teuchos::RCP<Tpetra::CrsMatrix<>> matM_dirichlet_trans_; - Teuchos::RCP<Tpetra::MultiVector<>> vecUd_; - Teuchos::RCP<Tpetra::MultiVector<>> vecF_; - Teuchos::RCP<Tpetra::MultiVector<>> vecF_overlap_; - Teuchos::RCP<Tpetra::MultiVector<>> vecF_dirichlet_; - - Teuchos::Array<int> myCellIds_; - - Teuchos::RCP<Amesos2::Solver<Tpetra::CrsMatrix<>, Tpetra::MultiVector<>>> solverA_; - Teuchos::RCP<Amesos2::Solver<Tpetra::CrsMatrix<>, Tpetra::MultiVector<>>> solverA_trans_; - - shards::CellTopology cellType_; - int spaceDim_; - int numNodesPerCell_; - int numCubPoints_; - - int totalNumCells_; - int totalNumDofs_; - int numCells_; - - Teuchos::RCP<Intrepid::FieldContainer<Real>> cubPoints_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cubWeights_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cellNodes_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cellJac_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cellJacInv_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cellJacDet_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cellWeightedMeasure_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> valReference_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> gradReference_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> valPhysical_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> gradPhysical_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> valPhysicalWeighted_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> gradPhysicalWeighted_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> gradgradMats_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> valvalMats_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> cubPointsPhysical_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> dataF_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> datavalVecF_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> dofPoints_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> dofPointsPhysical_; - Teuchos::RCP<Intrepid::FieldContainer<Real>> dataUd_; - -public: - PoissonData(const Teuchos::RCP<const Teuchos::Comm<int>> &comm, - const Teuchos::RCP<Teuchos::ParameterList> &parlist, - const Teuchos::RCP<std::ostream> &outStream) - { - - /************************************/ - /*** Retrieve communication data. ***/ - /************************************/ - commPtr_ = comm; - myRank_ = commPtr_->getRank(); - numProcs_ = commPtr_->getSize(); - *outStream << "Total number of processors: " << numProcs_ << std::endl; - /************************************/ - /************************************/ - - /*************************************/ - /*** Retrieve parameter list data. ***/ - /*************************************/ - alpha_ = parlist->sublist("Problem").get("Penalty", 1e-2); - basisOrder_ = parlist->sublist("Problem").get("Order of FE discretization", 1); - int cellSplit = parlist->sublist("Geometry").get("Partition type", 1); - /*************************************/ - /*************************************/ - - /****************************************************************************/ - /*** Initialize mesh / finite element fields / degree-of-freedom manager. ***/ - /****************************************************************************/ - - // Mesh manager. - meshMgr_ = Teuchos::rcp(new MeshManager_Rectangle<Real>(*parlist)); - printMeshData(*outStream); - // Finite element fields. - Teuchos::RCP<Intrepid::Basis<Real, Intrepid::FieldContainer<Real>>> basisPtr; - if (basisOrder_ == 1) - { - basisPtr = Teuchos::rcp(new Intrepid::Basis_HGRAD_QUAD_C1_FEM<Real, Intrepid::FieldContainer<Real>>); - } - else if (basisOrder_ == 2) - { - basisPtr = Teuchos::rcp(new Intrepid::Basis_HGRAD_QUAD_C2_FEM<Real, Intrepid::FieldContainer<Real>>); - } - basisPtrs_.resize(1, Teuchos::null); - basisPtrs_[0] = basisPtr; - // DOF coordinate interface. - Teuchos::RCP<Intrepid::DofCoordsInterface<Intrepid::FieldContainer<Real>>> coord_iface = - Teuchos::rcp_dynamic_cast<Intrepid::DofCoordsInterface<Intrepid::FieldContainer<Real>>>(basisPtrs_[0]); - // Degree-of-freedom manager. - dofMgr_ = Teuchos::rcp(new DofManager<Real>(meshMgr_, basisPtrs_)); - // Retrieve total number of cells in the mesh. - totalNumCells_ = meshMgr_->getNumCells(); - // Retrieve total number of degrees of freedom in the mesh. - totalNumDofs_ = dofMgr_->getNumDofs(); - - /****************************************************************************/ - /****************************************************************************/ - - /****************************************************/ - /*** Build parallel communication infrastructure. ***/ - /****************************************************/ - - // Partition the cells in the mesh. We use a basic quasi-equinumerous partitioning, - // where the remainder, if any, is assigned to the last processor. - Teuchos::Array<int> myGlobIds_; - Teuchos::Array<int> cellOffsets_(numProcs_, 0); - int cellsPerProc = totalNumCells_ / numProcs_; - numCells_ = cellsPerProc; - switch (cellSplit) - { - case 0: - if (myRank_ == 0) - { // remainder in the first - numCells_ += totalNumCells_ % numProcs_; - } - for (int i = 1; i < numProcs_; ++i) - { - cellOffsets_[i] = cellOffsets_[i - 1] + cellsPerProc + (static_cast<int>(i == 1)) * (totalNumCells_ % numProcs_); - } - break; - case 1: - if (myRank_ == numProcs_ - 1) - { // remainder in the last - numCells_ += totalNumCells_ % numProcs_; - } - for (int i = 1; i < numProcs_; ++i) - { - cellOffsets_[i] = cellOffsets_[i - 1] + cellsPerProc; - } - break; - case 2: - if (myRank_ < (totalNumCells_ % numProcs_)) - { // spread remainder, starting from the first - numCells_++; - } - for (int i = 1; i < numProcs_; ++i) - { - cellOffsets_[i] = cellOffsets_[i - 1] + cellsPerProc + (static_cast<int>(i - 1 < (totalNumCells_ % numProcs_))); - } - break; - } - Intrepid::FieldContainer<int> &cellDofs = *(dofMgr_->getCellDofs()); - int numLocalDofs = cellDofs.dimension(1); - *outStream << "Cell offsets across processors: " << cellOffsets_ << std::endl; - for (int i = 0; i < numCells_; ++i) - { - myCellIds_.push_back(cellOffsets_[myRank_] + i); - for (int j = 0; j < numLocalDofs; ++j) - { - myGlobIds_.push_back(cellDofs(cellOffsets_[myRank_] + i, j)); - } - } - std::sort(myGlobIds_.begin(), myGlobIds_.end()); - myGlobIds_.erase(std::unique(myGlobIds_.begin(), myGlobIds_.end()), myGlobIds_.end()); - - // Build maps. - myOverlapMap_ = Teuchos::rcp(new Tpetra::Map<>(Teuchos::OrdinalTraits<Tpetra::global_size_t>::invalid(), - myGlobIds_, 0, comm)); - //std::cout << std::endl << myOverlapMap_->getNodeElementList(); - /** One can also use the non-member function: - myOverlapMap_ = Tpetra::createNonContigMap<int,int>(myGlobIds_, comm); - to build the overlap map. - **/ - myUniqueMap_ = Tpetra::createOneToOne<int, int>(myOverlapMap_); - //std::cout << std::endl << myUniqueMap_->getNodeElementList() << std::endl; - - /****************************************************/ - /****************************************************/ - - /****************************************************/ - /*** Set up local discretization data and arrays. ***/ - /****************************************************/ - - // Retrieve some basic cell information. - cellType_ = (basisPtrs_[0])->getBaseCellTopology(); // get the cell type from any basis - spaceDim_ = cellType_.getDimension(); // retrieve spatial dimension - numNodesPerCell_ = cellType_.getNodeCount(); // retrieve number of nodes per cell - - // Cubature data. - Intrepid::DefaultCubatureFactory<Real> cubFactory; // create cubature factory - int cubDegree = 4; // set cubature degree, e.g., 2 - Teuchos::RCP<Intrepid::Cubature<Real>> cellCub = cubFactory.create(cellType_, cubDegree); // create default cubature - numCubPoints_ = cellCub->getNumPoints(); // retrieve number of cubature points - - int lfs = dofMgr_->getLocalFieldSize(0); - - // Discretization data. - cubPoints_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCubPoints_, spaceDim_)); - cubWeights_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCubPoints_)); - cubPointsPhysical_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, numCubPoints_, spaceDim_)); - dofPoints_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(lfs, spaceDim_)); - dofPointsPhysical_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, lfs, spaceDim_)); - cellNodes_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, numNodesPerCell_, spaceDim_)); - cellJac_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, numCubPoints_, spaceDim_, spaceDim_)); - cellJacInv_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, numCubPoints_, spaceDim_, spaceDim_)); - cellJacDet_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, numCubPoints_)); - cellWeightedMeasure_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, numCubPoints_)); - valReference_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(lfs, numCubPoints_)); - gradReference_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(lfs, numCubPoints_, spaceDim_)); - valPhysical_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, lfs, numCubPoints_)); - gradPhysical_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, lfs, numCubPoints_, spaceDim_)); - valPhysicalWeighted_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, lfs, numCubPoints_)); - gradPhysicalWeighted_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, lfs, numCubPoints_, spaceDim_)); - gradgradMats_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, lfs, lfs)); - valvalMats_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, lfs, lfs)); - dataF_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, numCubPoints_)); - datavalVecF_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, lfs)); - dataUd_ = Teuchos::rcp(new Intrepid::FieldContainer<Real>(numCells_, lfs)); - - // Geometric definition of the cells in the mesh, based on the cell-to-node map and the domain partition. - Intrepid::FieldContainer<Real> &nodes = *meshMgr_->getNodes(); - Intrepid::FieldContainer<int> &ctn = *meshMgr_->getCellToNodeMap(); - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < numNodesPerCell_; ++j) - { - for (int k = 0; k < spaceDim_; ++k) - { - (*cellNodes_)(i, j, k) = nodes(ctn(myCellIds_[i], j), k); - } - } - } - - /****************************************************/ - /****************************************************/ - - /****************************************************************/ - /*** Assemble cellwise contributions to vectors and matrices. ***/ - /****************************************************************/ - - cellCub->getCubature(*cubPoints_, *cubWeights_); // retrieve cubature points and weights - (*basisPtrs_[0]).getValues(*gradReference_, *cubPoints_, Intrepid::OPERATOR_GRAD); // evaluate grad operator at cubature points - (*basisPtrs_[0]).getValues(*valReference_, *cubPoints_, Intrepid::OPERATOR_VALUE); // evaluate value operator at cubature points - - Intrepid::CellTools<Real>::setJacobian(*cellJac_, *cubPoints_, *cellNodes_, cellType_); // compute cell Jacobians - Intrepid::CellTools<Real>::setJacobianInv(*cellJacInv_, *cellJac_); // compute inverses of cell Jacobians - Intrepid::CellTools<Real>::setJacobianDet(*cellJacDet_, *cellJac_); // compute determinants of cell Jacobians - - Intrepid::FunctionSpaceTools::computeCellMeasure<Real>(*cellWeightedMeasure_, // compute weighted cell measure - *cellJacDet_, - *cubWeights_); - - Intrepid::FunctionSpaceTools::HGRADtransformGRAD<Real>(*gradPhysical_, // transform reference gradients into physical space - *cellJacInv_, - *gradReference_); - Intrepid::FunctionSpaceTools::multiplyMeasure<Real>(*gradPhysicalWeighted_, // multiply with weighted measure - *cellWeightedMeasure_, - *gradPhysical_); - Intrepid::FunctionSpaceTools::integrate<Real>(*gradgradMats_, // compute local grad.grad (stiffness) matrices - *gradPhysical_, - *gradPhysicalWeighted_, - Intrepid::COMP_CPP); - - Intrepid::FunctionSpaceTools::HGRADtransformVALUE<Real>(*valPhysical_, // transform reference values into physical space - *valReference_); - Intrepid::FunctionSpaceTools::multiplyMeasure<Real>(*valPhysicalWeighted_, // multiply with weighted measure - *cellWeightedMeasure_, - *valPhysical_); - Intrepid::FunctionSpaceTools::integrate<Real>(*valvalMats_, // compute local val.val (mass) matrices - *valPhysical_, - *valPhysicalWeighted_, - Intrepid::COMP_CPP); - - Intrepid::CellTools<Real>::mapToPhysicalFrame(*cubPointsPhysical_, // map reference cubature points to physical space - *cubPoints_, - *cellNodes_, - cellType_); - for (int i = 0; i < numCells_; ++i) - { // evaluate functions at these points - for (int j = 0; j < numCubPoints_; ++j) - { - (*dataF_)(i, j) = funcRHS((*cubPointsPhysical_)(i, j, 0), (*cubPointsPhysical_)(i, j, 1)); - } - } - Intrepid::FunctionSpaceTools::integrate<Real>(*datavalVecF_, // compute local data.val vectors for RHS F - *dataF_, - *valPhysicalWeighted_, - Intrepid::COMP_CPP); - - coord_iface->getDofCoords(*dofPoints_); // get coordinates of DOFs in reference cell - Intrepid::CellTools<Real>::mapToPhysicalFrame(*dofPointsPhysical_, // map reference DOF locations to physical space - *dofPoints_, - *cellNodes_, - cellType_); - for (int i = 0; i < numCells_; ++i) - { // evaluate functions at these points - for (int j = 0; j < lfs; ++j) - { - (*dataUd_)(i, j) = funcTarget((*dofPointsPhysical_)(i, j, 0), (*dofPointsPhysical_)(i, j, 1)); - } - } - - /****************************************************************/ - /****************************************************************/ - - /****************************************/ - /*** Assemble global data structures. ***/ - /****************************************/ - - // Assemble graph. - matGraph_ = Teuchos::rcp(new Tpetra::CrsGraph<>(myUniqueMap_, 0)); - Teuchos::ArrayRCP<const int> cellDofsArrayRCP = cellDofs.getData(); - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < numLocalDofs; ++j) - { - matGraph_->insertGlobalIndices(cellDofs(myCellIds_[i], j), cellDofsArrayRCP(myCellIds_[i] * numLocalDofs, numLocalDofs)); - } - } - matGraph_->fillComplete(); - - // Assemble matrices. - // Stiffness matrix A. - matA_ = Tpetra::rcp(new Tpetra::CrsMatrix<>(matGraph_)); - int numLocalMatEntries = numLocalDofs * numLocalDofs; - Teuchos::ArrayRCP<const Real> gradgradArrayRCP = gradgradMats_->getData(); - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < numLocalDofs; ++j) - { - matA_->sumIntoGlobalValues(cellDofs(myCellIds_[i], j), - cellDofsArrayRCP(myCellIds_[i] * numLocalDofs, numLocalDofs), - gradgradArrayRCP(i * numLocalMatEntries + j * numLocalDofs, numLocalDofs)); - } - } - matA_->fillComplete(); - - // Mass matrix M. - matM_ = Tpetra::rcp(new Tpetra::CrsMatrix<>(matGraph_)); - Teuchos::ArrayRCP<const Real> valvalArrayRCP = valvalMats_->getData(); - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < numLocalDofs; ++j) - { - matM_->sumIntoGlobalValues(cellDofs(myCellIds_[i], j), - cellDofsArrayRCP(myCellIds_[i] * numLocalDofs, numLocalDofs), - valvalArrayRCP(i * numLocalMatEntries + j * numLocalDofs, numLocalDofs)); - } - } - matM_->fillComplete(); - - // Assemble vectors. - // vecF_ requires assembly using vecF_overlap_ and redistribution - vecF_ = Tpetra::rcp(new Tpetra::MultiVector<>(matA_->getRangeMap(), 1, true)); - vecF_overlap_ = Tpetra::rcp(new Tpetra::MultiVector<>(myOverlapMap_, 1, true)); - for (int i = 0; i < numCells_; ++i) - { // assembly on the overlap map - for (int j = 0; j < numLocalDofs; ++j) - { - vecF_overlap_->sumIntoGlobalValue(cellDofs(myCellIds_[i], j), - 0, - (*datavalVecF_)[i * numLocalDofs + j]); - } - } - Tpetra::Export<> exporter(vecF_overlap_->getMap(), vecF_->getMap()); // redistribution: - vecF_->doExport(*vecF_overlap_, exporter, Tpetra::ADD); // from the overlap map to the unique map - // vecUd_ does not require assembly - vecUd_ = Tpetra::rcp(new Tpetra::MultiVector<>(matA_->getDomainMap(), 1, true)); - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < numLocalDofs; ++j) - { - if (vecUd_->getMap()->isNodeGlobalElement(cellDofs(myCellIds_[i], j))) - { - vecUd_->replaceGlobalValue(cellDofs(myCellIds_[i], j), - 0, - (*dataUd_)[i * numLocalDofs + j]); - } - } - } - - // Apply Dirichlet conditions. - // Stiffness matrix with Dirichlet conditions: - // AD = [ A11 A12 ] where A = [ A11 A12 ] - // [ 0 I ] [ A21 A22 ] - // Mass matrix with Dirichlet conditions: - // MD = [ M11 M12 ] where M = [ M11 M12 ] - // [ 0 0 ] [ M21 M22 ] - // Vector F with Dirichlet conditions G: - // FD = [ F1 ] where F = [ F1 ] - // [ G ] [ F2 ] - Teuchos::RCP<Tpetra::Details::DefaultTypes::node_type> node = matA_->getNode(); - matA_dirichlet_ = matA_->clone(node); - matM_dirichlet_ = matM_->clone(node); - vecF_dirichlet_ = Tpetra::rcp(new Tpetra::MultiVector<>(matA_->getRangeMap(), 1, true)); - Tpetra::deep_copy(*vecF_dirichlet_, *vecF_); - Teuchos::RCP<std::vector<std::vector<Intrepid::FieldContainer<int>>>> dirichletSideSets = meshMgr_->getSideSets(); - std::vector<std::vector<Intrepid::FieldContainer<int>>> &dss = *dirichletSideSets; - Teuchos::Array<int> mySortedCellIds_(myCellIds_); - std::sort(mySortedCellIds_.begin(), mySortedCellIds_.end()); - mySortedCellIds_.erase(std::unique(mySortedCellIds_.begin(), mySortedCellIds_.end()), mySortedCellIds_.end()); - std::vector<Teuchos::Array<int>> myDirichletCellIds_(dss[0].size()); - for (int i = 0; i < static_cast<int>(dss[0].size()); ++i) - { - for (int j = 0; j < dss[0][i].dimension(0); ++j) - { - if (std::binary_search(mySortedCellIds_.begin(), mySortedCellIds_.end(), dss[0][i](j))) - { - myDirichletCellIds_[i].push_back(dss[0][i](j)); - } - } - } - Intrepid::FieldContainer<int> &cte = *(meshMgr_->getCellToEdgeMap()); - Intrepid::FieldContainer<int> &nodeDofs = *(dofMgr_->getNodeDofs()); - Intrepid::FieldContainer<int> &edgeDofs = *(dofMgr_->getEdgeDofs()); - std::vector<std::vector<int>> dofTags = (basisPtrs_[0])->getAllDofTags(); - int numDofsPerNode = 0; - int numDofsPerEdge = 0; - for (int j = 0; j < (basisPtrs_[0])->getCardinality(); ++j) - { - if (dofTags[j][0] == 0) - { - numDofsPerNode = dofTags[j][3]; - } - if (dofTags[j][0] == 1) - { - numDofsPerEdge = dofTags[j][3]; - } - } - Teuchos::Array<int> myDirichletDofs_; - for (int i = 0; i < static_cast<int>(myDirichletCellIds_.size()); ++i) - { - for (int j = 0; j < myDirichletCellIds_[i].size(); ++j) - { - for (int k = 0; k < numDofsPerNode; ++k) - { - const CellTopologyData *ctd = cellType_.getCellTopologyData(); - Teuchos::ArrayView<unsigned> locNodes(const_cast<unsigned *>(ctd->subcell[spaceDim_ - 1][i].node), cellType_.getVertexCount(spaceDim_ - 1, i)); - for (int l = 0; l < static_cast<int>(cellType_.getVertexCount(spaceDim_ - 1, i)); ++l) - { - myDirichletDofs_.push_back(nodeDofs(ctn(myDirichletCellIds_[i][j], locNodes[l]), k)); - } - } - for (int k = 0; k < numDofsPerEdge; ++k) - { - myDirichletDofs_.push_back(edgeDofs(cte(myDirichletCellIds_[i][j], i), k)); - } - } - } - std::sort(myDirichletDofs_.begin(), myDirichletDofs_.end()); - myDirichletDofs_.erase(std::unique(myDirichletDofs_.begin(), myDirichletDofs_.end()), myDirichletDofs_.end()); - matA_dirichlet_->resumeFill(); - matM_dirichlet_->resumeFill(); - for (int i = 0; i < myDirichletDofs_.size(); ++i) - { - if (myUniqueMap_->isNodeGlobalElement(myDirichletDofs_[i])) - { - size_t numRowEntries = matA_dirichlet_->getNumEntriesInGlobalRow(myDirichletDofs_[i]); - Teuchos::Array<int> indices(numRowEntries, 0); - Teuchos::Array<Real> values(numRowEntries, 0); - Teuchos::Array<Real> canonicalValues(numRowEntries, 0); - Teuchos::Array<Real> zeroValues(numRowEntries, 0); - matA_dirichlet_->getGlobalRowCopy(myDirichletDofs_[i], indices, values, numRowEntries); - matM_dirichlet_->getGlobalRowCopy(myDirichletDofs_[i], indices, values, numRowEntries); - for (int j = 0; j < indices.size(); ++j) - { - if (myDirichletDofs_[i] == indices[j]) - { - canonicalValues[j] = 1.0; - } - } - matA_dirichlet_->replaceGlobalValues(myDirichletDofs_[i], indices, canonicalValues); - matM_dirichlet_->replaceGlobalValues(myDirichletDofs_[i], indices, zeroValues); - vecF_dirichlet_->replaceGlobalValue(myDirichletDofs_[i], 0, 0); - } - } - matA_dirichlet_->fillComplete(); - matM_dirichlet_->fillComplete(); - - // Create matrix transposes. - Tpetra::RowMatrixTransposer<> transposerA(matA_dirichlet_); - Tpetra::RowMatrixTransposer<> transposerM(matM_dirichlet_); - matA_dirichlet_trans_ = transposerA.createTranspose(); - matM_dirichlet_trans_ = transposerM.createTranspose(); - - /*********************************/ - /*** Construct solver objects. ***/ - /*********************************/ - - // Construct solver using Amesos2 factory. - try - { - solverA_ = Amesos2::create<Tpetra::CrsMatrix<>, Tpetra::MultiVector<>>("KLU2", matA_dirichlet_); - } - catch (std::invalid_argument e) - { - std::cout << e.what() << std::endl; - } - try - { - solverA_trans_ = Amesos2::create<Tpetra::CrsMatrix<>, Tpetra::MultiVector<>>("KLU2", matA_dirichlet_trans_); - } - catch (std::invalid_argument e) - { - std::cout << e.what() << std::endl; - } - solverA_->numericFactorization(); - solverA_trans_->numericFactorization(); - - /****************************************/ - /****************************************/ - - //outputTpetraData(); - } - - Teuchos::RCP<Tpetra::CrsMatrix<>> getMatA(const bool &transpose = false) const - { - if (transpose) - { - return matA_dirichlet_trans_; - } - else - { - return matA_dirichlet_; - } - } - - Teuchos::RCP<Tpetra::CrsMatrix<>> getMatB(const bool &transpose = false) const - { - if (transpose) - { - return matM_dirichlet_trans_; - } - else - { - return matM_dirichlet_; - } - } - - Teuchos::RCP<Tpetra::CrsMatrix<>> getMatM() const - { - return matM_; - } - - Teuchos::RCP<Tpetra::CrsMatrix<>> getMatR() const - { - return matM_; - } - - Teuchos::RCP<Tpetra::MultiVector<>> getVecUd() const - { - return vecUd_; - } - - Teuchos::RCP<Tpetra::MultiVector<>> getVecF() const - { - return vecF_dirichlet_; - } - - Teuchos::RCP<Amesos2::Solver<Tpetra::CrsMatrix<>, Tpetra::MultiVector<>>> getSolver(const bool &transpose = false) const - { - if (transpose) - { - return solverA_trans_; - } - else - { - return solverA_; - } - } - - Real funcRHS(const Real &x1, const Real &x2) const - { - return 2.0 * M_PI * M_PI * std::sin(M_PI * x1) * std::sin(M_PI * x2) + (1.0 / (alpha_ * 128.0 * M_PI * M_PI)) * std::sin(8.0 * M_PI * x1) * std::sin(8.0 * M_PI * x2); - } - - Real funcTarget(const Real &x1, const Real &x2) const - { - return std::sin(M_PI * x1) * std::sin(M_PI * x2) - std::sin(8.0 * M_PI * x1) * std::sin(8.0 * M_PI * x2); - } - - Real funcStateSolution(const Real &x1, const Real &x2) const - { - return std::sin(M_PI * x1) * std::sin(M_PI * x2); - } - - Real computeStateError(const Teuchos::RCP<const Tpetra::MultiVector<>> &soln) const - { - - Teuchos::RCP<Tpetra::MultiVector<>> soln_overlap = - Tpetra::rcp(new Tpetra::MultiVector<>(vecF_overlap_->getMap(), 1, true)); - Tpetra::Import<> importer(vecUd_->getMap(), soln_overlap->getMap()); // redistribution: - soln_overlap->doImport(*soln, importer, Tpetra::REPLACE); // from the unique map to the overlap map - - Intrepid::DefaultCubatureFactory<Real> cubFactory; // create cubature factory - int cubDeg = 6; // set cubature degree, e.g., 6 - Teuchos::RCP<Intrepid::Cubature<Real>> cellCub = cubFactory.create(cellType_, cubDeg); // create cubature for error computation - int numCubPts = cellCub->getNumPoints(); // retrieve number of cubature points - int lfs = dofMgr_->getLocalFieldSize(0); - Intrepid::FieldContainer<Real> cubPts(numCubPts, spaceDim_); - Intrepid::FieldContainer<Real> cubWts(numCubPts); - Intrepid::FieldContainer<Real> cubPtsPhys(numCells_, numCubPts, spaceDim_); - Intrepid::FieldContainer<Real> jac(numCells_, numCubPts, spaceDim_, spaceDim_); - Intrepid::FieldContainer<Real> jacDet(numCells_, numCubPts); - Intrepid::FieldContainer<Real> valRef(lfs, numCubPts); - Intrepid::FieldContainer<Real> valPhys(numCells_, lfs, numCubPts); - Intrepid::FieldContainer<Real> wtMeas(numCells_, numCubPts); - Intrepid::FieldContainer<Real> inCoeffs(numCells_, lfs); - Intrepid::FieldContainer<Real> funcVals(numCells_, numCubPts); - Intrepid::FieldContainer<Real> funcValsWt(numCells_, numCubPts); - Intrepid::FieldContainer<Real> normSquaredError(numCells_); - - cellCub->getCubature(cubPts, cubWts); // retrieve cubature points and weights - (*basisPtrs_[0]).getValues(valRef, cubPts, Intrepid::OPERATOR_VALUE); // evaluate value operator at cubature points - - Intrepid::CellTools<Real>::setJacobian(jac, cubPts, *cellNodes_, cellType_); // compute cell Jacobians - Intrepid::CellTools<Real>::setJacobianDet(jacDet, jac); // compute determinants of cell Jacobians - - Intrepid::FunctionSpaceTools::HGRADtransformVALUE<Real>(valPhys, // transform reference values into physical space - valRef); - - Intrepid::FunctionSpaceTools::computeCellMeasure<Real>(wtMeas, // compute weighted cell measure - jacDet, - cubWts); - - Intrepid::CellTools<Real>::mapToPhysicalFrame(cubPtsPhys, // map reference cubature points to physical space - cubPts, - *cellNodes_, - cellType_); - - Intrepid::FieldContainer<int> &cellDofs = *(dofMgr_->getCellDofs()); - Teuchos::ArrayRCP<const Real> soln_data = soln_overlap->get1dView(); // populate inCoeffs - for (int i = 0; i < numCells_; ++i) - { - for (int j = 0; j < lfs; ++j) - { - inCoeffs(i, j) = soln_data[soln_overlap->getMap()->getLocalElement(cellDofs(myCellIds_[i], j))]; - } - } - - Intrepid::FunctionSpaceTools::evaluate<Real>(funcVals, inCoeffs, valPhys); - - for (int i = 0; i < numCells_; ++i) - { // compute error - for (int j = 0; j < numCubPts; ++j) - { - funcVals(i, j) -= funcStateSolution(cubPtsPhys(i, j, 0), cubPtsPhys(i, j, 1)); - } - } - - Intrepid::FunctionSpaceTools::scalarMultiplyDataData<Real>(funcValsWt, // multiply with weighted measure - wtMeas, - funcVals); - - Intrepid::FunctionSpaceTools::integrate<Real>(normSquaredError, // compute norm squared of local error - funcVals, - funcValsWt, - Intrepid::COMP_CPP); - - Real localErrorSum(0); - Real globalErrorSum(0); - for (int i = 0; i < numCells_; ++i) - { - localErrorSum += normSquaredError(i); - } - Teuchos::RCP<const Teuchos::Comm<int>> comm = soln_overlap->getMap()->getComm(); - Teuchos::reduceAll<int, Real>(*comm, Teuchos::REDUCE_SUM, 1, &localErrorSum, &globalErrorSum); - - return globalErrorSum; - } - - void printMeshData(std::ostream &outStream) const - { - Teuchos::RCP<Intrepid::FieldContainer<Real>> nodesPtr = meshMgr_->getNodes(); - Teuchos::RCP<Intrepid::FieldContainer<int>> cellToNodeMapPtr = meshMgr_->getCellToNodeMap(); - Intrepid::FieldContainer<Real> &nodes = *nodesPtr; - Intrepid::FieldContainer<int> &cellToNodeMap = *cellToNodeMapPtr; - outStream << "Number of nodes = " << meshMgr_->getNumNodes() << std::endl; - outStream << "Number of cells = " << meshMgr_->getNumCells() << std::endl; - outStream << "Number of edges = " << meshMgr_->getNumEdges() << std::endl; - // Print mesh to file. - if ((myRank_ == 0)) - { - std::ofstream meshfile; - meshfile.open("cell_to_node_quad.txt"); - for (int i = 0; i < cellToNodeMap.dimension(0); ++i) - { - for (int j = 0; j < cellToNodeMap.dimension(1); ++j) - { - meshfile << cellToNodeMap(i, j) << " "; - } - meshfile << std::endl; - } - meshfile.close(); - meshfile.open("cell_to_node_tri.txt"); - for (int i = 0; i < cellToNodeMap.dimension(0); ++i) - { - for (int j = 0; j < 3; ++j) - { - meshfile << cellToNodeMap(i, j) << " "; - } - meshfile << std::endl; - for (int j = 2; j < 5; ++j) - { - meshfile << cellToNodeMap(i, j % 4) << " "; - } - meshfile << std::endl; - } - meshfile.close(); - meshfile.open("nodes.txt"); - meshfile.precision(16); - for (int i = 0; i < nodes.dimension(0); ++i) - { - for (int j = 0; j < nodes.dimension(1); ++j) - { - meshfile << std::scientific << nodes(i, j) << " "; - } - meshfile << std::endl; - } - meshfile.close(); - /* This somewhat clunky output is for gnuplot. - meshfile.open("mesh.txt"); - for (int i=0; i<cellToNodeMap.dimension(0); ++i) { - meshfile << nodes(cellToNodeMap(i,0), 0) << " " << nodes(cellToNodeMap(i,0), 1) << std::endl; - meshfile << nodes(cellToNodeMap(i,1), 0) << " " << nodes(cellToNodeMap(i,1), 1) << std::endl; - meshfile << nodes(cellToNodeMap(i,2), 0) << " " << nodes(cellToNodeMap(i,2), 1) << std::endl; - meshfile << nodes(cellToNodeMap(i,3), 0) << " " << nodes(cellToNodeMap(i,3), 1) << std::endl; - meshfile << nodes(cellToNodeMap(i,0), 0) << " " << nodes(cellToNodeMap(i,0), 1) << std::endl; - meshfile << nodes(cellToNodeMap(i,1), 0) << " " << nodes(cellToNodeMap(i,1), 1) << std::endl; - meshfile << nodes(cellToNodeMap(i,2), 0) << " " << nodes(cellToNodeMap(i,2), 1) << std::endl; - } - meshfile.close(); - */ - } - } - - void outputTpetraData() const - { - Tpetra::MatrixMarket::Writer<Tpetra::CrsMatrix<>> matWriter; - matWriter.writeSparseFile("stiffness_mat", matA_); - matWriter.writeSparseFile("dirichlet_mat", matA_dirichlet_); - matWriter.writeSparseFile("mass_mat", matM_); - matWriter.writeDenseFile("Ud_vec", vecUd_); - } - - void outputTpetraVector(const Teuchos::RCP<const Tpetra::MultiVector<>> &vec, - const std::string &filename) const - { - Tpetra::MatrixMarket::Writer<Tpetra::CrsMatrix<>> vecWriter; - vecWriter.writeDenseFile(filename, vec); - } - -}; // class PoissonData - -#endif diff --git a/tlnos/src/objective.hpp b/tlnos/src/objective.hpp deleted file mode 100644 index 42c4e5b5..00000000 --- a/tlnos/src/objective.hpp +++ /dev/null @@ -1,177 +0,0 @@ -// @HEADER -// ************************************************************************ -// -// Rapid Optimization Library (ROL) Package -// Copyright (2014) Sandia Corporation -// -// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -// license for use of this work by or on behalf of the U.S. Government. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact lead developers: -// Drew Kouri (dpkouri@sandia.gov) and -// Denis Ridzal (dridzal@sandia.gov) -// -// ************************************************************************ -// @HEADER - -/*! \file objective.hpp - \brief Defines the SimOpt objective function for the 'poisson' example. -*/ - -#ifndef ROL_PDEOPT_POISSON_OBJECTIVE_H -#define ROL_PDEOPT_POISSON_OBJECTIVE_H - -#include "ROL_Objective_SimOpt.hpp" -#include "ROL_TpetraMultiVector.hpp" -#include "data.hpp" - -template <class Real> -class Objective_PDEOPT_Poisson : public ROL::Objective_SimOpt<Real> -{ -private: - Teuchos::RCP<PoissonData<Real>> data_; - Real alpha_; - -public: - Objective_PDEOPT_Poisson(const Teuchos::RCP<PoissonData<Real>> &data, - const Teuchos::RCP<Teuchos::ParameterList> &parlist) - { - data_ = data; - alpha_ = parlist->sublist("Problem").get("Penalty parameter", 1e-2); - } - - Real value(const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol) - { - Teuchos::RCP<const Tpetra::MultiVector<>> up = - (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real>>(u)).getVector(); - Teuchos::RCP<const Tpetra::MultiVector<>> zp = - (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real>>(z)).getVector(); - - Teuchos::Array<Real> dotvalU(1, 0); - Teuchos::Array<Real> dotvalZ(1, 0); - - // Set difference vector diffp to up. - Teuchos::RCP<Tpetra::MultiVector<>> diffp = - Teuchos::rcp(new Tpetra::MultiVector<>(*up, Teuchos::Copy)); - // Temporary matvec vector. - Teuchos::RCP<Tpetra::MultiVector<>> matvecp = - Teuchos::rcp(new Tpetra::MultiVector<>(*up, Teuchos::Copy)); - - // (u-ud) - diffp->update(-1.0, *(data_->getVecUd()), 1.0); - // M*(u-ud) - data_->getMatM()->apply(*diffp, *matvecp); - // (u-ud)'*M*(u-ud) - diffp->dot(*matvecp, dotvalU); - - // R*z - data_->getMatR()->apply(*zp, *matvecp); - // z'*R*z - zp->dot(*matvecp, dotvalZ); - - // 1/2 * (u-ud)'*M*(u-ud) + alpha/2 * z'*R*z - return (0.5 * dotvalU[0] + 0.5 * alpha_ * dotvalZ[0]); - } - - void gradient_1(ROL::Vector<Real> &g, const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol) - { - Teuchos::RCP<Tpetra::MultiVector<>> gp = - (Teuchos::dyn_cast<ROL::TpetraMultiVector<Real>>(g)).getVector(); - Teuchos::RCP<const Tpetra::MultiVector<>> up = - (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real>>(u)).getVector(); - - // Set difference vector diffp to up. - Teuchos::RCP<Tpetra::MultiVector<>> diffp = - Teuchos::rcp(new Tpetra::MultiVector<>(*up, Teuchos::Copy)); - // (u-ud) - diffp->update(-1.0, *(data_->getVecUd()), 1.0); - // M*(u-ud) - data_->getMatM()->apply(*diffp, *gp); - } - - void gradient_2(ROL::Vector<Real> &g, const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol) - { - Teuchos::RCP<Tpetra::MultiVector<>> gp = - (Teuchos::dyn_cast<ROL::TpetraMultiVector<Real>>(g)).getVector(); - Teuchos::RCP<const Tpetra::MultiVector<>> zp = - (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real>>(z)).getVector(); - - // alpha * R*z - data_->getMatR()->apply(*zp, *gp); - gp->scale(alpha_); - } - - void hessVec_11(ROL::Vector<Real> &hv, const ROL::Vector<Real> &v, - const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol) - { - Teuchos::RCP<Tpetra::MultiVector<>> hvp = - (Teuchos::dyn_cast<ROL::TpetraMultiVector<Real>>(hv)).getVector(); - Teuchos::RCP<const Tpetra::MultiVector<>> vp = - (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real>>(v)).getVector(); - - // M*v - data_->getMatM()->apply(*vp, *hvp); - } - - void hessVec_12(ROL::Vector<Real> &hv, const ROL::Vector<Real> &v, - const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol) - { - Teuchos::RCP<Tpetra::MultiVector<>> hvp = - (Teuchos::dyn_cast<ROL::TpetraMultiVector<Real>>(hv)).getVector(); - - // zero - hvp->scale(0); - } - - void hessVec_21(ROL::Vector<Real> &hv, const ROL::Vector<Real> &v, - const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol) - { - Teuchos::RCP<Tpetra::MultiVector<>> hvp = - (Teuchos::dyn_cast<ROL::TpetraMultiVector<Real>>(hv)).getVector(); - - // zero - hvp->scale(0); - } - - void hessVec_22(ROL::Vector<Real> &hv, const ROL::Vector<Real> &v, - const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol) - { - Teuchos::RCP<Tpetra::MultiVector<>> hvp = - (Teuchos::dyn_cast<ROL::TpetraMultiVector<Real>>(hv)).getVector(); - Teuchos::RCP<const Tpetra::MultiVector<>> vp = - (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real>>(v)).getVector(); - - // alpha * R*v - data_->getMatR()->apply(*vp, *hvp); - hvp->scale(alpha_); - } -}; - -#endif diff --git a/tlnos/src/tlnos.h b/tlnos/src/tlnos.h deleted file mode 100644 index 208f1e93..00000000 --- a/tlnos/src/tlnos.h +++ /dev/null @@ -1,36 +0,0 @@ -// global header of the "tlnos" module - -#ifndef TLNOS_H -#define TLNOS_H - -#if defined(WIN32) -#ifdef tlnos_EXPORTS -#define TLNOS_API __declspec(dllexport) -#else -#define TLNOS_API __declspec(dllimport) -#endif -#else -#define TLNOS_API -#endif - -#include "tbox.h" - -/** - * @brief this namespace avoids conflicts with similar names in other modules - */ - -namespace tlnos -{ -class Example1; -class Example2; -class Example3; -class Example4; -class Example5; -class Example6; -class Example7; -class Example8; -class Example9; -class Example10; -}; // namespace tlnos - -#endif //TLNOS_H diff --git a/tlnos/src/wExample1.cpp b/tlnos/src/wExample1.cpp deleted file mode 100644 index 34bae2df..00000000 --- a/tlnos/src/wExample1.cpp +++ /dev/null @@ -1,98 +0,0 @@ -#include "wExample1.h" - -#ifdef MYAPP_MPI -#include "Teuchos_DefaultMpiComm.hpp" -#else -#include "Teuchos_DefaultSerialComm.hpp" -#endif - -#ifdef MYAPP_EPETRA -#include "Epetra_SerialDenseVector.h" -#endif - -using namespace tlnos; - -Example1::Example1() -{ -} - -int Example1::src_file(std::string const &infile, Teuchos::Comm<int> &comm) -{ - Teuchos::ParameterList p; - Teuchos::Ptr<Teuchos::ParameterList> pref(&p); - Teuchos::updateParametersFromXmlFileAndBroadcast(infile, pref, comm); - - std::cout << "\nProcessor " << comm.getRank() - << " has param list : \n" - << p << std::endl; - - return 0; -} - -void Example1::write(std::ostream &out) const -{ - out << "tlnos::Example1:\n"; -} - -int Example1::execute(std::string const &infile) -{ - /* - int *argc = new int(1);// mem leak volontaire - // ATTENTION: argv doit rester alloué pdt toute la durée de vie d'appli! - char **argv = new char*[2];// mem leak volontaire - argv[0] = new char[6]; strcpy(argv[0], "MyApp"); // mem leak volontaire - argv[1] = new char[1]; strcpy(argv[1], ""); // mem leak volontaire - */ - int status = 0; - - // Initialize MPI and timer - //Teuchos::GlobalMPISession mpiSession(argc,&argv); // [RB] does not work anymore... (MPI already initialised?) - Teuchos::GlobalMPISession mpiSession(); // [RB] from https://trilinos.org/pipermail/trilinos-users/2016-July/005597.html - - // Use of flag set in CMakeLists.txt by how Trilinos was configured -#ifdef MYAPP_MPI - Teuchos::MpiComm<int> comm = - Teuchos::MpiComm<int>(Teuchos::opaqueWrapper((MPI_Comm)MPI_COMM_WORLD)); -#else - Teuchos::SerialComm<int> comm = Teuchos::SerialComm<int>(); -#endif - - try - { - // Function from another file - status = src_file(infile, comm); - - // Flag set in CMakeLists.txt that detects if Epetra was enabled in Trilinos -#ifdef MYAPP_EPETRA - const int len = 10; - Epetra_SerialDenseVector vec(len); - if (vec.Length() != len) - status += 1000; - std::cout << "\nEpetra called for vec of length " << len << std::endl; -#endif - } - - catch (std::exception &e) - { - std::cout << e.what() << std::endl; - status = 10; - } - catch (std::string &s) - { - std::cout << s << std::endl; - status = 20; - } - catch (char *s) - { - std::cout << s << std::endl; - status = 30; - } - catch (...) - { - std::cout << "Caught unknown exception!" << std::endl; - status = 40; - } - - // Status=0 signals to ctest that the test passed. - return status; -} diff --git a/tlnos/src/wExample1.h b/tlnos/src/wExample1.h deleted file mode 100644 index 8d066618..00000000 --- a/tlnos/src/wExample1.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef WEXAMPLE1_H -#define WEXAMPLE1_H - -#include "tlnos.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <string> -#ifndef SWIG -#include "Teuchos_Comm.hpp" -#include "Teuchos_XMLParameterListHelpers.hpp" -#endif - -namespace tlnos -{ - -/** - * @brief a class containing the "build-against-trilinos" example of trilinos - */ - -class TLNOS_API Example1 : public fwk::wObject -{ -public: - Example1(); - int execute(std::string const &infile); - -#ifndef SWIG - virtual void write(std::ostream &out) const; -#endif - -private: - int src_file(std::string const &infile, Teuchos::Comm<int> &comm); -}; - -} // namespace tlnos - -#endif //WEXAMPLE1_H diff --git a/tlnos/src/wExample10.cpp b/tlnos/src/wExample10.cpp deleted file mode 100644 index 92aaf7e9..00000000 --- a/tlnos/src/wExample10.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "wExample10.h" - -#include "Epetra_SerialDenseVector.h" -#include "Epetra_SerialDenseMatrix.h" - -#include "Tpetra_Vector.hpp" - -using namespace tlnos; - -Example10::Example10() -{ -} - -int Example10::execute() -{ - - int NumRowsA = 2, NumColsA = 2; - int NumRowsB = 2, NumColsB = 1; - Epetra_SerialDenseMatrix A, B; - A.Shape(NumRowsA, NumColsA); - B.Shape(NumRowsB, NumColsB); - A(0, 0) = 1.; - A(1, 1) = 2.; - - B(0, 0) = 2.5; - B(1, 0) = 2.; - Epetra_SerialDenseMatrix AtimesB; - - AtimesB.Shape(NumRowsA, NumColsB); - double alpha = 1.0, beta = 1.0; - AtimesB.Multiply('N', 'N', alpha, A, B, beta); - std::cout << A; - std::cout << B; - std::cout << AtimesB; - return 0; -} diff --git a/tlnos/src/wExample10.h b/tlnos/src/wExample10.h deleted file mode 100644 index 0f8a7c18..00000000 --- a/tlnos/src/wExample10.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef WEXAMPLE10_H -#define WEXAMPLE10_H - -#include "tlnos.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <string> -#ifndef SWIG -#include "Teuchos_Comm.hpp" -#include "Teuchos_XMLParameterListHelpers.hpp" -#endif - -namespace tlnos -{ - -/** - * @brief a class containing the "build-against-trilinos" example of trilinos - */ - -class TLNOS_API Example10 : public fwk::wObject -{ -public: - Example10(); - int execute(); -}; - -} // namespace tlnos - -#endif //WEXAMPLE10_H diff --git a/tlnos/src/wExample2.cpp b/tlnos/src/wExample2.cpp deleted file mode 100644 index eb028704..00000000 --- a/tlnos/src/wExample2.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "wExample2.h" - -#include "Epetra_SerialDenseVector.h" -#include "Epetra_SerialDenseMatrix.h" - -#include "Tpetra_Vector.hpp" - -using namespace tlnos; - -Example2::Example2() -{ -} - -int Example2::execute() -{ - - int NumRowsA = 2, NumColsA = 2; - int NumRowsB = 2, NumColsB = 1; - Epetra_SerialDenseMatrix A, B; - A.Shape(NumRowsA, NumColsA); - B.Shape(NumRowsB, NumColsB); - A(0, 0) = 1.; - A(1, 1) = 2.; - - B(0, 0) = 2.5; - B(1, 0) = 2.; - Epetra_SerialDenseMatrix AtimesB; - - AtimesB.Shape(NumRowsA, NumColsB); - double alpha = 1.0, beta = 1.0; - AtimesB.Multiply('N', 'N', alpha, A, B, beta); - std::cout << A; - std::cout << B; - std::cout << AtimesB; - return 0; -} diff --git a/tlnos/src/wExample2.h b/tlnos/src/wExample2.h deleted file mode 100644 index e12584ca..00000000 --- a/tlnos/src/wExample2.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef WEXAMPLE2_H -#define WEXAMPLE2_H - -#include "tlnos.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <string> -#ifndef SWIG -#include "Teuchos_Comm.hpp" -#include "Teuchos_XMLParameterListHelpers.hpp" -#endif - -namespace tlnos -{ - -/** - * @brief a class containing the "build-against-trilinos" example of trilinos - */ - -class TLNOS_API Example2 : public fwk::wObject -{ -public: - Example2(); - int execute(); -}; - -} // namespace tlnos - -#endif //WEXAMPLE2_H diff --git a/tlnos/src/wExample3.cpp.disabled b/tlnos/src/wExample3.cpp.disabled deleted file mode 100644 index 344f9a92..00000000 --- a/tlnos/src/wExample3.cpp.disabled +++ /dev/null @@ -1,373 +0,0 @@ -#include "wExample3.h" - -// -// Simple example of solving the following nonlinear system of -// equations -// -// x(0)^2 + x(1)^2 -1 = 0 -// x(1) - x(0)^2 = 0 -// -// using NOX (Trilinos' Nonlinear Object-Oriented Solutions package). -// For more details and documentation, see the NOX web site: -// -// http://trilinos.sandia.gov/packages/nox/ -// -// NOTE: Due to the very small dimension of the problem, it should be -// run with only one MPI process. We enforce this below by creating a -// subcommunicator containing only MPI Proc 0, and running the problem -// on that communicator, quieting all the others. -// -#include <iostream> - -#include "Epetra_ConfigDefs.h" -#ifdef HAVE_MPI -# include "mpi.h" -# include "Epetra_MpiComm.h" -#else -# include "Epetra_SerialComm.h" -#endif - - - -#include "Epetra_Map.h" -#include "Epetra_Vector.h" -#include "Epetra_RowMatrix.h" -#include "Epetra_CrsMatrix.h" - - -#include "NOX.H" -#include "NOX_Epetra_Interface_Required.H" -#include "NOX_Epetra_Interface_Jacobian.H" -#include "NOX_Epetra_LinearSystem_AztecOO.H" -#include "NOX_Epetra_Group.H" - -// ========================================================================== -// SimpleProblemInterface, the problem interface in this example, -// defines the interface between NOX and our nonlinear problem to -// solve. -// ========================================================================== -class SimpleProblemInterface : - public NOX::Epetra::Interface::Required, - public NOX::Epetra::Interface::Jacobian -{ -public: - - // The constructor accepts an initial guess and the exact solution - // vector (which we know because we created the example). We make - // deep copies of each. - SimpleProblemInterface (Epetra_Vector& InitialGuess, - Epetra_Vector& ExactSolution) : - InitialGuess_ (new Epetra_Vector (InitialGuess)), - ExactSolution_ (new Epetra_Vector (ExactSolution)) - {} - - // Destructor. - ~SimpleProblemInterface() {} - - // Compute f := F(x), where x is the input vector and f the output - // vector. - bool - computeF (const Epetra_Vector & x, - Epetra_Vector & f, - NOX::Epetra::Interface::Required::FillType F) - { - f[0] = x[0]*x[0] + x[1]*x[1] - 1.0; - f[1] = x[1] - x[0]*x[0]; - - return true; - }; - - bool - computeJacobian(const Epetra_Vector & x, Epetra_Operator & Jac) - { - Epetra_CrsMatrix* J = dynamic_cast<Epetra_CrsMatrix*>(&Jac); - - if (J == NULL) { - std::ostringstream os; - os << "*** Problem_Interface::computeJacobian() - The supplied " - << "Epetra_Operator object is NOT an Epetra_CrsMatrix! ***"; - throw std::runtime_error (os.str()); - } - - std::vector<int> indices(2); - std::vector<double> values(2); - - indices[0] = 0; - indices[1] = 1; - - // Row 0 - values[0] = 2.0 * x[0]; - values[1] = 2.0 * x[1]; - J->ReplaceGlobalValues (0, 2, &values[0], &indices[0]); - - // Row 1 - values[0] = - 2.0 * x[0]; - values[1] = 1.0; - J->ReplaceGlobalValues (1, 2, &values[0], &indices[0]); - - return true; - } - - bool - computePrecMatrix (const Epetra_Vector & x, - Epetra_RowMatrix & M) - { - throw std::runtime_error ("*** SimpleProblemInterface does not implement " - "computing an explicit preconditioner from an " - "Epetra_RowMatrix ***"); - } - - bool - computePreconditioner (const Epetra_Vector & x, - Epetra_Operator & O) - { - throw std::runtime_error ("*** SimpleProblemInterface does not implement " - "computing an explicit preconditioner from an " - "Epetra_Operator ***"); - } - -private: - Teuchos::RCP<Epetra_Vector> InitialGuess_; - Teuchos::RCP<Epetra_Vector> ExactSolution_; -}; - -// =========== // -// main driver // -// =========== // - -using namespace tlnos; - -Example3::Example3() -{ -} - - -int -Example3::execute() -{ - using Teuchos::ParameterList; - using Teuchos::parameterList; - using Teuchos::RCP; - using Teuchos::rcp; - using std::cout; - using std::endl; - - -#ifdef HAVE_MPI - int argc = 1; - MPI_Init(&argc, NULL); - Epetra_MpiComm CommWorld (MPI_COMM_WORLD); -#else - Epetra_SerialComm CommWorld; -#endif - - - // The example problem is so small that we must run it on only one - // process. However, people might run this example code in MPI with - // any number of processes. We handle this by using a communicator - // containing only one MPI process, and quieting all processes but - // Proc 0 (with respect to MPI_COMM_WORLD). - if (CommWorld.MyPID() == 0) - { -#ifdef HAVE_MPI - Epetra_MpiComm Comm (MPI_COMM_SELF); -#else - Epetra_SerialComm Comm; -#endif - - // Linear map for the 2 global elements. - Epetra_Map Map (2, 0, Comm); - - // Build up initial guess and exact solution vectors. - Epetra_Vector ExactSolution (Map); - ExactSolution[0] = sqrt (0.5 * (sqrt (5.0) - 1)); - ExactSolution[1] = 0.5 * (sqrt (5.0) - 1); - - Epetra_Vector InitialGuess (Map); - InitialGuess[0] = 0.5; - InitialGuess[1] = 0.5; - - // Set up the problem interface. Your application will define - // its own problem interface. SimpleProblemInterface is our - // example interface, which you can use as a model. - // - // Our SimpleProblemInterface makes a deep copy of the initial - // guess and exact solution vectors. - RCP<SimpleProblemInterface> interface = - rcp (new SimpleProblemInterface (InitialGuess, ExactSolution)); - - // Create the top-level parameter list to control NOX. - // - // "parameterList" (lowercase initial "p") is a "nonmember - // constructor" that returns an RCP<ParameterList> with the - // given name. - RCP<ParameterList> params = parameterList ("NOX"); - - // Tell the nonlinear solver to use line search. - params->set ("Nonlinear Solver", "Line Search Based"); - - // - // Set the printing parameters in the "Printing" sublist. - // - ParameterList& printParams = params->sublist ("Printing"); - printParams.set ("MyPID", Comm.MyPID ()); - printParams.set ("Output Precision", 3); - printParams.set ("Output Processor", 0); - - // Set verbose=true to see a whole lot of intermediate status - // output, during both linear and nonlinear iterations. - const bool verbose = false; - if (verbose) { - printParams.set ("Output Information", - NOX::Utils::OuterIteration + - NOX::Utils::OuterIterationStatusTest + - NOX::Utils::InnerIteration + - NOX::Utils::Parameters + - NOX::Utils::Details + - NOX::Utils::Warning); - } else { - printParams.set ("Output Information", NOX::Utils::Warning); - } - - // - // Set the nonlinear solver parameters. - // - - // Line search parameters. - ParameterList& searchParams = params->sublist ("Line Search"); - searchParams.set ("Method", "Full Step"); - - // Parameters for picking the search direction. - ParameterList& dirParams = params->sublist ("Direction"); - // Use Newton's method to pick the search direction. - dirParams.set ("Method", "Newton"); - - // Parameters for Newton's method. - ParameterList& newtonParams = dirParams.sublist ("Newton"); - newtonParams.set ("Forcing Term Method", "Constant"); - - // - // Newton's method invokes a linear solver repeatedly. - // Set the parameters for the linear solver. - // - ParameterList& lsParams = newtonParams.sublist ("Linear Solver"); - - // Use Aztec's implementation of GMRES, with at most 800 - // iterations, a residual tolerance of 1.0e-4, with output every - // 50 iterations, and Aztec's native ILU preconditioner. - lsParams.set ("Aztec Solver", "GMRES"); - lsParams.set ("Max Iterations", 800); - lsParams.set ("Tolerance", 1e-4); - lsParams.set ("Output Frequency", 50); - lsParams.set ("Aztec Preconditioner", "ilu"); - - // - // Build the Jacobian matrix. - // - RCP<Epetra_CrsMatrix> A = rcp (new Epetra_CrsMatrix (Copy, Map, 2)); - { - std::vector<int> indices(2); - std::vector<double> values(2); - - indices[0]=0; - indices[1]=1; - - values[0] = 2.0 * InitialGuess[0]; - values[1] = 2.0 * InitialGuess[1]; - A.get()->InsertGlobalValues (0, 2, &values[0], &indices[0]); - - values[0] = -2.0 * InitialGuess[0]; - values[1] = 1.0; - A.get()->InsertGlobalValues (1, 2, &values[0], &indices[0]); - - A.get()->FillComplete(); - } - - // Our SimpleProblemInterface implements both Required and - // Jacobian, so we can use the same object for each. - RCP<NOX::Epetra::Interface::Required> iReq = interface; - RCP<NOX::Epetra::Interface::Jacobian> iJac = interface; - - RCP<NOX::Epetra::LinearSystemAztecOO> linSys = - rcp (new NOX::Epetra::LinearSystemAztecOO (printParams, lsParams, - iReq, iJac, A, InitialGuess)); - - // Need a NOX::Epetra::Vector for constructor. - NOX::Epetra::Vector noxInitGuess (InitialGuess, NOX::DeepCopy); - RCP<NOX::Epetra::Group> group = - rcp (new NOX::Epetra::Group (printParams, iReq, noxInitGuess, linSys)); - - // - // Set up NOX's iteration stopping criteria ("status tests"). - // - - // ||F(X)||_2 / N < 1.0e-4, where N is the length of F(X). - // - // NormF has many options for setting up absolute vs. relative - // (scaled by the norm of the initial guess) tolerances, scaling - // or not scaling by the length of F(X), and choosing a - // different norm (we use the 2-norm here). - RCP<NOX::StatusTest::NormF> testNormF = - rcp (new NOX::StatusTest::NormF (1.0e-4)); - - // At most 20 (nonlinear) iterations. - RCP<NOX::StatusTest::MaxIters> testMaxIters = - rcp (new NOX::StatusTest::MaxIters (20)); - - // Combine the above two stopping criteria (normwise - // convergence, and maximum number of nonlinear iterations). - // The result tells NOX to stop if at least one of them is - // satisfied. - RCP<NOX::StatusTest::Combo> combo = - rcp (new NOX::StatusTest::Combo (NOX::StatusTest::Combo::OR, - testNormF, testMaxIters)); - - // Create the NOX nonlinear solver. - RCP<NOX::Solver::Generic> solver = - NOX::Solver::buildSolver (group, combo, params); - - // Solve the nonlinear system. - NOX::StatusTest::StatusType status = solver->solve(); - - // Print the result. - // - // For this particular example, Comm contains only one MPI - // process. However, we check for Comm.MyPID() == 0 here just - // so that the example is fully general. (If you're solving a - // larger nonlinear problem, you could safely use the code - // below.) - if (Comm.MyPID() == 0) { - cout << endl << "-- Parameter List From Solver --" << endl; - solver->getList ().print (cout); - } - - // Get the Epetra_Vector with the final solution from the solver. - const NOX::Epetra::Group& finalGroup = - dynamic_cast<const NOX::Epetra::Group&>(solver->getSolutionGroup()); - - const Epetra_Vector& finalSolution = - dynamic_cast<const NOX::Epetra::Vector&> (finalGroup.getX ()).getEpetraVector (); - - if (Comm.MyPID() == 0) { - cout << "Computed solution: " << endl; - } - // Epetra objects know how to print themselves politely when - // their operator<<(std::ostream&) is invoked on all MPI - // process(es) in the communicator to which they are associated. - cout << finalSolution; - - if (Comm.MyPID() == 0) { - cout << "Exact solution: " << endl; - } - cout << ExactSolution; - } - - // Remember how we quieted all MPI processes but Proc 0 above? - // Now we're back in MPI_COMM_WORLD again. -#ifdef HAVE_MPI - // Make sure that everybody is done before calling MPI_Finalize(). - MPI_Barrier (MPI_COMM_WORLD); - MPI_Finalize(); -#endif - return EXIT_SUCCESS; -} diff --git a/tlnos/src/wExample3.h.disabled b/tlnos/src/wExample3.h.disabled deleted file mode 100644 index 8129728d..00000000 --- a/tlnos/src/wExample3.h.disabled +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef WEXAMPLE3_H -#define WEXAMPLE3_H - -#include "tlnos.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <string> -#ifndef SWIG -#include "Teuchos_Comm.hpp" -#include "Teuchos_XMLParameterListHelpers.hpp" -#endif - -namespace tlnos { - -/** - * @brief a class containing the "build-against-trilinos" example of trilinos - */ - -class TLNOS_API Example3 : public fwk::wObject -{ -public: - Example3(); - int execute(); - -}; - -} - -#endif //WEXAMPLE3_H diff --git a/tlnos/src/wExample4.cpp b/tlnos/src/wExample4.cpp deleted file mode 100644 index b5daac2a..00000000 --- a/tlnos/src/wExample4.cpp +++ /dev/null @@ -1,266 +0,0 @@ -#include "wExample4.h" - -// @HEADER -// ************************************************************************ -// -// Galeri: Finite Element and Matrix Generation Package -// Copyright (2006) ETHZ/Sandia Corporation -// -// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -// license for use of this work by or on behalf of the U.S. Government. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions about Galeri? Contact Marzio Sala (marzio.sala _AT_ gmail.com) -// -// ************************************************************************ -// @HEADER - -#include "Galeri_ConfigDefs.h" -#include "Galeri_Utils.h" -#include "Galeri_FiniteElements.h" -#ifdef HAVE_MPI -#include "mpi.h" -#include "Epetra_MpiComm.h" -#else -#include "Epetra_SerialComm.h" -#endif - -#ifdef MOERTEL_HAVE_EXODUS -#include "ExodusInterface.h" // NOT COMPILED BY KIM! -#endif - -// ========================================================== -// This file solves the scalar elliptic problem -// -// - \mu \nabla u + \sigma u = f on \Omega -// u = g on \partial \Omega -// -// where \Omega is a 3D cube, divided into hexahedra. -// `f' is specified by function `Force()', the Dirichlet boundary condition -// by function `BoundaryValue()', and the value of \mu and -// \sigma can be changed in the functions Diffusion() and -// Source(). The code solves the corresponding linear system -// using AztecOO with ML preconditioner, and writes the -// solution into a MEDIT-compatible format. Then, it computes -// the L2 and H1 norms of the solution and the error. -// -// \author Marzio Sala, ETHZ/COLAB -// -// \date Last updated on 15-Sep-05 -// ========================================================== - -double Diffusion4(const double &x, const double &y, const double &z) -{ - return (1.0); -} - -double Source4(const double &x, const double &y, const double &z) -{ - return (0.0); -} - -double Force4(const double &x, const double &y, const double &z) -{ - return (-6.0); -} - -// Specifies the boundary condition. -double BoundaryValue4(const double &x, const double &y, - const double &z, const int &PatchID) -{ - return (x * x + y * y + z * z); -} - -// Specifies the boundary condition. -int BoundaryType4(const int &PatchID) -{ - return (Galeri::FiniteElements::GALERI_DIRICHLET); -} - -// Returns the value of the exact solution and its first -// derivatives with respect to x, y and z. -int ExactSolution(double x, double y, double z, double *res) -{ - res[0] = x * x + y * y + z * z; - res[1] = 2 * x; - res[2] = 2 * y; - res[3] = 2 * z; - - return (0); -} - -using namespace Galeri; -using namespace Galeri::FiniteElements; - -// =========== // -// main driver // -// =========== // - -using namespace std; -using namespace tlnos; - -Example4::Example4() -{ -} - -int Example4::execute() -{ -#ifdef HAVE_MPI - //int argc = 1; - //MPI_Init(&argc, NULL); // [RB] already initialised - Epetra_MpiComm Comm(MPI_COMM_WORLD); -#else - Epetra_SerialComm Comm; -#endif - - try - { - - // ============================================================ // - // Prepares the computational domain. For simplicity, // - // the computation domain has (nx * NumProcs, ny, nz) elements, // - // and it is partitioned into (NumProcs, 1, 1) subdomains. // - // If you want to change the grid element, remember to modify // - // the quadrature in GalerkinVariational<T>. Now T is set to // - // HexQuadrature. // - // ============================================================ // - - int nx = 4 * Comm.NumProc(); - int ny = 4; - int nz = 4; - int mx = Comm.NumProc(), my = 1, mz = 1; - - HexCubeGrid Grid(Comm, nx, ny, nz, mx, my, mz); - - cout << "------------------------" << endl; - // Extracts the information from the Grid using AbstractGrid - // methods. First, some general information. - - cout << "Number of dimensions = " << Grid.NumDimensions() << endl; - cout << "Number of vertices per element = " << Grid.NumVerticesPerElement() << endl; - cout << "Number of faces per element = " << Grid.NumFacesPerElement() << endl; - cout << "Number of vertices per face = " << Grid.NumVerticesPerFace() << endl; - cout << "Element type = " << Grid.ElementType() << endl; - - cout << "Number of elements: global = " << Grid.NumGlobalElements(); - cout << ", on proc 0 = " << Grid.NumMyElements() << endl; - cout << "Number of vertices: global = " << Grid.NumGlobalVertices(); - cout << ", on proc 0 = " << Grid.NumMyVertices() << endl; - cout << "Number of boundary faces: " - "on proc 0 = " - << Grid.NumMyBoundaryFaces() << endl; - - cout << "------------------------" << endl; - - // ======================================================== // - // Prepares the linear system. This requires the definition // - // of a quadrature formula compatible with the grid, a // - // variational formulation, and a problem object which take // - // care of filling matrix and right-hand side. // - // ======================================================== // - - Epetra_CrsMatrix A(Copy, Grid.RowMap(), 0); - Epetra_Vector LHS(Grid.RowMap()); - Epetra_Vector RHS(Grid.RowMap()); - - int NumQuadratureNodes = 1; - - GalerkinVariational<HexQuadrature> - Laplacian(NumQuadratureNodes, Diffusion4, Source4, Force4, - BoundaryValue4, BoundaryType4); - - LinearProblem FiniteElementProblem(Grid, Laplacian, A, LHS, RHS); - FiniteElementProblem.Compute(); - - // =================================================== // - // The solution must be computed here by solving the // - // linear system A * LHS = RHS. // - // - // NOTE: Solve() IS A SIMPLE FUNCTION BASED ON LAPACK, // - // THEREFORE THE MATRIX IS CONVERTED TO DENSE FORMAT. // - // IT WORKS IN SERIAL ONLY. // - // EVEN MEDIUM-SIZED MATRICES MAY REQUIRE A LOT OF // - // MEMORY AND CPU-TIME! USERS SHOULD CONSIDER INSTEAD // - // AZTECOO, ML, IFPACK OR OTHER SOLVERS. // - // =================================================== // - - Solve(&A, &LHS, &RHS); - - cout << "----------------------" << endl; - cout << A << endl; - cout << "----------------------" << endl; - cout << LHS << endl; - cout << "----------------------" << endl; - cout << RHS << endl; - cout << "----------------------" << endl; - - // ========================= // - // After the solution: // - // - computation of the norm // - // - output using MEDIT // - // ========================= // - - FiniteElementProblem.ComputeNorms(LHS, ExactSolution); - -//MEDITInterface MEDIT(Comm); -//MEDIT.Write(Grid, "Laplacian3D", LHS); - -// ================== // -// Output using ExodusII // -// ================== // -#ifdef MOERTEL_HAVE_EXODUS - // NOT COMPILED BY KIM - ExodusInterface exodus(Comm); - exodus.Write(Grid, "Laplacian3D", LHS); -#endif - - // We need to define a vector to plot, in this case constant - //Epetra_Vector Vector(Grid.RowMap()); - //MEDIT.Write(Grid, "grid", Vector); - } - catch (Exception &rhs) - { - if (Comm.MyPID() == 0) - rhs.Print(); - } - catch (int e) - { - cerr << "Caught exception, value = " << e << endl; - } - catch (...) - { - cerr << "Caught generic exception" << endl; - } - -#ifdef HAVE_MPI - MPI_Finalize(); -#endif - - return (0); -} diff --git a/tlnos/src/wExample4.h b/tlnos/src/wExample4.h deleted file mode 100644 index 53110794..00000000 --- a/tlnos/src/wExample4.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef WEXAMPLE4_H -#define WEXAMPLE4_H - -#include "tlnos.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <string> -#ifndef SWIG -#include "Teuchos_Comm.hpp" -#include "Teuchos_XMLParameterListHelpers.hpp" -#endif - -namespace tlnos -{ - -/** - * @brief a class containing the "build-against-trilinos" example of trilinos - */ - -class TLNOS_API Example4 : public fwk::wObject -{ -public: - Example4(); - int execute(); -}; - -} // namespace tlnos - -#endif //WEXAMPLE4_H diff --git a/tlnos/src/wExample5.cpp b/tlnos/src/wExample5.cpp deleted file mode 100644 index 22eebbf3..00000000 --- a/tlnos/src/wExample5.cpp +++ /dev/null @@ -1,535 +0,0 @@ -#include "wExample5.h" -/* - #@HEADER - # ************************************************************************ - # - # Moertel FE Package - # Copyright (2006) Sandia Corporation - # - # Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive - # license for use of this work by or on behalf of the U.S. Government. - # - # Redistribution and use in source and binary forms, with or without - # modification, are permitted provided that the following conditions are - # met: - # - # 1. Redistributions of source code must retain the above copyright - # notice, this list of conditions and the following disclaimer. - # - # 2. Redistributions in binary form must reproduce the above copyright - # notice, this list of conditions and the following disclaimer in the - # documentation and/or other materials provided with the distribution. - # - # 3. Neither the name of the Corporation nor the names of the - # contributors may be used to endorse or promote products derived from - # this software without specific prior written permission. - # - # THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY - # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE - # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - # - # Questions? Contact Glen Hansen (gahanse@sandia.gov) - # - # ************************************************************************ - #@HEADER - */ -/*! - * \file TwoSquares.cpp - * - * \brief Simple serial example showing Moertel usage and solver interfaces - * - * \date Last update do Doxygen: 20-March-06 - * - */ -#ifdef HAVE_MPI -#include "mpi.h" -#include "Epetra_MpiComm.h" -#else -#include "Epetra_SerialComm.h" -#endif - -// MOERTEL headers -#include "mrtr_manager.H" -#include "mrtr_segment_linear1D.H" - -// Galeri headers -#include "Galeri_Utils.h" -#include "Galeri_FiniteElements.h" - -#ifdef MOERTEL_HAVE_EXODUS -#include "ExodusInterface.h" -#endif -using namespace Galeri; -using namespace Galeri::FiniteElements; - -// ========================================================== -// This file solves the scalar problem -// -// - \mu \nabla u + \sigma u = f on \Omega -// u = g on \partial \Omega -// -// where \Omega is a 2D rectangle, divided into triangles. -// The input grid should be generated using similar -// conventions of file galeri/data/TwoSquares.m: -// - the bc ID of 10 and 20 are for the mortar interface -// - the bc ID of 0 is for the external domain. -// ========================================================== - -double Diffusion5(const double &x, const double &y, const double &z) -{ - return (1.0); -} - -double Source5(const double &x, const double &y, const double &z) -{ - return (0.0); -} - -double Force5(const double &x, const double &y, const double &z) -{ - if (y < 0.8) - return (1.0); - else - return (0.0); -} - -// Specifies the boundary condition. -int BoundaryType5(const int &Patch) -{ - if (Patch == 10 || Patch == 20) - return (GALERI_DO_NOTHING); - else - return (GALERI_DIRICHLET); -} - -// Specifies the boundary condition. -double BoundaryValue5(const double &x, const double &y, - const double &z, const int &Patch) -{ - if (x == -1.0 || x == 1.0) - return (0.0); - else if (Patch == 10 || Patch == 20) - return (1.0); - else - return (0.0); -} - -// =========== // -// main driver // -// =========== // - -using namespace tlnos; - -Example5::Example5() -{ -} - -int Example5::execute() -{ -#ifdef HAVE_MPI - /* - static int argc = 1; - char **argv = new char*[2];// mem leak volontaire - argv[0] = new char[8]; strcpy(argv[0], "myprog"); // mem leak volontaire - argv[1] = new char[1]; strcpy(argv[1], ""); // mem leak volontaire - - MPI_Init(&argc,&argv); - */ - Epetra_MpiComm Comm(MPI_COMM_WORLD); -#else - Epetra_SerialComm Comm; -#endif - - int status = 0; // return status - - try - { - - // this example is in serial only - if (Comm.NumProc() > 1) - exit(0); - - // read grid from file, see also TwoSquares.m used to generate the grids - /* - % +------+ - % | S2 | - % +------+ <- edge has tag 20 and 9 elements - % +------+ <- edge has tag 10 and 10 elements - % | S1 | - % +------+ - % - % where S1 = (-1,1) x (-1,1) and S2 = (-1, 1) x (1, 3). - */ - - FileGrid Grid(Comm, "TwoSquares.grid"); // [RB] missing file!! - - // create a list of all nodes that are linked to a face - // with tag 10 and tag 20 - map<int, int> nodes10; - map<int, int> nodes20; - for (int i = 0; i < Grid.NumMyBoundaryFaces(); ++i) - { - int tag; - int nodeids[2]; - Grid.FaceVertices(i, tag, nodeids); - if (tag == 10) - { - nodes10[nodeids[0]] = nodeids[0]; - nodes10[nodeids[1]] = nodeids[1]; - } - else if (tag == 20) - { - nodes20[nodeids[0]] = nodeids[0]; - nodes20[nodeids[1]] = nodeids[1]; - } - else - continue; - } - - // ------------------------------------------------------------- // - // create an empty MOERTEL::Interface, in this example just one - // ------------------------------------------------------------- // - int printlevel = 0; // ( moertel takes values 0 - 10 ) - //int printlevel = 9; // ( moertel takes values 0 - 10 ) - MOERTEL::Interface interface(0, true, Comm, printlevel); - - // ------------------------------------------------------------- // - // Add nodes on both sides of interface to interface - // loop all nodes in the maps nodes10 and nodes20 and add them - // to the interface with unique ids - // tag 10 will become interface side 0 - // tag 20 will become interface side 1 - // ------------------------------------------------------------- // - map<int, int>::iterator curr; - // do tag==10 or interface side 0 - for (curr = nodes10.begin(); curr != nodes10.end(); ++curr) - { - // get unique node id (here it's equal to the degree of freedom on that node) - int nodeid = curr->second; - // get node coordinates - double coord[3]; - Grid.VertexCoord(nodeid, coord); - // get dirichlet boundary conditions - double bou = BoundaryValue5(coord[0], coord[1], coord[2], 10); - bool dboundary = false; - if (bou == 0.0) - dboundary = true; - // create a moertel node - MOERTEL::Node node(nodeid, coord, 1, &nodeid, dboundary, printlevel); - // add node to the interface on side 0 - interface.AddNode(node, 0); - } - nodes10.clear(); - - // do tag==20 or interface side 1 - for (curr = nodes20.begin(); curr != nodes20.end(); ++curr) - { - // get unique node id (here it's equal to the degree of freedom on that node) - int nodeid = curr->second; - // get node coordinates - double coord[3]; - Grid.VertexCoord(nodeid, coord); - // get dirichlet boundary conditions - double bou = BoundaryValue5(coord[0], coord[1], coord[2], 20); - bool dboundary = false; - if (bou == 0.0) - dboundary = true; - // create a moertel node - MOERTEL::Node node(nodeid, coord, 1, &nodeid, dboundary, printlevel); - // add node to the interface on side 1 - interface.AddNode(node, 1); - } - nodes20.clear(); - - // ------------------------------------------------------------- // - // add segments on both sides of the interface to the interface - // ------------------------------------------------------------- // - for (int i = 0; i < Grid.NumMyBoundaryFaces(); ++i) - { - int tag; - int nodeids[2]; - Grid.FaceVertices(i, tag, nodeids); - if (tag != 10 && tag != 20) - continue; - // create a segment (galeri calls it a face) - MOERTEL::Segment_Linear1D segment(i, 2, nodeids, printlevel); - - // add it to the interface on side 0 - if (tag == 10) - interface.AddSegment(segment, 0); - // add it to the interface on side 1 - else if (tag == 20) - interface.AddSegment(segment, 1); - } - - // ------------------------------------------------------------- // - // choose the mortar side of the interface (0 or 1) - // here: let the package choose it (-2) - // ------------------------------------------------------------- // - interface.SetMortarSide(-2); - - // ------------------------------------------------------------- // - // As we do not know the mortar side yet (we decided to le the - // package choose it), we can not set a dual trace function (mortar space) - // as we don't know the side to set it to - // so we just give orders for the function type - // ------------------------------------------------------------- // - interface.SetFunctionTypes(MOERTEL::Function::func_Linear1D, // primal trace space - MOERTEL::Function::func_DualLinear1D); // dual mortar space (recommended) - //MOERTEL::Function::func_Linear1D); // mortar space (not recommended) - - // ------------------------------------------------------------- // - // complete the interface - // ------------------------------------------------------------- // - if (!interface.Complete()) - { - cout << "Interface completion returned false\n"; - exit(EXIT_FAILURE); - } - - // ------------------------------------------------------------- // - // create an empty MOERTEL::Manager for 2D problems - // It organizes everything from integration to solution - // ------------------------------------------------------------- // - MOERTEL::Manager manager(Comm, printlevel); - manager.SetDimension(MOERTEL::Manager::manager_2D); - - // ------------------------------------------------------------- // - // Add the interface to the manager - // ------------------------------------------------------------- // - manager.AddInterface(interface); - - // ------------------------------------------------------------- // - // for mortar integration, the mortar manager needs to know about - // the rowmap of the original (uncoupled) problem because it will - // create coupling matrices D and M matching that rowmap - // ------------------------------------------------------------- // - manager.SetProblemMap(&Grid.RowMap()); - - // ============================================================= // - // choose integration parameters - // ============================================================= // - Teuchos::ParameterList &moertelparams = manager.Default_Parameters(); - // this does not affect this 2D case - moertelparams.set("exact values at gauss points", true); - // 1D interface possible values are 1,2,3,4,5,6,7,8,10 (2 recommended with linear shape functions) - moertelparams.set("number gaussian points 1D", 2); - // 2D interface possible values are 3,6,12,13,16,19,27 - moertelparams.set("number gaussian points 2D", 27); - - // ============================================================= // - // Here we are done with the construction phase of the interface - // so we can integrate the mortar integrals - // (Note we have not yet evaluated the PDE at all!) - // ============================================================= // - manager.Mortar_Integrate(); - - // print interface information - // (Manager, Interface, Segment, Node implement the << operator) - if (printlevel) - cout << manager; - - // ======================================================== // - // Prepares the linear system. This requires the definition // - // of a quadrature formula compatible with the grid, a // - // variational formulation, and a problem object which take // - // care of filling matrix and right-hand side. // - // NOTE: - // we are doing this AFTER we did all the mortar stuff to - // show that the mortar integration is actually PDE-independent - // ======================================================== // - Epetra_CrsMatrix A(Copy, Grid.RowMap(), 0); - Epetra_Vector LHS(Grid.RowMap(), true); - Epetra_Vector RHS(Grid.RowMap()); - - int NumQuadratureNodes = 3; - - GalerkinVariational<TriangleQuadrature> - Laplace2D(NumQuadratureNodes, Diffusion5, Source5, Force5, - BoundaryValue5, BoundaryType5); - - LinearProblem FiniteElementProblem(Grid, Laplace2D, A, LHS, RHS); - FiniteElementProblem.Compute(); - - // ============================================================= // - // this is Galeri's dense solve method if you'd like to see how - // the uncoupled solution looks like - // ============================================================= // - Solve(&A, &LHS, &RHS); - - // ============================================================= // - // Since we now have all the pieces together, let's use the - // MOERTEL interface to other Trilinos packages to solve the - // problem - // ============================================================= // - - // ------------------------------------------------------------- // - // Create a Teuchos::ParameterList to hold solver arguments and also - // to hold arguments for connected packages AztecOO, ML and Amesos - // ------------------------------------------------------------- // - Teuchos::ParameterList list; - - // ------------------------------------------------------------- // - // Choose which type of system of equations to generate - // Note that only when using DUAL mortar spaces an spd system - // can be generated - // ------------------------------------------------------------- // - //list.set("System","SaddleSystem"); - list.set("System", "SPDSystem"); - - // ------------------------------------------------------------- // - // choose solver, currently there is a choice of Amesos and ML/AztecOO - // Note that if "SaddleSystem" was chosen as system of equations - // ML/AztecOO doesn't work - // ------------------------------------------------------------- // - list.set("Solver", "Amesos"); - //list.set("Solver","ML/Aztec"); - - // ------------------------------------------------------------- // - // create sublists for packages Amesos, ML, AztecOO. they will be - // passed on to the individual package that is used - // ------------------------------------------------------------- // - - // Amesos parameters: - Teuchos::ParameterList &amesosparams = list.sublist("Amesos"); - amesosparams.set("Solver", "Amesos_Klu"); - amesosparams.set("PrintTiming", true); - amesosparams.set("PrintStatus", true); - amesosparams.set("UseTranspose", true); - - // AztecOO parameters - Teuchos::ParameterList &aztecparams = list.sublist("Aztec"); - aztecparams.set("AZ_solver", "AZ_cg"); - // This will involve ML as preconditioner - // See the AztecOO manual for other options - aztecparams.set("AZ_precond", "AZ_user_precond"); - aztecparams.set("AZ_max_iter", 1200); - aztecparams.set("AZ_output", 100); - aztecparams.set("AZ_tol", 1.0e-7); - aztecparams.set("AZ_scaling", "AZ_none"); - - // ML parameters - // As Moertel comes with his own special mortar multigrid hierachy - // based on ML's smoothed aggregation, not all ML parameters are recognized - // It basically recognizes everything that recognized by ML's MLAPI - // (ML Application Programming Interface), see MLAPI documentation - Teuchos::ParameterList &mlparams = list.sublist("ML"); - ML_Epetra::SetDefaults("SA", mlparams); - mlparams.set("output", 10); - mlparams.set("print unused", 1 - 2); - mlparams.set("increasing or decreasing", "increasing"); - mlparams.set("PDE equations", 1); - mlparams.set("max levels", 10); - mlparams.set("coarse: max size", 80); - mlparams.set("aggregation: type", "Uncoupled"); - mlparams.set("aggregation: damping factor", 1.33); - - // original : The unmodified ML (smoothed) aggregation prolongator - // mod_simple : ( R * (I-B*W^T) )^T - // mod_middle : ( (I - R B*W^T*P) * R * (I-B*W^T) )^T - // mod_full : ( (I - R B*W^T*P) * R * (I-B*W^T) )^T + ( R B*W^T*P * R * B*W^T )^T - mlparams.set("prolongator: type", "mod_middle"); - - // solvers/smoothers currently recognized by the MLAPI_InverseOperator are - // Ifpack: - // "Jacobi" "Gauss-Seidel" "symmetric Gauss-Seidel" - // "ILU" "ILUT" "IC" "ICT" "LU" "Amesos" "Amesos-KLU" - // and accompanying parameters - // ML: - // "MLS" "ML MLS" "ML symmetric Gauss-Seidel" - // "ML Gauss-Seidel" - // and accompanying parameters - mlparams.set("coarse: type", "Amesos-KLU"); - mlparams.set("smoother: type", "symmetric Gauss-Seidel"); - mlparams.set("smoother: MLS polynomial order", 3); - mlparams.set("relaxation: min diagonal value", 0.1); - mlparams.set("smoother: damping factor", 0.67); - mlparams.set("smoother: sweeps", 1); - mlparams.set("smoother: pre or post", "both"); - // the ns for Laplace is the constant - int dimnullspace = 1; - int nummyrows = manager.ProblemMap()->NumMyElements(); - int dimnsp = dimnullspace * nummyrows; - double *nsp = new double[dimnsp]; - for (int i = 0; i < dimnsp; ++i) - nsp[i] = 1.; - mlparams.set("null space: type", "pre-computed"); - mlparams.set("null space: add default vectors", false); - mlparams.set("null space: dimension", dimnullspace); - mlparams.set("null space: vectors", nsp); - - // ------------------------------------------------------------- // - // Pass input matrix to Moertel, - // Moertel does NOT take ownership of A! - // ------------------------------------------------------------- // - manager.SetInputMatrix(&A, false); - - std::cout << list; - - // ============================================================= // - // Solve - // ============================================================= // - //manager.Solve(list,LHS,RHS); - - // ------------------------------------------------------------- // - // One can reset the solver, change parameters and/or matrix (with the - // same rowmap) and solve again if needed. - // If no ResetSolver() is called, the same matrix and preconditioner - // will be used to solve for multiple rhs - // ------------------------------------------------------------- // - //manager.ResetSolver(); - //LHS.PutScalar(0.0); - //manager.SetInputMatrix(&A,false); - //manager.Solve(list,LHS,RHS); - -#ifdef MOERTEL_HAVE_EXODUS - - // ================== // - // Output using ExodusII // - // ================== // - ExodusInterface exodus(Comm); - exodus.Write(Grid, "output", LHS); - - std::cout << "Exodus is used for output" << std::endl; - -#endif - } - catch (int e) - { - cerr << "Caught exception, value = " << e << endl; - status = 1; - } - catch (Galeri::Exception &rhs) - { - - cerr << "Caught Galeri exception: "; - rhs.Print(); - status = 1; - } - catch (...) - { - cerr << "Caught generic exception" << endl; - status = 1; - } - -#ifdef HAVE_MPI - MPI_Finalize(); -#endif - - if (status == 0) - std::cout << "\nTest passed!" << endl; - else - std::cout << "\nTest Failed!" << endl; - - // Final return value (0 = successfull, non-zero = failure) - - return status; -} diff --git a/tlnos/src/wExample5.h b/tlnos/src/wExample5.h deleted file mode 100644 index 7c53b738..00000000 --- a/tlnos/src/wExample5.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef WEXAMPLE5_H -#define WEXAMPLE5_H - -#include "tlnos.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <string> -#ifndef SWIG -#include "Teuchos_Comm.hpp" -#include "Teuchos_XMLParameterListHelpers.hpp" -#endif - -namespace tlnos -{ - -/** - * @brief a class containing the "build-against-trilinos" example of trilinos - */ - -class TLNOS_API Example5 : public fwk::wObject -{ -public: - Example5(); - int execute(); -}; - -} // namespace tlnos - -#endif //WEXAMPLE5_H diff --git a/tlnos/src/wExample6.cpp b/tlnos/src/wExample6.cpp deleted file mode 100644 index 1788410e..00000000 --- a/tlnos/src/wExample6.cpp +++ /dev/null @@ -1,533 +0,0 @@ -#include "wExample6.h" -/* -#@HEADER -# ************************************************************************ -# -# Moertel FE Package -# Copyright (2006) Sandia Corporation -# -# Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -# license for use of this work by or on behalf of the U.S. Government. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# 3. Neither the name of the Corporation nor the names of the -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Questions? Contact Glen Hansen (gahanse@sandia.gov) -# -# ************************************************************************ -#@HEADER -*/ -/*! - * \file TwoSquares.cpp - * - * \brief Simple serial example showing Moertel usage and solver interfaces - * - * \date Last update do Doxygen: 20-March-06 - * - */ -#ifdef HAVE_MPI -#include "mpi.h" -#include "Epetra_MpiComm.h" -#else -#include "Epetra_SerialComm.h" -#endif - -// MOERTEL headers -#include "mrtr_manager.H" -#include "mrtr_segment_linear1D.H" - -// Galeri headers -#include "Galeri_Utils.h" -#include "Galeri_FiniteElements.h" - -#ifdef MOERTEL_HAVE_EXODUS -#include "ExodusInterface.h" -#endif - -using namespace Galeri; -using namespace Galeri::FiniteElements; - -// ========================================================== -// This file solves the scalar problem -// -// - \mu \nabla u + \sigma u = f on \Omega -// u = g on \partial \Omega -// -// where \Omega is a 2D rectangle, divided into triangles. -// The input grid should be generated using similar -// conventions of file galeri/data/TwoSquares.m: -// - the bc ID of 10 and 20 are for the mortar interface -// - the bc ID of 0 is for the external domain. -// ========================================================== - -double Diffusion(const double &x, const double &y, const double &z) -{ - return (1.0); -} - -double Source(const double &x, const double &y, const double &z) -{ - return (0.0); -} - -double Force(const double &x, const double &y, const double &z) -{ - if (y < 0.8) - return (1.0); - else - return (0.0); -} - -// Specifies the boundary condition. -int BoundaryType(const int &Patch) -{ - if (Patch == 10 || Patch == 20) - return (GALERI_DO_NOTHING); - else - return (GALERI_DIRICHLET); -} - -// Specifies the boundary condition. -double BoundaryValue(const double &x, const double &y, - const double &z, const int &Patch) -{ - if (x == -1.0 || x == 1.0) - return (0.0); - else if (Patch == 10 || Patch == 20) - return (1.0); - else - return (0.0); -} - -// =========== // -// main driver // -// =========== // - -using namespace tlnos; - -Example6::Example6() -{ -} - -int Example6::execute() -{ -#ifdef HAVE_MPI - /* - static int argc = 1; - char **argv = new char*[2];// mem leak volontaire - argv[0] = new char[8]; strcpy(argv[0], "myprog"); // mem leak volontaire - argv[1] = new char[1]; strcpy(argv[1], ""); // mem leak volontaire - - MPI_Init(&argc,&argv); - */ - Epetra_MpiComm Comm(MPI_COMM_WORLD); -#else - Epetra_SerialComm Comm; -#endif - - int status = 0; // return status - - try - { - - // this example is in serial only - if (Comm.NumProc() > 1) - exit(0); - - // read grid from file, see also TwoSquares.m used to generate the grids - /* - % +------+ - % | S2 | - % +------+ <- edge has tag 20 and 9 elements - % +------+ <- edge has tag 10 and 10 elements - % | S1 | - % +------+ - % - % where S1 = (-1,1) x (-1,1) and S2 = (-1, 1) x (1, 3). - */ - - FileGrid Grid(Comm, "TwoSquares.grid"); - - // create a list of all nodes that are linked to a face - // with tag 10 and tag 20 - map<int, int> nodes10; - map<int, int> nodes20; - for (int i = 0; i < Grid.NumMyBoundaryFaces(); ++i) - { - int tag; - int nodeids[2]; - Grid.FaceVertices(i, tag, nodeids); - if (tag == 10) - { - nodes10[nodeids[0]] = nodeids[0]; - nodes10[nodeids[1]] = nodeids[1]; - } - else if (tag == 20) - { - nodes20[nodeids[0]] = nodeids[0]; - nodes20[nodeids[1]] = nodeids[1]; - } - else - continue; - } - - // ------------------------------------------------------------- // - // create an empty MOERTEL::Interface, in this example just one - // ------------------------------------------------------------- // - int printlevel = 0; // ( moertel takes values 0 - 10 ) - //int printlevel = 9; // ( moertel takes values 0 - 10 ) - MOERTEL::Interface interface(0, true, Comm, printlevel); - - // ------------------------------------------------------------- // - // Add nodes on both sides of interface to interface - // loop all nodes in the maps nodes10 and nodes20 and add them - // to the interface with unique ids - // tag 10 will become interface side 0 - // tag 20 will become interface side 1 - // ------------------------------------------------------------- // - map<int, int>::iterator curr; - // do tag==10 or interface side 0 - for (curr = nodes10.begin(); curr != nodes10.end(); ++curr) - { - // get unique node id (here it's equal to the degree of freedom on that node) - int nodeid = curr->second; - // get node coordinates - double coord[3]; - Grid.VertexCoord(nodeid, coord); - // get dirichlet boundary conditions - double bou = BoundaryValue(coord[0], coord[1], coord[2], 10); - bool dboundary = false; - if (bou == 0.0) - dboundary = true; - // create a moertel node - MOERTEL::Node node(nodeid, coord, 1, &nodeid, dboundary, printlevel); - // add node to the interface on side 0 - interface.AddNode(node, 0); - } - nodes10.clear(); - - // do tag==20 or interface side 1 - for (curr = nodes20.begin(); curr != nodes20.end(); ++curr) - { - // get unique node id (here it's equal to the degree of freedom on that node) - int nodeid = curr->second; - // get node coordinates - double coord[3]; - Grid.VertexCoord(nodeid, coord); - // get dirichlet boundary conditions - double bou = BoundaryValue(coord[0], coord[1], coord[2], 20); - bool dboundary = false; - if (bou == 0.0) - dboundary = true; - // create a moertel node - MOERTEL::Node node(nodeid, coord, 1, &nodeid, dboundary, printlevel); - // add node to the interface on side 1 - interface.AddNode(node, 1); - } - nodes20.clear(); - - // ------------------------------------------------------------- // - // add segments on both sides of the interface to the interface - // ------------------------------------------------------------- // - for (int i = 0; i < Grid.NumMyBoundaryFaces(); ++i) - { - int tag; - int nodeids[2]; - Grid.FaceVertices(i, tag, nodeids); - if (tag != 10 && tag != 20) - continue; - // create a segment (galeri calls it a face) - MOERTEL::Segment_Linear1D segment(i, 2, nodeids, printlevel); - - // add it to the interface on side 0 - if (tag == 10) - interface.AddSegment(segment, 0); - // add it to the interface on side 1 - else if (tag == 20) - interface.AddSegment(segment, 1); - } - - // ------------------------------------------------------------- // - // choose the mortar side of the interface (0 or 1) - // here: let the package choose it (-2) - // ------------------------------------------------------------- // - interface.SetMortarSide(-2); - - // ------------------------------------------------------------- // - // As we do not know the mortar side yet (we decided to le the - // package choose it), we can not set a dual trace function (mortar space) - // as we don't know the side to set it to - // so we just give orders for the function type - // ------------------------------------------------------------- // - interface.SetFunctionTypes(MOERTEL::Function::func_Linear1D, // primal trace space - MOERTEL::Function::func_DualLinear1D); // dual mortar space (recommended) - //MOERTEL::Function::func_Linear1D); // mortar space (not recommended) - - // ------------------------------------------------------------- // - // complete the interface - // ------------------------------------------------------------- // - if (!interface.Complete()) - { - cout << "Interface completion returned false\n"; - exit(EXIT_FAILURE); - } - - // ------------------------------------------------------------- // - // create an empty MOERTEL::Manager for 2D problems - // It organizes everything from integration to solution - // ------------------------------------------------------------- // - MOERTEL::Manager manager(Comm, printlevel); - manager.SetDimension(MOERTEL::Manager::manager_2D); - - // ------------------------------------------------------------- // - // Add the interface to the manager - // ------------------------------------------------------------- // - manager.AddInterface(interface); - - // ------------------------------------------------------------- // - // for mortar integration, the mortar manager needs to know about - // the rowmap of the original (uncoupled) problem because it will - // create coupling matrices D and M matching that rowmap - // ------------------------------------------------------------- // - manager.SetProblemMap(&Grid.RowMap()); - - // ============================================================= // - // choose integration parameters - // ============================================================= // - Teuchos::ParameterList &moertelparams = manager.Default_Parameters(); - // this does not affect this 2D case - moertelparams.set("exact values at gauss points", true); - // 1D interface possible values are 1,2,3,4,5,6,7,8,10 (2 recommended with linear shape functions) - moertelparams.set("number gaussian points 1D", 2); - // 2D interface possible values are 3,6,12,13,16,19,27 - moertelparams.set("number gaussian points 2D", 27); - - // ============================================================= // - // Here we are done with the construction phase of the interface - // so we can integrate the mortar integrals - // (Note we have not yet evaluated the PDE at all!) - // ============================================================= // - manager.Mortar_Integrate(); - - // print interface information - // (Manager, Interface, Segment, Node implement the << operator) - if (printlevel) - cout << manager; - - // ======================================================== // - // Prepares the linear system. This requires the definition // - // of a quadrature formula compatible with the grid, a // - // variational formulation, and a problem object which take // - // care of filling matrix and right-hand side. // - // NOTE: - // we are doing this AFTER we did all the mortar stuff to - // show that the mortar integration is actually PDE-independent - // ======================================================== // - Epetra_CrsMatrix A(Copy, Grid.RowMap(), 0); - Epetra_Vector LHS(Grid.RowMap(), true); - Epetra_Vector RHS(Grid.RowMap()); - - int NumQuadratureNodes = 3; - - GalerkinVariational<TriangleQuadrature> - Laplace2D(NumQuadratureNodes, Diffusion, Source, Force, - BoundaryValue, BoundaryType); - - LinearProblem FiniteElementProblem(Grid, Laplace2D, A, LHS, RHS); - FiniteElementProblem.Compute(); - - // ============================================================= // - // this is Galeri's dense solve method if you'd like to see how - // the uncoupled solution looks like - // ============================================================= // - //Solve(&A, &LHS, &RHS); - - // ============================================================= // - // Since we now have all the pieces together, let's use the - // MOERTEL interface to other Trilinos packages to solve the - // problem - // ============================================================= // - - // ------------------------------------------------------------- // - // Create a Teuchos::ParameterList to hold solver arguments and also - // to hold arguments for connected packages AztecOO, ML and Amesos - // ------------------------------------------------------------- // - Teuchos::ParameterList list; - - // ------------------------------------------------------------- // - // Choose which type of system of equations to generate - // Note that only when using DUAL mortar spaces an spd system - // can be generated - // ------------------------------------------------------------- // - //list.set("System","SaddleSystem"); - list.set("System", "SPDSystem"); - - // ------------------------------------------------------------- // - // choose solver, currently there is a choice of Amesos and ML/AztecOO - // Note that if "SaddleSystem" was chosen as system of equations - // ML/AztecOO doesn't work - // ------------------------------------------------------------- // - list.set("Solver", "Amesos"); - //list.set("Solver","ML/Aztec"); - - // ------------------------------------------------------------- // - // create sublists for packages Amesos, ML, AztecOO. they will be - // passed on to the individual package that is used - // ------------------------------------------------------------- // - - // Amesos parameters: - Teuchos::ParameterList &amesosparams = list.sublist("Amesos"); - amesosparams.set("Solver", "Amesos_Klu"); - amesosparams.set("PrintTiming", true); - amesosparams.set("PrintStatus", true); - amesosparams.set("UseTranspose", true); - - // AztecOO parameters - Teuchos::ParameterList &aztecparams = list.sublist("Aztec"); - aztecparams.set("AZ_solver", "AZ_cg"); - // This will involve ML as preconditioner - // See the AztecOO manual for other options - aztecparams.set("AZ_precond", "AZ_user_precond"); - aztecparams.set("AZ_max_iter", 1200); - aztecparams.set("AZ_output", 100); - aztecparams.set("AZ_tol", 1.0e-7); - aztecparams.set("AZ_scaling", "AZ_none"); - - // ML parameters - // As Moertel comes with his own special mortar multigrid hierachy - // based on ML's smoothed aggregation, not all ML parameters are recognized - // It basically recognizes everything that recognized by ML's MLAPI - // (ML Application Programming Interface), see MLAPI documentation - Teuchos::ParameterList &mlparams = list.sublist("ML"); - ML_Epetra::SetDefaults("SA", mlparams); - mlparams.set("output", 10); - mlparams.set("print unused", 1 /*-2*/); - mlparams.set("increasing or decreasing", "increasing"); - mlparams.set("PDE equations", 1); - mlparams.set("max levels", 10); - mlparams.set("coarse: max size", 80); - mlparams.set("aggregation: type", "Uncoupled"); - mlparams.set("aggregation: damping factor", 1.33); - - // original : The unmodified ML (smoothed) aggregation prolongator - // mod_simple : ( R * (I-B*W^T) )^T - // mod_middle : ( (I - R B*W^T*P) * R * (I-B*W^T) )^T - // mod_full : ( (I - R B*W^T*P) * R * (I-B*W^T) )^T + ( R B*W^T*P * R * B*W^T )^T - mlparams.set("prolongator: type", "mod_middle"); - - // solvers/smoothers currently recognized by the MLAPI_InverseOperator are - // Ifpack: - // "Jacobi" "Gauss-Seidel" "symmetric Gauss-Seidel" - // "ILU" "ILUT" "IC" "ICT" "LU" "Amesos" "Amesos-KLU" - // and accompanying parameters - // ML: - // "MLS" "ML MLS" "ML symmetric Gauss-Seidel" - // "ML Gauss-Seidel" - // and accompanying parameters - mlparams.set("coarse: type", "Amesos-KLU"); - mlparams.set("smoother: type", "symmetric Gauss-Seidel"); - mlparams.set("smoother: MLS polynomial order", 3); - mlparams.set("relaxation: min diagonal value", 0.1); - mlparams.set("smoother: damping factor", 0.67); - mlparams.set("smoother: sweeps", 1); - mlparams.set("smoother: pre or post", "both"); - // the ns for Laplace is the constant - int dimnullspace = 1; - int nummyrows = manager.ProblemMap()->NumMyElements(); - int dimnsp = dimnullspace * nummyrows; - double *nsp = new double[dimnsp]; - for (int i = 0; i < dimnsp; ++i) - nsp[i] = 1.; - mlparams.set("null space: type", "pre-computed"); - mlparams.set("null space: add default vectors", false); - mlparams.set("null space: dimension", dimnullspace); - mlparams.set("null space: vectors", nsp); - - // ------------------------------------------------------------- // - // Pass input matrix to Moertel, - // Moertel does NOT take ownership of A! - // ------------------------------------------------------------- // - manager.SetInputMatrix(&A, false); - - // ============================================================= // - // Solve - // ============================================================= // - manager.Solve(list, LHS, RHS); - - // ------------------------------------------------------------- // - // One can reset the solver, change parameters and/or matrix (with the - // same rowmap) and solve again if needed. - // If no ResetSolver() is called, the same matrix and preconditioner - // will be used to solve for multiple rhs - // ------------------------------------------------------------- // - //manager.ResetSolver(); - //LHS.PutScalar(0.0); - //manager.SetInputMatrix(&A,false); - //manager.Solve(list,LHS,RHS); - -#ifdef MOERTEL_HAVE_EXODUS - - // ================== // - // Output using ExodusII // - // ================== // - ExodusInterface exodus(Comm); - exodus.Write(Grid, "output", LHS); - - std::cout << "Exodus is used for output" << std::endl; -#endif - } - catch (int e) - { - cerr << "Caught exception, value = " << e << endl; - status = 1; - } - catch (Galeri::Exception &rhs) - { - - cerr << "Caught Galeri exception: "; - rhs.Print(); - status = 1; - } - catch (...) - { - cerr << "Caught generic exception" << endl; - status = 1; - } - -#ifdef HAVE_MPI - MPI_Finalize(); -#endif - - if (status == 0) - std::cout << "\nTest passed!" << endl; - else - std::cout << "\nTest Failed!" << endl; - - // Final return value (0 = successfull, non-zero = failure) - - return status; -} diff --git a/tlnos/src/wExample6.h b/tlnos/src/wExample6.h deleted file mode 100644 index 827b49fe..00000000 --- a/tlnos/src/wExample6.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef WEXAMPLE6_H -#define WEXAMPLE6_H - -#include "tlnos.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <string> -#ifndef SWIG -#include "Teuchos_Comm.hpp" -#include "Teuchos_XMLParameterListHelpers.hpp" -#endif - -namespace tlnos -{ - -/** - * @brief a class containing the "build-against-trilinos" example of trilinos - */ - -class TLNOS_API Example6 : public fwk::wObject -{ -public: - Example6(); - int execute(); -}; - -} // namespace tlnos - -#endif //WEXAMPLE6_H diff --git a/tlnos/src/wExample7.cpp.disabled b/tlnos/src/wExample7.cpp.disabled deleted file mode 100644 index 2f0af0ba..00000000 --- a/tlnos/src/wExample7.cpp.disabled +++ /dev/null @@ -1,509 +0,0 @@ -#include "wExample7.h" - -/* -#@HEADER -# ************************************************************************ -# -# Moertel FE Package -# Copyright (2006) Sandia Corporation -# -# Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -# license for use of this work by or on behalf of the U.S. Government. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# 3. Neither the name of the Corporation nor the names of the -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Questions? Contact Glen Hansen (gahanse@sandia.gov) -# -# ************************************************************************ -#@HEADER -*/ -/*! - * \file TwoSquares.cpp - * - * \brief Simple serial example showing Moertel usage and solver interfaces - * - * \date Last update do Doxygen: 20-March-06 - * - */ -#ifdef HAVE_MPI -#include "mpi.h" -#include "Epetra_MpiComm.h" -#else -#include "Epetra_SerialComm.h" -#endif - -// MOERTEL headers -#include "mrtr_manager.H" -#include "mrtr_segment_bilinearquad.H" - -// Galeri headers -#include "Galeri_Utils.h" -#include "Galeri_FiniteElements.h" -#ifdef MOERTEL_HAVE_EXODUS -#include "ExodusInterface.h" -#endif - -using namespace Galeri; -using namespace Galeri::FiniteElements; - -// ========================================================== -// This file solves the scalar problem -// -// - \mu \nabla u + \sigma u = f on \Omega -// u = g on \partial \Omega -// -// where \Omega is a 2D rectangle, divided into triangles. -// The input grid should be generated using similar -// conventions of file galeri/data/TwoSquares.m: -// - the bc ID of 10 and 20 are for the mortar interface -// - the bc ID of 0 is for the external domain. -// ========================================================== - -double Diffusion7(const double& x, const double& y, const double& z) -{ - return (3.0); -} - -double Source7(const double& x, const double& y, const double& z) -{ - return (0.0); -} - -double Force7(const double& x, const double& y, const double& z) -{ - if (x <-6. || x > 1.) - return(5.0); - else - return(0.0); -} - -// Specifies the boundary condition. -int BoundaryType7(const int& Patch) -{ - if (Patch != 0) - return(GALERI_DO_NOTHING); - else - return(GALERI_DIRICHLET); -} - -// Specifies the boundary condition. -double BoundaryValue7(const double& x, const double& y, - const double& z, const int& Patch) -{ - return 0.0; -} - -// =========== // -// main driver // -// =========== // - -using namespace tlnos; - -Example7::Example7() -{ -} - - -int -Example7::execute() -{ -#ifdef HAVE_MPI - static int argc = 1; - char **argv = new char*[2];// mem leak volontaire - argv[0] = new char[8]; strcpy(argv[0], "myprog"); // mem leak volontaire - argv[1] = new char[1]; strcpy(argv[1], ""); // mem leak volontaire - - MPI_Init(&argc,&argv); - Epetra_MpiComm Comm(MPI_COMM_WORLD); -#else - Epetra_SerialComm Comm; -#endif - - // this example is in serial only - if (Comm.NumProc()>1) exit(0); - - FileGrid Grid(Comm, "Hex_3D.grid"); - - // create a list of all nodes that are linked to a face - // we have 4 interfaces here with each 2 sides: - // with tags 1/2, 11/12, 21/22, 31/32 - const int ninter = 4; - vector<map<int,int> > nodes(ninter*2); - for (int i=0; i<Grid.NumMyBoundaryFaces(); ++i) - { - int tag; - int nodeids[4]; - Grid.FaceVertices(i,tag,nodeids); - if (tag==1) - { - for (int j=0; j<4; ++j) - nodes[0][nodeids[j]] = nodeids[j]; - } - else if (tag==2) - { - for (int j=0; j<4; ++j) - nodes[1][nodeids[j]] = nodeids[j]; - } - else if (tag==11) - { - for (int j=0; j<4; ++j) - nodes[2][nodeids[j]] = nodeids[j]; - } - else if (tag==12) - { - for (int j=0; j<4; ++j) - nodes[3][nodeids[j]] = nodeids[j]; - } - else if (tag==21) - { - for (int j=0; j<4; ++j) - nodes[4][nodeids[j]] = nodeids[j]; - } - else if (tag==22) - { - for (int j=0; j<4; ++j) - nodes[5][nodeids[j]] = nodeids[j]; - } - else if (tag==31) - { - for (int j=0; j<4; ++j) - nodes[6][nodeids[j]] = nodeids[j]; - } - else if (tag==32) - { - for (int j=0; j<4; ++j) - nodes[7][nodeids[j]] = nodeids[j]; - } - else - continue; - } - - // ------------------------------------------------------------- // - // create 4 empty MOERTEL::Interface instances - // ------------------------------------------------------------- // - int printlevel = 3; // ( moertel takes values 0 - 10 ) - //int printlevel = 8; // ( moertel takes values 0 - 10 ) // GAH gives info about intersection root finding - vector<RefCountPtr<MOERTEL::Interface> > interfaces(ninter); - for (int i=0; i<ninter; ++i) - interfaces[i] = rcp(new MOERTEL::Interface(i,false,Comm,printlevel)); - - // ------------------------------------------------------------- // - // Add nodes on both sides of interface to interfaces - // loop all nodes in the maps add them - // to the interface with unique ids - // ------------------------------------------------------------- // - for (int i=0; i<ninter; ++i) - { - map<int,int>::iterator curr; - for (int j=0; j<2; ++j) - for (curr = nodes[i*2+j].begin(); curr != nodes[i*2+j].end(); ++curr) - { - // get unique node id - int nodeid = curr->second; - // get node coordinates - double coord[3]; - Grid.VertexCoord(nodeid,coord); - // create a moertel node - MOERTEL::Node node(nodeid,coord,1,&nodeid,false,printlevel); - // add node to interface i on side j - interfaces[i]->AddNode(node,j); - } - } - - // ------------------------------------------------------------- // - // add segments on both sides of the interface to the interface - // ------------------------------------------------------------- // - for (int i=0; i<Grid.NumMyBoundaryFaces(); ++i) - { - int tag; - int nodeids[4]; - Grid.FaceVertices(i,tag,nodeids); - if (tag == 0) - continue; - // create a segment (galeri calls it a face) - MOERTEL::Segment_BiLinearQuad segment(i,4,nodeids,printlevel); - - if (tag==1) - interfaces[0]->AddSegment(segment,0); - else if (tag==2) - interfaces[0]->AddSegment(segment,1); - else if (tag==11) - interfaces[1]->AddSegment(segment,0); - else if (tag==12) - interfaces[1]->AddSegment(segment,1); - else if (tag==21) - interfaces[2]->AddSegment(segment,0); - else if (tag==22) - interfaces[2]->AddSegment(segment,1); - else if (tag==31) - interfaces[3]->AddSegment(segment,0); - else if (tag==32) - interfaces[3]->AddSegment(segment,1); - else - { - cout << "Face with unknown tag " << tag << endl; - exit(EXIT_FAILURE); - } - } - - // ------------------------------------------------------------- // - // choose the mortar side of the interface (0 or 1) - // choose the finer side here, which is 0 - // ------------------------------------------------------------- // - for (int i=0; i<ninter; ++i) - interfaces[i]->SetMortarSide(0); - - // ------------------------------------------------------------- // - // As we do not know the mortar side yet (we decided to le the - // package choose it), we can not set a dual trace function (mortar space) - // as we don't know the side to set it to - // so we just give orders for the function type - // ------------------------------------------------------------- // - for (int i=0; i<ninter; ++i) - interfaces[i]->SetFunctionTypes(MOERTEL::Function::func_BiLinearQuad, // primal trace space - MOERTEL::Function::func_DualBiLinearQuad); // dual mortar space (recommended) - //MOERTEL::Function::func_BiLinearQuad); // mortar space (not recommended) - - // ------------------------------------------------------------- // - // complete the interfaces - // ------------------------------------------------------------- // - for (int i=0; i<ninter; ++i) - if (!interfaces[i]->Complete()) - { - cout << "Interface " << i << " completion returned false\n"; - exit(EXIT_FAILURE); - } - - // ------------------------------------------------------------- // - // create an empty MOERTEL::Manager for 3D problems - // It organizes everything from integration to solution - // ------------------------------------------------------------- // - MOERTEL::Manager manager(Comm,MOERTEL::Manager::manager_3D,printlevel); - - // ------------------------------------------------------------- // - // Add the interfaces to the manager - // ------------------------------------------------------------- // - for (int i=0; i<ninter; ++i) - manager.AddInterface(*(interfaces[i])); - - // ------------------------------------------------------------- // - // for mortar integration, the mortar manager needs to know about - // the rowmap of the original (uncoupled) problem because it will - // create coupling matrices D and M matching that rowmap - // ------------------------------------------------------------- // - manager.SetProblemMap(&Grid.RowMap()); - - // ============================================================= // - // choose integration parameters - // ============================================================= // - Teuchos::ParameterList& moertelparams = manager.Default_Parameters(); - // this does affect this 3D case only - moertelparams.set("exact values at gauss points",true); - // 1D interface possible values are 1,2,3,4,5,6,7,8,10 (2 recommended with linear shape functions) - moertelparams.set("number gaussian points 1D",2); - // 2D interface possible values are 3,6,12,13,16,19,27 (12 recommended with linear functions) - moertelparams.set("number gaussian points 2D",12); - - // ============================================================= // - // Here we are done with the construction phase of the interface - // so we can integrate the mortar integrals - // (Note we have not yet evaluated the PDE at all!) - // ============================================================= // - manager.Mortar_Integrate(); - - // print interface information - // (Manager, Interface, Segment, Node implement the << operator) - if (printlevel) cout << manager; - - cout << "A" << endl; - - // ======================================================== // - // Prepares the linear system. This requires the definition // - // of a quadrature formula compatible with the grid, a // - // variational formulation, and a problem object which take // - // care of filling matrix and right-hand side. // - // NOTE: - // we are doing this AFTER we did all the mortar stuff to - // show that the mortar integration is actually PDE-independent - // ======================================================== // - Epetra_CrsMatrix A(Copy, Grid.RowMap(), 0); - Epetra_Vector LHS(Grid.RowMap(),true); - Epetra_Vector RHS(Grid.RowMap()); - - int NumQuadratureNodes = 8; - - GalerkinVariational<HexQuadrature> - Laplace3D(NumQuadratureNodes, Diffusion7, Source7, Force7, - BoundaryValue7, BoundaryType7); - - LinearProblem FiniteElementProblem(Grid, Laplace3D, A, LHS, RHS); - FiniteElementProblem.Compute(); - - // ============================================================= // - // this is Galeri's dense solve method if you'd like to see how - // the uncoupled solution looks like - // ============================================================= // - //Solve(&A, &LHS, &RHS); - - // ============================================================= // - // Since we now have all the pieces together, let's use the - // MOERTEL interface to other Trilinos packages to solve the - // problem - // ============================================================= // - - // ------------------------------------------------------------- // - // Create a Teuchos::ParameterList to hold solver arguments and also - // to hold arguments for connected packages AztecOO, ML and Amesos - // ------------------------------------------------------------- // - Teuchos::ParameterList list; - - // ------------------------------------------------------------- // - // Choose which type of system of equations to generate - // Note that only when using DUAL mortar spaces an spd system - // can be generated - // ------------------------------------------------------------- // - //list.set("System","SaddleSystem"); - list.set("System","SPDSystem"); - - // ------------------------------------------------------------- // - // choose solver, currently there is a choice of Amesos and ML/AztecOO - // Note that if "SaddleSystem" was chosen as system of equations - // ML/AztecOO doesn't work - // ------------------------------------------------------------- // - list.set("Solver","Amesos"); - //list.set("Solver","ML/Aztec"); // GAH Aztec not working FIX - - // ------------------------------------------------------------- // - // create sublists for packages Amesos, ML, AztecOO. they will be - // passed on to the individual package that is used - // ------------------------------------------------------------- // - - // Amesos parameters: - Teuchos::ParameterList& amesosparams = list.sublist("Amesos"); - amesosparams.set("Solver","Amesos_Klu"); - amesosparams.set("PrintTiming",true); - amesosparams.set("PrintStatus",true); - amesosparams.set("UseTranspose",true); - - // AztecOO parameters - Teuchos::ParameterList& aztecparams = list.sublist("Aztec"); - aztecparams.set("AZ_solver","AZ_cg"); - // This will involve ML as preconditioner - // See the AztecOO manual for other options - aztecparams.set("AZ_precond","AZ_user_precond"); - aztecparams.set("AZ_max_iter",1200); - aztecparams.set("AZ_output",100); - aztecparams.set("AZ_tol",1.0e-7); - aztecparams.set("AZ_scaling","AZ_none"); - - cout << "A" << endl; - // ML parameters - // As Moertel comes with his own special mortar multigrid hierachy - // based on ML's smoothed aggregation, not all ML parameters are recognized - // It basically recognizes everything that recognized by ML's MLAPI - // (ML Application Programming Interface), see MLAPI documentation - Teuchos::ParameterList& mlparams = list.sublist("ML"); - ML_Epetra::SetDefaults("SA",mlparams); - mlparams.set("output",10); - mlparams.set("print unused",1/*-2*/); - mlparams.set("PDE equations",1); - mlparams.set("max levels",10); - mlparams.set("coarse: max size",500); - mlparams.set("aggregation: type","Uncoupled"); - mlparams.set("aggregation: damping factor",1.33); - - // original : The unmodified ML (smoothed) aggregation prolongator - // mod_simple : ( R * (I-B*W^T) )^T - // mod_middle : ( (I - R B*W^T*P) * R * (I-B*W^T) )^T - // mod_full : ( (I - R B*W^T*P) * R * (I-B*W^T) )^T + ( R B*W^T*P * R * B*W^T )^T - mlparams.set("prolongator: type","mod_full"); - - // solvers/smoothers currently recognized by the MLAPI_InverseOperator are - // Ifpack: - // "Jacobi" "Gauss-Seidel" "symmetric Gauss-Seidel" - // "ILU" "ILUT" "IC" "ICT" "LU" "Amesos" "Amesos-KLU" - // and accompanying parameters as listed - // ML: - // "MLS" "ML MLS" "ML symmetric Gauss-Seidel" - // "ML Gauss-Seidel" "ML Jacobi" - // and accompanying parameters as listed - mlparams.set("coarse: type","Amesos-KLU"); - mlparams.set("smoother: type","symmetric Gauss-Seidel"); - mlparams.set("smoother: MLS polynomial order",3); - mlparams.set("smoother: damping factor",0.67); - mlparams.set("smoother: sweeps",1); - mlparams.set("smoother: pre or post","both"); - // the ns for Laplace is the constant - int dimnullspace = 1; - int nummyrows = manager.ProblemMap()->NumMyElements(); - int dimnsp = dimnullspace*nummyrows; - double* nsp = new double[dimnsp]; - for (int i=0; i<dimnsp; ++i) nsp[i] = 1.; - mlparams.set("null space: type","pre-computed"); - mlparams.set("null space: add default vectors",false); - mlparams.set("null space: dimension",dimnullspace); - mlparams.set("null space: vectors",nsp); - - // ------------------------------------------------------------- // - // Pass input matrix to Moertel, - // Moertel does NOT take ownership of A! - // ------------------------------------------------------------- // - manager.SetInputMatrix(&A,false); - - // ============================================================= // - // Solve - // ============================================================= // - manager.Solve(list,LHS,RHS); - - // ------------------------------------------------------------- // - // One can reset the solver, change parameters and/or matrix (with the - // same rowmap) and solve again if needed. - // If no ResetSolver() is called, the same matrix and preconditioner - // will be used to solve for multiple rhs - // ------------------------------------------------------------- // - //manager.ResetSolver(); - //LHS.PutScalar(0.0); - //manager.SetInputMatrix(&A,false); - //manager.Solve(list,LHS,RHS); - - - // ================== // - // Output using ExodusII // - // ================== // -#ifdef MOERTEL_HAVE_EXODUS - ExodusInterface exodus(Comm); - exodus.Write(Grid, "hex_output", LHS); -#endif - - -#ifdef HAVE_MPI - MPI_Finalize(); -#endif - - return(0); -} diff --git a/tlnos/src/wExample7.h.disabled b/tlnos/src/wExample7.h.disabled deleted file mode 100644 index a15a1198..00000000 --- a/tlnos/src/wExample7.h.disabled +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef WEXAMPLE7_H -#define WEXAMPLE7_H - -#include "tlnos.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <string> -#ifndef SWIG -#include "Teuchos_Comm.hpp" -#include "Teuchos_XMLParameterListHelpers.hpp" -#endif - -namespace tlnos { - -/** - * @brief a class containing the "build-against-trilinos" example of trilinos - */ - -class TLNOS_API Example7 : public fwk::wObject -{ -public: - Example7(); - int execute(); - -}; - -} - -#endif //WEXAMPLE7_H diff --git a/tlnos/src/wExample8.cpp b/tlnos/src/wExample8.cpp deleted file mode 100644 index 00dec2fe..00000000 --- a/tlnos/src/wExample8.cpp +++ /dev/null @@ -1,570 +0,0 @@ -#include "wExample8.h" -/* -#@HEADER -# ************************************************************************ -# -# Moertel FE Package -# Copyright (2006) Sandia Corporation -# -# Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -# license for use of this work by or on behalf of the U.S. Government. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# 3. Neither the name of the Corporation nor the names of the -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Questions? Contact Glen Hansen (gahanse@sandia.gov) -# -# ************************************************************************ -#@HEADER -*/ -/*! - * \file TwoSquares.cpp - * - * \brief Simple serial example showing Moertel usage and solver interfaces - * - * \date Last update do Doxygen: 20-March-06 - * - */ -#ifdef HAVE_MPI -#include "mpi.h" -#include "Epetra_MpiComm.h" -#else -#include "Epetra_SerialComm.h" -#endif - -// MOERTEL headers -#include "mrtr_manager.H" -#include "mrtr_segment_linear1D.H" - -// Galeri headers -#include "Galeri_Utils.h" -#include "Galeri_FiniteElements.h" - -#ifdef MOERTEL_HAVE_EXODUS -#include "ExodusInterface.h" -#endif - -using namespace Galeri; -using namespace Galeri::FiniteElements; - -// ========================================================== -// This file solves the scalar problem -// -// - \mu \nabla u + \sigma u = f on \Omega -// u = g on \partial \Omega -// -// where \Omega is a 2D rectangle, divided into triangles. -// The input grid should be generated using similar -// conventions of file galeri/data/TwoSquares.m: -// - the bc ID of 10 and 20 are for the mortar interface -// - the bc ID of 0 is for the external domain. -// ========================================================== - -double Diffusion8(const double &x, const double &y, const double &z) -{ - return (1.0); -} - -double Source8(const double &x, const double &y, const double &z) -{ - return (0.0); -} - -double Force8(const double &x, const double &y, const double &z) -{ - return (0.0); -} - -// Specifies the boundary condition. -int BoundaryType8(const int &Patch) -{ - if (Patch == 11 || Patch == 12) - return (GALERI_DIRICHLET); - else - return (GALERI_DO_NOTHING); -} - -// Specifies the boundary condition. -double BoundaryValue8(const double &x, const double &y, - const double &z, const int &Patch) -{ - if (Patch == 11 || Patch == 12) - return (-y / 4.0 + 0.75); - else - return (1.0); -} - -// =========== // -// main driver // -// =========== // - -using namespace tlnos; - -Example8::Example8() -{ -} - -int Example8::execute() -{ -#ifdef HAVE_MPI - /* - static int argc = 1; - char **argv = new char*[2];// mem leak volontaire - argv[0] = new char[8]; strcpy(argv[0], "myprog"); // mem leak volontaire - argv[1] = new char[1]; strcpy(argv[1], ""); // mem leak volontaire - - MPI_Init(&argc,&argv); - */ - Epetra_MpiComm Comm(MPI_COMM_WORLD); -#else - Epetra_SerialComm Comm; -#endif - - int status = 0; // return status - - try - { - - // this example is in serial only - if (Comm.NumProc() > 1) - exit(0); - - // read grid from file, see also TwoSquares.m used to generate the grids - /* - % +------+ - % | S2 | - % +------+ <- edge has tag 20 and 9 elements - % +------+ <- edge has tag 10 and 10 elements - % | S1 | - % +------+ - % - % where S1 = (-1,1) x (-1,1) and S2 = (-1, 1) x (1, 3). - */ - - FileGrid Grid(Comm, "TwoSquaresDirichlet.grid"); - - // create a list of all nodes that are linked to a face - // with tag 10 and tag 20 - map<int, int> nodes10; - map<int, int> nodes20; - for (int i = 0; i < Grid.NumMyBoundaryFaces(); ++i) - { - int tag; - int nodeids[2]; - Grid.FaceVertices(i, tag, nodeids); - if (tag == 10) - { - nodes10[nodeids[0]] = nodeids[0]; - nodes10[nodeids[1]] = nodeids[1]; - } - else if (tag == 20) - { - nodes20[nodeids[0]] = nodeids[0]; - nodes20[nodeids[1]] = nodeids[1]; - } - else - continue; - } - - // ------------------------------------------------------------- // - // create an empty MOERTEL::Interface, in this example just one - // ------------------------------------------------------------- // - int printlevel = 0; // ( moertel takes values 0 - 10 ) - //int printlevel = 9; // ( moertel takes values 0 - 10 ) - MOERTEL::Interface interface(0, true, Comm, printlevel); - - // ------------------------------------------------------------- // - // Add nodes on both sides of interface to interface - // loop all nodes in the maps nodes10 and nodes20 and add them - // to the interface with unique ids - // tag 10 will become interface side 0 - // tag 20 will become interface side 1 - // ------------------------------------------------------------- // - map<int, int>::iterator curr; - // do tag==10 or interface side 0 - for (curr = nodes10.begin(); curr != nodes10.end(); ++curr) - { - // get unique node id (here it's equal to the degree of freedom on that node) - int nodeid = curr->second; - // get node coordinates - double coord[3]; - Grid.VertexCoord(nodeid, coord); - // get dirichlet boundary conditions - double bou = BoundaryValue8(coord[0], coord[1], coord[2], 10); - bool dboundary = false; - if (bou == 0.0) - { - dboundary = true; - std::cout << "hi" << std::endl; - } - // create a moertel node - MOERTEL::Node node(nodeid, coord, 1, &nodeid, dboundary, printlevel); - // add node to the interface on side 0 - interface.AddNode(node, 0); - } - nodes10.clear(); - - // do tag==20 or interface side 1 - for (curr = nodes20.begin(); curr != nodes20.end(); ++curr) - { - // get unique node id (here it's equal to the degree of freedom on that node) - int nodeid = curr->second; - // get node coordinates - double coord[3]; - Grid.VertexCoord(nodeid, coord); - // get dirichlet boundary conditions - double bou = BoundaryValue8(coord[0], coord[1], coord[2], 20); - bool dboundary = false; - if (bou == 0.0) - { - dboundary = true; - std::cout << "hi" << std::endl; - } - // create a moertel node - MOERTEL::Node node(nodeid, coord, 1, &nodeid, dboundary, printlevel); - // add node to the interface on side 1 - interface.AddNode(node, 1); - } - nodes20.clear(); - - // ------------------------------------------------------------- // - // add segments on both sides of the interface to the interface - // ------------------------------------------------------------- // - for (int i = 0; i < Grid.NumMyBoundaryFaces(); ++i) - { - int tag; - int nodeids[2]; - Grid.FaceVertices(i, tag, nodeids); - if (tag != 10 && tag != 20) - continue; - // create a segment (galeri calls it a face) - MOERTEL::Segment_Linear1D segment(i, 2, nodeids, printlevel); - - // add it to the interface on side 0 - if (tag == 10) - interface.AddSegment(segment, 0); - // add it to the interface on side 1 - else if (tag == 20) - interface.AddSegment(segment, 1); - } - - // ------------------------------------------------------------- // - // choose the mortar side of the interface (0 or 1) - // here: let the package choose it (-2) - // ------------------------------------------------------------- // - interface.SetMortarSide(-2); - - // ------------------------------------------------------------- // - // As we do not know the mortar side yet (we decided to le the - // package choose it), we can not set a dual trace function (mortar space) - // as we don't know the side to set it to - // so we just give orders for the function type - // ------------------------------------------------------------- // - interface.SetFunctionTypes(MOERTEL::Function::func_Linear1D, // primal trace space - MOERTEL::Function::func_DualLinear1D); // dual mortar space (recommended) - //MOERTEL::Function::func_Linear1D); // mortar space (not recommended) - - // ------------------------------------------------------------- // - // complete the interface - // ------------------------------------------------------------- // - if (!interface.Complete()) - { - cout << "Interface completion returned false\n"; - exit(EXIT_FAILURE); - } - - // ------------------------------------------------------------- // - // create an empty MOERTEL::Manager for 2D problems - // It organizes everything from integration to solution - // ------------------------------------------------------------- // - MOERTEL::Manager manager(Comm, printlevel); - manager.SetDimension(MOERTEL::Manager::manager_2D); - - // ------------------------------------------------------------- // - // Add the interface to the manager - // ------------------------------------------------------------- // - manager.AddInterface(interface); - - // ------------------------------------------------------------- // - // for mortar integration, the mortar manager needs to know about - // the rowmap of the original (uncoupled) problem because it will - // create coupling matrices D and M matching that rowmap - // ------------------------------------------------------------- // - manager.SetProblemMap(&Grid.RowMap()); - - // ============================================================= // - // choose integration parameters - // ============================================================= // - Teuchos::ParameterList &moertelparams = manager.Default_Parameters(); - // this does not affect this 2D case - moertelparams.set("exact values at gauss points", true); - // 1D interface possible values are 1,2,3,4,5,6,7,8,10 (2 recommended with linear shape functions) - moertelparams.set("number gaussian points 1D", 2); - // 2D interface possible values are 3,6,12,13,16,19,27 - moertelparams.set("number gaussian points 2D", 27); - - // ============================================================= // - // Here we are done with the construction phase of the interface - // so we can integrate the mortar integrals - // (Note we have not yet evaluated the PDE at all!) - // ============================================================= // - manager.Mortar_Integrate(); - - // print interface information - // (Manager, Interface, Segment, Node implement the << operator) - if (printlevel) - cout << manager; - - // ======================================================== // - // Prepares the linear system. This requires the definition // - // of a quadrature formula compatible with the grid, a // - // variational formulation, and a problem object which take // - // care of filling matrix and right-hand side. // - // NOTE: - // we are doing this AFTER we did all the mortar stuff to - // show that the mortar integration is actually PDE-independent - // ======================================================== // - Epetra_CrsMatrix A(Copy, Grid.RowMap(), 0); - Epetra_Vector LHS(Grid.RowMap(), true); - Epetra_Vector RHS(Grid.RowMap()); - - int NumQuadratureNodes = 3; - - GalerkinVariational<TriangleQuadrature> - Laplace2D(NumQuadratureNodes, Diffusion8, Source8, Force8, - BoundaryValue8, BoundaryType8); - - LinearProblem FiniteElementProblem(Grid, Laplace2D, A, LHS, RHS); - FiniteElementProblem.Compute(); - - // ============================================================= // - // this is Galeri's dense solve method if you'd like to see how - // the uncoupled solution looks like - // ============================================================= // - Solve(&A, &LHS, &RHS); -#ifdef MOERTEL_HAVE_EXODUS - ExodusInterface exodus(Comm); - exodus.Write(Grid, "output", LHS); -#endif - std::cout << "Exodus is used for output" << std::endl; - - std::cout << A << std::endl; - std::cout << RHS << std::endl; - std::cout << LHS << std::endl; - // ============================================================= // - // Since we now have all the pieces together, let's use the - // MOERTEL interface to other Trilinos packages to solve the - // problem - // ============================================================= // - - // ------------------------------------------------------------- // - // Create a Teuchos::ParameterList to hold solver arguments and also - // to hold arguments for connected packages AztecOO, ML and Amesos - // ------------------------------------------------------------- // - Teuchos::ParameterList list; - - // ------------------------------------------------------------- // - // Choose which type of system of equations to generate - // Note that only when using DUAL mortar spaces an spd system - // can be generated - // ------------------------------------------------------------- // - //list.set("System","SaddleSystem"); - list.set("System", "SPDSystem"); - - // ------------------------------------------------------------- // - // choose solver, currently there is a choice of Amesos and ML/AztecOO - // Note that if "SaddleSystem" was chosen as system of equations - // ML/AztecOO doesn't work - // ------------------------------------------------------------- // - list.set("Solver", "Amesos"); - //list.set("Solver","ML/Aztec"); - - // ------------------------------------------------------------- // - // create sublists for packages Amesos, ML, AztecOO. they will be - // passed on to the individual package that is used - // ------------------------------------------------------------- // - - // Amesos parameters: - Teuchos::ParameterList &amesosparams = list.sublist("Amesos"); - amesosparams.set("Solver", "Amesos_Klu"); - amesosparams.set("PrintTiming", true); - amesosparams.set("PrintStatus", true); - amesosparams.set("UseTranspose", true); - - // AztecOO parameters - Teuchos::ParameterList &aztecparams = list.sublist("Aztec"); - aztecparams.set("AZ_solver", "AZ_cg"); - // This will involve ML as preconditioner - // See the AztecOO manual for other options - aztecparams.set("AZ_precond", "AZ_user_precond"); - aztecparams.set("AZ_max_iter", 1200); - aztecparams.set("AZ_output", 100); - aztecparams.set("AZ_tol", 1.0e-7); - aztecparams.set("AZ_scaling", "AZ_none"); - - // ML parameters - // As Moertel comes with his own special mortar multigrid hierachy - // based on ML's smoothed aggregation, not all ML parameters are recognized - // It basically recognizes everything that recognized by ML's MLAPI - // (ML Application Programming Interface), see MLAPI documentation - Teuchos::ParameterList &mlparams = list.sublist("ML"); - ML_Epetra::SetDefaults("SA", mlparams); - mlparams.set("output", 10); - mlparams.set("print unused", 1 /*-2*/); - mlparams.set("increasing or decreasing", "increasing"); - mlparams.set("PDE equations", 1); - mlparams.set("max levels", 10); - mlparams.set("coarse: max size", 80); - mlparams.set("aggregation: type", "Uncoupled"); - mlparams.set("aggregation: damping factor", 1.33); - - // original : The unmodified ML (smoothed) aggregation prolongator - // mod_simple : ( R * (I-B*W^T) )^T - // mod_middle : ( (I - R B*W^T*P) * R * (I-B*W^T) )^T - // mod_full : ( (I - R B*W^T*P) * R * (I-B*W^T) )^T + ( R B*W^T*P * R * B*W^T )^T - mlparams.set("prolongator: type", "mod_middle"); - - // solvers/smoothers currently recognized by the MLAPI_InverseOperator are - // Ifpack: - // "Jacobi" "Gauss-Seidel" "symmetric Gauss-Seidel" - // "ILU" "ILUT" "IC" "ICT" "LU" "Amesos" "Amesos-KLU" - // and accompanying parameters - // ML: - // "MLS" "ML MLS" "ML symmetric Gauss-Seidel" - // "ML Gauss-Seidel" - // and accompanying parameters - mlparams.set("coarse: type", "Amesos-KLU"); - mlparams.set("smoother: type", "symmetric Gauss-Seidel"); - mlparams.set("smoother: MLS polynomial order", 3); - mlparams.set("relaxation: min diagonal value", 0.1); - mlparams.set("smoother: damping factor", 0.67); - mlparams.set("smoother: sweeps", 1); - mlparams.set("smoother: pre or post", "both"); - // the ns for Laplace is the constant - int dimnullspace = 1; - int nummyrows = manager.ProblemMap()->NumMyElements(); - int dimnsp = dimnullspace * nummyrows; - double *nsp = new double[dimnsp]; - for (int i = 0; i < dimnsp; ++i) - nsp[i] = 1.; - mlparams.set("null space: type", "pre-computed"); - mlparams.set("null space: add default vectors", false); - mlparams.set("null space: dimension", dimnullspace); - mlparams.set("null space: vectors", nsp); - - // ------------------------------------------------------------- // - // Pass input matrix to Moertel, - // Moertel does NOT take ownership of A! - // ------------------------------------------------------------- // - manager.SetInputMatrix(&A, false); - - // ============================================================= // - // Solve - // ============================================================= // - manager.Solve(list, LHS, RHS); - - std::cout << A << std::endl; - std::cout << RHS << std::endl; - std::cout << LHS << std::endl; - - std::cout << manager << std::endl; - - Epetra_CrsMatrix *B = manager.MakeSaddleProblem(); - - std::cout << A << std::endl; - std::cout << *B << std::endl; - - std::cout << B->NumGlobalRows() << std::endl; - std::cout << B->NumGlobalCols() << std::endl; - - Epetra_Vector LHS2(B->RowMap(), true); - Epetra_Vector LHS3(A.RowMap(), true); - Epetra_Vector RHS2(B->RowMap()); - - for (size_t i = 0; i < A.NumGlobalRows(); ++i) - RHS2[i] = RHS[i]; - - Solve(B, &LHS2, &RHS2); - for (size_t i = 0; i < A.NumGlobalRows(); ++i) - LHS3[i] = LHS2[i]; -#ifdef MOERTEL_HAVE_EXODUS - exodus.Write(Grid, "output3", LHS3); -#endif - // ------------------------------------------------------------- // - // One can reset the solver, change parameters and/or matrix (with the - // same rowmap) and solve again if needed. - // If no ResetSolver() is called, the same matrix and preconditioner - // will be used to solve for multiple rhs - // ------------------------------------------------------------- // - //manager.ResetSolver(); - //LHS.PutScalar(0.0); - //manager.SetInputMatrix(&A,false); - //manager.Solve(list,LHS,RHS); - -#ifdef MOERTEL_HAVE_EXODUS - - // ================== // - // Output using ExodusII // - // ================== // - //ExodusInterface exodus(Comm); - exodus.Write(Grid, "output2", LHS); - - std::cout << "Exodus is used for output" << std::endl; - -#endif - } - catch (int e) - { - cerr << "Caught exception, value = " << e << endl; - status = 1; - } - catch (Galeri::Exception &rhs) - { - - cerr << "Caught Galeri exception: "; - rhs.Print(); - status = 1; - } - catch (...) - { - cerr << "Caught generic exception" << endl; - status = 1; - } - -#ifdef HAVE_MPI - MPI_Finalize(); -#endif - - if (status == 0) - std::cout << "\nTest passed!" << endl; - else - std::cout << "\nTest Failed!" << endl; - - // Final return value (0 = successfull, non-zero = failure) - - return status; -} diff --git a/tlnos/src/wExample8.h b/tlnos/src/wExample8.h deleted file mode 100644 index 2bae4e6f..00000000 --- a/tlnos/src/wExample8.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef WEXAMPLE8_H -#define WEXAMPLE8_H - -#include "tlnos.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <string> -#ifndef SWIG -#include "Teuchos_Comm.hpp" -#include "Teuchos_XMLParameterListHelpers.hpp" -#endif - -namespace tlnos -{ - -/** - * @brief a class containing the "build-against-trilinos" example of trilinos - */ - -class TLNOS_API Example8 : public fwk::wObject -{ -public: - Example8(); - int execute(); -}; - -} // namespace tlnos - -#endif //WEXAMPLE8_H diff --git a/tlnos/src/wExample9.cpp b/tlnos/src/wExample9.cpp deleted file mode 100644 index 378d809a..00000000 --- a/tlnos/src/wExample9.cpp +++ /dev/null @@ -1,466 +0,0 @@ -#include "wExample9.h" -/* -#@HEADER -# ************************************************************************ -# -# Moertel FE Package -# Copyright (2006) Sandia Corporation -# -# Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive -# license for use of this work by or on behalf of the U.S. Government. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# 3. Neither the name of the Corporation nor the names of the -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# Questions? Contact Glen Hansen (gahanse@sandia.gov) -# -# ************************************************************************ -#@HEADER -*/ -/*! - * \file TwoSquares.cpp - * - * \brief Simple serial example showing Moertel usage and solver interfaces - * - * \date Last update do Doxygen: 20-March-06 - * - */ -#ifdef HAVE_MPI -#include "mpi.h" -#include "Epetra_MpiComm.h" -#else -#include "Epetra_SerialComm.h" -#endif - -// MOERTEL headers -#include "mrtr_manager.H" -#include "mrtr_segment_linear1D.H" - -// Galeri headers -#include "Galeri_Utils.h" -#include "Galeri_FiniteElements.h" -#ifdef MOERTEL_HAVE_EXODUS -#include "ExodusInterface.h" -#endif -using namespace Galeri; -using namespace Galeri::FiniteElements; - -// ========================================================== -// This file solves the scalar problem -// -// - \mu \nabla u + \sigma u = f on \Omega -// u = g on \partial \Omega -// -// where \Omega is a 2D rectangle, divided into triangles. -// The input grid should be generated using similar -// conventions of file galeri/data/TwoSquares.m: -// - the bc ID of 10 and 20 are for the mortar interface -// - the bc ID of 0 is for the external domain. -// ========================================================== - -double Diffusion9(const double &x, const double &y, const double &z) -{ - return (1.0); -} - -double Source9(const double &x, const double &y, const double &z) -{ - return (0.0); -} - -double Force9(const double &x, const double &y, const double &z) -{ - return (0.0); -} - -// Specifies the boundary condition. -int BoundaryType9(const int &Patch) -{ - if (Patch == 11 || Patch == 12) - return (GALERI_DIRICHLET); - else - return (GALERI_DO_NOTHING); -} - -// Specifies the boundary condition. -double BoundaryValue9(const double &x, const double &y, - const double &z, const int &Patch) -{ - if (Patch == 11 || Patch == 12) - return (-y / 4.0 + 0.75); - else - return (1.0); -} - -// =========== // -// main driver // -// =========== // - -using namespace tlnos; - -Example9::Example9() -{ -} - -int Example9::execute() -{ -#ifdef HAVE_MPI - /* - static int argc = 1; - char **argv = new char*[2];// mem leak volontaire - argv[0] = new char[8]; strcpy(argv[0], "myprog"); // mem leak volontaire - argv[1] = new char[1]; strcpy(argv[1], ""); // mem leak volontaire - MPI_Init(&argc,&argv); -*/ - - Epetra_MpiComm Comm(MPI_COMM_WORLD); -#else - Epetra_SerialComm Comm; -#endif - - int status = 0; // return status - - try - { - - // this example is in serial only - if (Comm.NumProc() > 1) - exit(0); - - // read grid from file, see also TwoSquares.m used to generate the grids - /* - % +------+ - % | S2 | - % +------+ <- edge has tag 20 and 9 elements - % +------+ <- edge has tag 10 and 10 elements - % | S1 | - % +------+ - % - % where S1 = (-1,1) x (-1,1) and S2 = (-1, 1) x (1, 3). - */ - - FileGrid Grid(Comm, "TwoSquaresDirichlet.grid"); - - // create a list of all nodes that are linked to a face - // with tag 10 and tag 20 - map<int, int> nodes10; - map<int, int> nodes20; - for (int i = 0; i < Grid.NumMyBoundaryFaces(); ++i) - { - int tag; - int nodeids[2]; - Grid.FaceVertices(i, tag, nodeids); - if (tag == 10) - { - nodes10[nodeids[0]] = nodeids[0]; - nodes10[nodeids[1]] = nodeids[1]; - } - else if (tag == 20) - { - nodes20[nodeids[0]] = nodeids[0]; - nodes20[nodeids[1]] = nodeids[1]; - } - else - continue; - } - - // ------------------------------------------------------------- // - // create an empty MOERTEL::Interface, in this example just one - // ------------------------------------------------------------- // - int printlevel = 0; // ( moertel takes values 0 - 10 ) - //int printlevel = 9; // ( moertel takes values 0 - 10 ) - MOERTEL::Interface interface(0, true, Comm, printlevel); - - // ------------------------------------------------------------- // - // Add nodes on both sides of interface to interface - // loop all nodes in the maps nodes10 and nodes20 and add them - // to the interface with unique ids - // tag 10 will become interface side 0 - // tag 20 will become interface side 1 - // ------------------------------------------------------------- // - map<int, int>::iterator curr; - // do tag==10 or interface side 0 - for (curr = nodes10.begin(); curr != nodes10.end(); ++curr) - { - // get unique node id (here it's equal to the degree of freedom on that node) - int nodeid = curr->second; - // get node coordinates - double coord[3]; - Grid.VertexCoord(nodeid, coord); - // get dirichlet boundary conditions - double bou = BoundaryValue9(coord[0], coord[1], coord[2], 10); - bool dboundary = false; - if (bou == 0.0) - { - dboundary = true; - std::cout << "hi" << std::endl; - } - // create a moertel node - MOERTEL::Node node(nodeid, coord, 1, &nodeid, dboundary, printlevel); - // add node to the interface on side 0 - interface.AddNode(node, 0); - } - nodes10.clear(); - - // do tag==20 or interface side 1 - for (curr = nodes20.begin(); curr != nodes20.end(); ++curr) - { - // get unique node id (here it's equal to the degree of freedom on that node) - int nodeid = curr->second; - // get node coordinates - double coord[3]; - Grid.VertexCoord(nodeid, coord); - // get dirichlet boundary conditions - double bou = BoundaryValue9(coord[0], coord[1], coord[2], 20); - bool dboundary = false; - if (bou == 0.0) - { - dboundary = true; - std::cout << "hi" << std::endl; - } - // create a moertel node - MOERTEL::Node node(nodeid, coord, 1, &nodeid, dboundary, printlevel); - // add node to the interface on side 1 - interface.AddNode(node, 1); - } - nodes20.clear(); - - // ------------------------------------------------------------- // - // add segments on both sides of the interface to the interface - // ------------------------------------------------------------- // - for (int i = 0; i < Grid.NumMyBoundaryFaces(); ++i) - { - int tag; - int nodeids[2]; - Grid.FaceVertices(i, tag, nodeids); - if (tag != 10 && tag != 20) - continue; - // create a segment (galeri calls it a face) - MOERTEL::Segment_Linear1D segment(i, 2, nodeids, printlevel); - - // add it to the interface on side 0 - if (tag == 10) - interface.AddSegment(segment, 0); - // add it to the interface on side 1 - else if (tag == 20) - interface.AddSegment(segment, 1); - } - - // ------------------------------------------------------------- // - // choose the mortar side of the interface (0 or 1) - // here: let the package choose it (-2) - // ------------------------------------------------------------- // - interface.SetMortarSide(-2); - - // ------------------------------------------------------------- // - // As we do not know the mortar side yet (we decided to le the - // package choose it), we can not set a dual trace function (mortar space) - // as we don't know the side to set it to - // so we just give orders for the function type - // ------------------------------------------------------------- // - interface.SetFunctionTypes(MOERTEL::Function::func_Linear1D, // primal trace space - //MOERTEL::Function::func_DualLinear1D); // dual mortar space (recommended) - MOERTEL::Function::func_Linear1D); // mortar space (not recommended) - - // ------------------------------------------------------------- // - // complete the interface - // ------------------------------------------------------------- // - if (!interface.Complete()) - { - cout << "Interface completion returned false\n"; - exit(EXIT_FAILURE); - } - - // ------------------------------------------------------------- // - // create an empty MOERTEL::Manager for 2D problems - // It organizes everything from integration to solution - // ------------------------------------------------------------- // - MOERTEL::Manager manager(Comm, printlevel); - manager.SetDimension(MOERTEL::Manager::manager_2D); - - // ------------------------------------------------------------- // - // Add the interface to the manager - // ------------------------------------------------------------- // - manager.AddInterface(interface); - - // ------------------------------------------------------------- // - // for mortar integration, the mortar manager needs to know about - // the rowmap of the original (uncoupled) problem because it will - // create coupling matrices D and M matching that rowmap - // ------------------------------------------------------------- // - manager.SetProblemMap(&Grid.RowMap()); - - // ============================================================= // - // choose integration parameters - // ============================================================= // - Teuchos::ParameterList &moertelparams = manager.Default_Parameters(); - // this does not affect this 2D case - moertelparams.set("exact values at gauss points", true); - // 1D interface possible values are 1,2,3,4,5,6,7,8,10 (2 recommended with linear shape functions) - moertelparams.set("number gaussian points 1D", 2); - // 2D interface possible values are 3,6,12,13,16,19,27 - moertelparams.set("number gaussian points 2D", 27); - - // ============================================================= // - // Here we are done with the construction phase of the interface - // so we can integrate the mortar integrals - // (Note we have not yet evaluated the PDE at all!) - // ============================================================= // - manager.Mortar_Integrate(); - - // print interface information - // (Manager, Interface, Segment, Node implement the << operator) - if (printlevel) - cout << manager; - - // ======================================================== // - // Prepares the linear system. This requires the definition // - // of a quadrature formula compatible with the grid, a // - // variational formulation, and a problem object which take // - // care of filling matrix and right-hand side. // - // NOTE: - // we are doing this AFTER we did all the mortar stuff to - // show that the mortar integration is actually PDE-independent - // ======================================================== // - Epetra_CrsMatrix A(Copy, Grid.RowMap(), 0); - Epetra_Vector LHS(Grid.RowMap(), true); - Epetra_Vector RHS(Grid.RowMap()); - - int NumQuadratureNodes = 3; - - GalerkinVariational<TriangleQuadrature> - Laplace2D(NumQuadratureNodes, Diffusion9, Source9, Force9, - BoundaryValue9, BoundaryType9); - - LinearProblem FiniteElementProblem(Grid, Laplace2D, A, LHS, RHS); - FiniteElementProblem.Compute(); - - // ============================================================= // - // this is Galeri's dense solve method if you'd like to see how - // the uncoupled solution looks like - // ============================================================= // - Solve(&A, &LHS, &RHS); -#ifdef MOERTEL_HAVE_EXODUS - ExodusInterface exodus(Comm); - exodus.Write(Grid, "uncoupled_output", LHS); -#endif - // ============================================================= // - // Pass input matrix to Moertel, - // Moertel does NOT take ownership of A! - // ============================================================= // - manager.SetInputMatrix(&A, false); - - // ============================================================= // - // Solve - // ============================================================= // - - Epetra_CrsMatrix *B = manager.MakeSaddleProblem(); - - Epetra_CrsMatrix B1(*B); - Epetra_CrsMatrix B2(Copy, (*B).RowMap(), 0); - Epetra_Vector LHS2(B2.RowMap(), true); - Epetra_Vector LHS3(A.RowMap(), true); - Epetra_Vector RHS2(B2.RowMap()); - - for (size_t i = 0; i < A.NumGlobalRows(); ++i) - RHS2[i] = RHS[i]; - - int B1NumMyRow = B1.NumMyRows(); - int B1MaxNumIndices = B1.MaxNumEntries(); - double *values = new double[B1MaxNumIndices]; - int B1NumIndices; - int *Indices_int = 0; - Indices_int = new int[B1MaxNumIndices]; - - for (size_t i = 0; i < B1NumMyRow; ++i) - { - B1.ExtractGlobalRowCopy(i, B1MaxNumIndices, B1NumIndices, values, Indices_int); - B2.InsertGlobalValues(i, B1NumIndices, values, Indices_int); - } - - double U; - int i_treshold = (B2.NumGlobalRows() + A.NumGlobalRows()) / 2; - for (int i = A.NumGlobalRows(); i < B2.NumGlobalRows(); ++i) - { - if (i < i_treshold) - U = 0.; - else - U = 10000.; - B2.InsertGlobalValues(i, 1, &U, &i); - } - - B2.FillComplete(); - - Solve(&B2, &LHS2, &RHS2); - - for (size_t i = 0; i < A.NumGlobalRows(); ++i) - LHS3[i] = LHS2[i]; -#ifdef MOERTEL_HAVE_EXODUS - exodus.Write(Grid, "coupled_output", LHS3); -#endif - std::cout << "Lambda" << std::endl - << "-----" << std::endl; - - for (size_t i = A.NumGlobalRows(); i < B2.NumGlobalRows(); ++i) - std::cout << LHS2[i] << std::endl; - - std::cout << *(manager.M()) << std::endl - << "-----" << std::endl; - std::cout << *(manager.D()) << std::endl - << "-----" << std::endl; - } - catch (int e) - { - cerr << "Caught exception, value = " << e << endl; - status = 1; - } - catch (Galeri::Exception &rhs) - { - - cerr << "Caught Galeri exception: "; - rhs.Print(); - status = 1; - } - catch (...) - { - cerr << "Caught generic exception" << endl; - status = 1; - } - -#ifdef HAVE_MPI - MPI_Finalize(); -#endif - - if (status == 0) - std::cout << "\nTest passed!" << endl; - else - std::cout << "\nTest Failed!" << endl; - - // Final return value (0 = successfull, non-zero = failure) - - return status; -} diff --git a/tlnos/src/wExample9.h b/tlnos/src/wExample9.h deleted file mode 100644 index 00b890b1..00000000 --- a/tlnos/src/wExample9.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef WEXAMPLE9_H -#define WEXAMPLE9_H - -#include "tlnos.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <string> -#ifndef SWIG -#include "Teuchos_Comm.hpp" -#include "Teuchos_XMLParameterListHelpers.hpp" -#endif - -namespace tlnos -{ - -/** - * @brief a class containing the "build-against-trilinos" example of trilinos - */ - -class TLNOS_API Example9 : public fwk::wObject -{ -public: - Example9(); - int execute(); -}; - -} // namespace tlnos - -#endif //WEXAMPL98_H diff --git a/tlnos/tests/example1.py b/tlnos/tests/example1.py deleted file mode 100755 index 3e6907c3..00000000 --- a/tlnos/tests/example1.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# runs the basic demo of Trilinos -# trilinos-12.6.1-Source/demos/buildAgainstTrilinos - - -import fwk.wutils as wu -import tlnos - -def main(**d): - print("main!") - expl = tlnos.Example1() - expl.execute(wu.pth("input.xml",__file__)) - -if __name__ == "__main__": - main() - diff --git a/tlnos/tests/example10.py b/tlnos/tests/example10.py deleted file mode 100755 index de58b7ae..00000000 --- a/tlnos/tests/example10.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- -# runs the basic demo of Trilinos -# trilinos-12.6.1-Source/demos/buildAgainstTrilinos - -import fwk.wutils as wu -import tlnos - -def main(**d): - expl = tlnos.Example10() - expl.execute() - -if __name__ == "__main__": - main() - diff --git a/tlnos/tests/example2.py b/tlnos/tests/example2.py deleted file mode 100755 index 5a2eedfd..00000000 --- a/tlnos/tests/example2.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- -# runs the basic demo of Trilinos -# trilinos-12.6.1-Source/demos/buildAgainstTrilinos - -import fwk.wutils as wu -import tlnos - -def main(**d): - expl = tlnos.Example2() - expl.execute() - -if __name__ == "__main__": - main() - diff --git a/tlnos/tests/example4.py b/tlnos/tests/example4.py deleted file mode 100755 index fdd0728e..00000000 --- a/tlnos/tests/example4.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8; -*- -# runs the basic demo of Trilinos -# trilinos-12.6.1-Source/demos/buildAgainstTrilinos - -import fwk.wutils as wu -import tlnos - -def main(**d): - expl = tlnos.Example4() - expl.execute() - -if __name__ == "__main__": - main() - diff --git a/tlnos/tests/input.xml b/tlnos/tests/input.xml deleted file mode 100644 index feeab544..00000000 --- a/tlnos/tests/input.xml +++ /dev/null @@ -1,7 +0,0 @@ -<ParameterList> - <ParameterList name="Application"> - <Parameter name="Name" type="string" value="Cold Fusion"/> - </ParameterList> -</ParameterList> - - diff --git a/waves/CMakeFiles/CMakeDirectoryInformation.cmake b/waves/CMakeFiles/CMakeDirectoryInformation.cmake deleted file mode 100644 index a5519e03..00000000 --- a/waves/CMakeFiles/CMakeDirectoryInformation.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.6 - -# Relative path conversion top directories. -set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/Users/kliegeois/dev/waves") -set(CMAKE_RELATIVE_PATH_TOP_BINARY "/Users/kliegeois/dev/waves") - -# Force unix paths in dependencies. -set(CMAKE_FORCE_UNIX_PATHS 1) - - -# The C and CXX include file regular expressions for this directory. -set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") -set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") -set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) -set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/waves/CMakeFiles/progress.marks b/waves/CMakeFiles/progress.marks deleted file mode 100644 index 04f9fe46..00000000 --- a/waves/CMakeFiles/progress.marks +++ /dev/null @@ -1 +0,0 @@ -59 diff --git a/waves/CMakeLists.txt b/waves/CMakeLists.txt deleted file mode 100644 index 3f0452be..00000000 --- a/waves/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Add source dir -ADD_SUBDIRECTORY( exe ) -ADD_SUBDIRECTORY( src ) -ADD_SUBDIRECTORY( _src ) - -# Add test dir -MACRO_AddTest(${CMAKE_CURRENT_SOURCE_DIR}/tests) - -# Add to install -INSTALL(FILES ${CMAKE_CURRENT_LIST_DIR}/__init__.py - ${CMAKE_CURRENT_LIST_DIR}/srcs.py - ${CMAKE_CURRENT_LIST_DIR}/utils.py - ${CMAKE_CURRENT_LIST_DIR}/viewer.py - DESTINATION waves) -INSTALL(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/tests - ${CMAKE_CURRENT_LIST_DIR}/models - DESTINATION waves) - \ No newline at end of file diff --git a/waves/__init__.py b/waves/__init__.py deleted file mode 100644 index ed6b0561..00000000 --- a/waves/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# waves MODULE initialization file - -import fwk -import tbox -from wavesw import * diff --git a/waves/_src/CMakeLists.txt b/waves/_src/CMakeLists.txt deleted file mode 100644 index 0b3b66d9..00000000 --- a/waves/_src/CMakeLists.txt +++ /dev/null @@ -1,52 +0,0 @@ - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# CMake input file of the SWIG wrapper around "waves.so" - -INCLUDE(${SWIG_USE_FILE}) - -FILE(GLOB SRCS *.h *.cpp *.inl *.swg) -FILE(GLOB ISRCS *.i) - -SET(CMAKE_SWIG_FLAGS "") -SET_SOURCE_FILES_PROPERTIES(${ISRCS} PROPERTIES CPLUSPLUS ON) - -SET(SWINCFLAGS --I${PROJECT_SOURCE_DIR}/waves/src --I${PROJECT_SOURCE_DIR}/ext/amfe/tbox/src --I${PROJECT_SOURCE_DIR}/ext/amfe/tbox/_src --I${PROJECT_SOURCE_DIR}/ext/amfe/fwk/src --I${PROJECT_SOURCE_DIR}/ext/amfe/fwk/_src -) -SET_SOURCE_FILES_PROPERTIES(${ISRCS} PROPERTIES SWIG_FLAGS "${SWINCFLAGS}") - -if (${CMAKE_VERSION} VERSION_LESS "3.8.0") - SWIG_ADD_MODULE(wavesw python ${ISRCS} ${SRCS}) -else() - SWIG_ADD_LIBRARY(wavesw LANGUAGE python SOURCES ${ISRCS} ${SRCS}) -endif() -MACRO_DebugPostfix(_wavesw) - -TARGET_INCLUDE_DIRECTORIES(_wavesw PRIVATE ${PROJECT_SOURCE_DIR}/ext/amfe/fwk/_src - ${PROJECT_SOURCE_DIR}/ext/amfe/tbox/_src - ${PYTHON_INCLUDE_PATH} -) - -SWIG_LINK_LIBRARIES(wavesw - waves tbox fwk ${PYTHON_LIBRARIES} -) - -INSTALL(FILES ${CMAKE_SWIG_OUTDIR}/wavesw.py DESTINATION ${CMAKE_INSTALL_PREFIX}) -INSTALL(TARGETS _wavesw DESTINATION ${CMAKE_INSTALL_PREFIX}) diff --git a/waves/_src/wavesw.i b/waves/_src/wavesw.i deleted file mode 100644 index 1f48fc0b..00000000 --- a/waves/_src/wavesw.i +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// SWIG input file of the 'waves' module - -%feature("autodoc","1"); - -%module(docstring= -"'wavesw' module: projet MP 2014 -(c) ULg - A&M", -directors="1", -threads="1" -) wavesw -%{ - -#include <string> -#include <sstream> -#include "waves.h" - -#include "fwkw.h" -#include "tboxw.h" - -#include "wForwardEuler.h" -#include "wRungeKutta.h" -#include "wTimeIntegration.h" -#include "wProblem.h" -#include "wNewmark.h" -#include "wSource.h" -#include "wMedium.h" -#include "wBoundary.h" - -#include "wDisplayHook.h" - -%} - -%include "fwkw.swg" - -// ----------- MODULES UTILISES ------------ -%import "fwkw.i" -%import "tboxw.i" - -// ----------- WAVES CLASSES --------------- -%include "waves.h" - -%shared_ptr(waves::Problem); -%shared_ptr(waves::Source); -%shared_ptr(waves::Medium); -%shared_ptr(waves::Boundary); - - -%feature("director") DisplayHook; -%include "wDisplayHook.h" - -%feature("director:except") { - if ($error != NULL) { - std::cout << "[in director:except]\n"; - //throw Swig::DirectorMethodException(); - throw std::runtime_error("Director problem"); - } -} - -%feature("director") waves::Source; -%pythonappend waves::Source::Source "self.__disown__()" // for directors -%include "wSource.h" - -%include "wMedium.h" -%include "wBoundary.h" - -%immutable waves::Problem::msh; // avoids the creation of the setter method -%include "wProblem.h" - -%include "wTimeIntegration.h" -%include "wForwardEuler.h" -%include "wRungeKutta.h" -%include "wNewmark.h" - diff --git a/waves/attic/export_xml.py b/waves/attic/export_xml.py deleted file mode 100644 index afbf596d..00000000 --- a/waves/attic/export_xml.py +++ /dev/null @@ -1,6 +0,0 @@ -# display -if 0: - import viewer - ugrid = viewer.toUgrid(mshdata) - viewer.writeXML(ugrid, name='mesh.vtu') - viewer.viewUgrid(ugrid) \ No newline at end of file diff --git a/waves/attic/testSonarQ.cpp b/waves/attic/testSonarQ.cpp deleted file mode 100644 index f0322e0f..00000000 --- a/waves/attic/testSonarQ.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include <iostream> - -void mem_leak() -{ - double *f = new double; - *f = 10; -} - -void not_init1() -{ - double a; - std::cout << a << '\n'; -} - -void not_init2() -{ - int i = 0; - double a; - if (i == 1) - a = 1; - std::cout << a << '\n'; -} diff --git a/waves/attic/wDof.cpp b/waves/attic/wDof.cpp deleted file mode 100644 index ca36db06..00000000 --- a/waves/attic/wDof.cpp +++ /dev/null @@ -1,3 +0,0 @@ -// $Id$ - -#include "wDof.h" diff --git a/waves/attic/wDof.h b/waves/attic/wDof.h deleted file mode 100644 index 11a552d8..00000000 --- a/waves/attic/wDof.h +++ /dev/null @@ -1,43 +0,0 @@ -// $Id$ - -#ifndef WDOF_H -#define WDOF_H - -#include "waves.h" -#include "wObject.h" -#include <vector> -#include <string> - -class Node; -class Field; - -/** - * @brief definition of an unknown - */ - -class WAVES_API Dof : public wObject -{ -public: - Node &node; - Field &f; - - Dof(Node &_node, Field &_f) : wObject(), node(_node), f(_f) {} -}; - -/** - * @brief list of fields - */ - -class WAVES_API Dofs : public wObject -{ -public: - std::vector<Dof *> dofs; - - Dofs() : wObject(), dofs(0) {} - //~Dofs(); - //void add(Dof &dof); - size_t size() const { return dofs.size(); } - //virtual void write(std::ostream &out) const; -}; - -#endif //WDOF_H diff --git a/waves/attic/wField.cpp b/waves/attic/wField.cpp deleted file mode 100644 index e0264b16..00000000 --- a/waves/attic/wField.cpp +++ /dev/null @@ -1,32 +0,0 @@ -// $Id$ - -#include "wField.h" - -Field::Field(std::string &_name, size_t _id) : wObject(), name(_name), id(_id) -{ -} - -void Field::write(std::ostream &out) const -{ - out << "Field #" << id << " \"" << name << "\""; -} - -// ---------------------------------------------------------------------- - -Fields::~Fields() -{ - for (std::vector<Field *>::iterator it = fields.begin(); it != fields.end(); ++it) - delete *it; -} - -void Fields::add(std::string &_name) -{ - size_t nextid = fields.size(); - fields.push_back(new Field(_name, nextid)); -} - -void Fields::write(std::ostream &out) const -{ - for (std::vector<Field *>::const_iterator it = fields.begin(); it != fields.end(); ++it) - out << **it << '\n'; -} diff --git a/waves/attic/wField.h b/waves/attic/wField.h deleted file mode 100644 index 35ad5745..00000000 --- a/waves/attic/wField.h +++ /dev/null @@ -1,41 +0,0 @@ -// $Id$ - -#ifndef WFIELD_H -#define WFIELD_H - -#include "waves.h" -#include "wObject.h" -#include <vector> -#include <string> - -/** - * @brief definition of a scalar field - */ - -class WAVES_API Field : public wObject -{ -public: - std::string name; - size_t id; ///< field value is stored at index "id" in nodal vectors - - Field(std::string &_name, size_t _id); - virtual void write(std::ostream &out) const; -}; - -/** - * @brief list of fields - */ - -class WAVES_API Fields : public wObject -{ -public: - std::vector<Field *> fields; - - Fields() : wObject() {} - ~Fields(); - void add(std::string &_name); - size_t size() const { return fields.size(); } - virtual void write(std::ostream &out) const; -}; - -#endif //WFIELD_H diff --git a/waves/attic/wSolver1.cpp b/waves/attic/wSolver1.cpp deleted file mode 100644 index 0bca4b79..00000000 --- a/waves/attic/wSolver1.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// $Id$ - -#include "wSolver1.h" - -void Solver1::write(std::ostream &out) const -{ -} \ No newline at end of file diff --git a/waves/attic/wSolver1.h b/waves/attic/wSolver1.h deleted file mode 100644 index 9b1afd80..00000000 --- a/waves/attic/wSolver1.h +++ /dev/null @@ -1,17 +0,0 @@ -// $Id$ - -#ifndef WSOLVER1_H -#define WSOLVER1_H - -#include "waves.h" -#include "wObject.h" -#include <iostream> - -class WAVES_API Solver1 -{ -public: - Solver1() {} - virtual void write(std::ostream &out) const; -}; - -#endif //WSOLVER1_H diff --git a/waves/broken/cas1.geo b/waves/broken/cas1.geo deleted file mode 100644 index 81cb82b7..00000000 --- a/waves/broken/cas1.geo +++ /dev/null @@ -1,60 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - - -//X=250m -//Y=250m -//Z=250m - -Lx = 250; -Ly = 250; -Lz = 250; - -nl = 30; - -lc = Lx/nl; - - - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { Lx, 0, 0, lc}; -Point(3) = { Lx, -Ly, 0, lc}; -Point(4) = {-Lx, -Ly, 0, lc}; -Point(5) = {-Lx, 0, 0, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 5}; -Line(5) = {5, 1}; -Line Loop(6) = {5, 1, 2, 3, 4}; -Plane Surface(7) = {6}; -Recombine Surface {7}; - -Extrude {0, 0, Lz} -{ - Surface{7}; Layers{nl}; Recombine; -} - -Extrude {0, 0, -Lz} -{ - Surface{7}; Layers{nl}; Recombine; -} - -// physical entities - -Physical Point("Source Point") = {1}; -Physical Line("Measurement line") = {1}; -Physical Surface("Up Side") = {17, 44, 48, 21}; -// Physical Surface("Bottom Side") = {29, 56}; -// Physical Surface("Front Side") = {34}; -// Physical Surface("Rear Side") = {61}; -// Physical Surface("Right Side") = {25, 52}; -// Physical Surface("Left Side") = {33, 60}; - -Physical Surface("ABC") = {29, 56, 34, 61, 25, 52, 33, 60}; - -Physical Volume("Volume") = {1, 2}; - - - diff --git a/waves/broken/cas1.py b/waves/broken/cas1.py deleted file mode 100755 index 47384a42..00000000 --- a/waves/broken/cas1.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# TODO: il manque une source... - -import waves as w -import tbox.gmsh as gmsh -import waves.wtools as wt - - -def main(): - msh = gmsh.MeshLoader("cas1.geo", __file__).execute() - - pbl = w.Problem(msh) - - L=250.0 - nl=60 - Le=L/nl - c=1500.0 - dt=Le/c/2 - - scheme = w.ForwardEuler(msh, pbl) - scheme.ttot = 0.2*100 - scheme.dt = dt - scheme.savefreq=5 - scheme.nthreads=8 - - print("dt=", dt) - print("nsteps=", int(scheme.ttot/dt)) - - w.Medium(pbl, "Volume", c) - - print(pbl) - - usegui=1 - if not usegui: - scheme.start() - else: - import waves.viewer as v - gui = v.MeshViewer(msh, scheme) - gui.start() - -if __name__ == "__main__": - main() diff --git a/waves/broken/geuz/geophysique.geo b/waves/broken/geuz/geophysique.geo deleted file mode 100644 index b73326f0..00000000 --- a/waves/broken/geuz/geophysique.geo +++ /dev/null @@ -1,72 +0,0 @@ -Include "geophysique_param.geo"; - -Mesh.RecombineAll = 1; -Mesh.Algorithm = 8; -Mesh.VolumeEdges = 0; -View.DrawSkinOnly = 1; -View.IntervalsType = 1; -View.NbIso = 10; - -For i In {1:9} - y~{i} = Y * i/10; -EndFor - -lambda = 1500 / Freq; -lc = lambda / 10; -N = Z / lc; - -Point(1) = {0, 0, 0, lc}; -Point(2) = {-X, 0, 0, lc}; -Point(3) = {X, 0, 0, lc}; -Point(4) = {-X, -Y,0, lc}; -Point(5) = {X, -Y, 0, lc}; - -Point(10) = {-X, -y_3, 0, lc}; -Point(11) = {0, -y_2, 0, lc}; -Point(12) = {X, -y_4, 0, lc}; - -Point(20) = {-X, -y_5, 0, lc}; -Point(21) = {0, -y_6, 0, lc}; -Point(22) = {X, -y_6, 0, lc}; - -Point(30) = {-X, -y_9, 0, lc}; -Point(31) = {0, -y_8, 0, lc}; -Point(32) = {X, -y_7, 0, lc}; - -Line(1) = {2, 1}; -Line(2) = {1, 3}; -Line(3) = {3, 12}; -Line(4) = {12, 22}; -Line(5) = {22, 32}; -Line(6) = {32, 5}; -Line(7) = {5, 4}; -Line(8) = {4, 30}; -Line(9) = {30, 20}; -Line(10) = {20, 10}; -Line(11) = {10, 2}; -Spline(12) = {10, 11, 12}; -Spline(13) = {20, 21, 22}; -Spline(14) = {30, 31, 32}; -Line Loop(15) = {1, 2, 3, -12, 11}; -Plane Surface(16) = {15}; -Line Loop(17) = {12, 4, -13, 10}; -Plane Surface(18) = {17}; -Line Loop(19) = {13, 5, -14, 9}; -Plane Surface(20) = {19}; -Line Loop(21) = {14, 6, 7, 8}; -Plane Surface(22) = {21}; - -e1[] = Extrude {0, 0, Z} { Surface{16, 18, 20, 22}; Layers {N}; Recombine; }; -e2[] = Extrude {0, 0, -Z} { Surface{16, 18, 20, 22}; Layers {N}; Recombine; }; - -Physical Point(GAMMAD) = {1}; - -Physical Volume(OMEGA_1) = {1,5}; -Physical Volume(OMEGA_2) = {2,6}; -Physical Volume(OMEGA_3) = {3,7}; -Physical Volume(OMEGA_4) = {4,8}; - -Physical Surface(GAMMAINF_1) = {-49, -48, 141, 142, -40, 133}; -Physical Surface(GAMMAINF_2) = {-71, -70, 163, 164, -62, 155}; -Physical Surface(GAMMAINF_3) = {-93, -92, 185, 186, -84, 177}; -Physical Surface(GAMMAINF_4) = {-115, -110, 203, 208, -106, 199, -114, 207}; diff --git a/waves/broken/geuz/geophysique.pro b/waves/broken/geuz/geophysique.pro deleted file mode 100644 index 5f892e49..00000000 --- a/waves/broken/geuz/geophysique.pro +++ /dev/null @@ -1,149 +0,0 @@ -Include "geophysique_param.geo"; - -Group { - Layer1 = Region[OMEGA_1]; - Layer2 = Region[OMEGA_2]; - Layer3 = Region[OMEGA_3]; - Layer4 = Region[OMEGA_4]; - Bnd1 = Region[GAMMAINF_1]; - Bnd2 = Region[GAMMAINF_2]; - Bnd3 = Region[GAMMAINF_3]; - Bnd4 = Region[GAMMAINF_4]; - - GammaInf = Region[{Bnd1,Bnd2,Bnd3,Bnd4}]; - Omega = Region[{Layer1,Layer2,Layer3,Layer4}]; - GammaD = Region[GAMMAD]; - Sigma = Region[{}]; -} - -Function { - DefineConstant[ - c1 = {1500, Name "Input/c1"} , - c2 = {1500, Name "Input/c2"} , - c3 = {1500, Name "Input/c3"} , - c4 = {1500, Name "Input/c4"} - ]; - c[Region[{Layer1,Bnd1}]] = c1; - c[Region[{Layer2,Bnd2}]] = c2; - c[Region[{Layer3,Bnd3}]] = c3; - c[Region[{Layer4,Bnd4}]] = c4; - t_min = 0; - t_max = 1; - dt = 1/100; -} - -Jacobian { - { Name JVol ; Case { { Region All ; Jacobian Vol ; } } } - { Name JSur ; Case { { Region All ; Jacobian Sur ; } } } - { Name JLin ; Case { { Region All ; Jacobian Lin ; } } } -} - -Integration { - { Name I1 ; - Case { { Type Gauss ; Case { - { GeoElement Point ; NumberOfPoints 1 ; } - { GeoElement Line ; NumberOfPoints 2 ; } - { GeoElement Triangle ; NumberOfPoints 6 ; } - { GeoElement Tetrahedron ; NumberOfPoints 4 ; } - { GeoElement Quadrangle ; NumberOfPoints 4 ; } - { GeoElement Hexahedron ; NumberOfPoints 14 ; } - } } } - } -} - -Constraint{ - { Name Dirichlet_uinc ; - Case { - { Region GammaD ; Value 1; - TimeFunction Cos[2*Pi*Freq*$Time]; - } - } - } -} - -FunctionSpace { - { Name Hgrad_u; Type Form0 ; - BasisFunction { - { Name sn ; NameOfCoef un ; Function BF_Node ; - Support Region[ {Omega, GammaInf, Sigma, GammaD} ] ; Entity NodesOf[ All ] ; } } - Constraint { - { NameOfCoef un ; EntityType NodesOf ; NameOfConstraint Dirichlet_uinc ; } - } - } -} - -Formulation { - { Name Full ; Type FemEquation ; - Quantity { - { Name u ; Type Local ; NameOfSpace Hgrad_u; } - } - Equation { - Galerkin { [ - Dof{Grad u} , {Grad u} ] ; - In Omega; Jacobian JVol ; Integration I1 ; } - Galerkin { DtDtDof [ - 1/c[]^2 * Dof{u} , {u} ] ; - In Omega; Jacobian JVol ; Integration I1 ; } - Galerkin { DtDof [ - 1/c[] * Dof{u} , {u} ] ; - In GammaInf; Jacobian JSur ; Integration I1 ; } - } - } -} - -Resolution { - { Name Full_f; - System { - { Name Helmholtz ; NameOfFormulation Full ; Type Complex; Frequency Freq; } - } - Operation { - Generate[Helmholtz] ; - Solve[Helmholtz] ; - SaveSolution[Helmholtz]; - } - } - { Name Full_t; - System { - { Name Helmholtz ; NameOfFormulation Full ; } - } - Operation { - InitSolution[Helmholtz]; - InitSolution[Helmholtz]; - // fast: - GenerateSeparate[Helmholtz]; - TimeLoopNewmark[t_min,t_max,dt,0.25,0.5]{ - Update[Helmholtz] ; - SolveAgain[Helmholtz] ; - SaveSolution[Helmholtz]; - } - // slow: - /* - TimeLoopNewmark[t_min,t_max,dt,0.25,0.5]{ - Generate[Helmholtz] ; - SolveAgain[Helmholtz] ; - SaveSolution[Helmholtz]; - } - */ - } - } -} - -PostProcessing { - { Name Full ; NameOfFormulation Full ; - PostQuantity { - { Name u ; Value { Term { [ {u} ] ; In Region[ {Omega} ]; Jacobian JVol ; } } } - } - } -} - -PostOperation { - { Name Full ; NameOfPostProcessing Full; - Operation { - Print[ u, OnElementsOf Omega, File "u.pos"] ; - } - } -} - -DefineConstant[ - //R_ = {"Full", Name "GetDP/1ResolutionChoices", Visible 0}, - C_ = {"-solve -pos -v2 -bin", Name "GetDP/9ComputeCommand", Visible 1} - //P_ = {"", Name "GetDP/2PostOperationChoices", Visible 0} -]; - diff --git a/waves/broken/geuz/geophysique.py b/waves/broken/geuz/geophysique.py deleted file mode 100755 index ec935081..00000000 --- a/waves/broken/geuz/geophysique.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# TODO: marche pas/plus - -import waves as w -import tbox.gmsh as gmsh - -def main(): - msh = gmsh.MeshLoader("geophysique.geo", __file__).execute() - print(msh) - - pbl = w.Problem(msh) - pbl.c = 1500.0 - - c = 1500.0 - X = 250.0; Y=250.0; Z=250.0 - freq = 10.0 - lam = c / freq - lc = lam / 10 - N = Z / lc - Le = X/N - dt = Le/c/10 - - scheme = w.ForwardEuler(pbl) - - import waves.srcs - waves.srcs.SinSource(msh, 10, 10.0) # le no 10 ne passe pas! - w.Medium(msh, 1, c) - w.Medium(msh, 2, c) - w.Medium(msh, 3, c) - w.Medium(msh, 4, c) - - from fwk.wutils import parseargs - args=parseargs() - - scheme.ttot = 1.0 - scheme.dt = dt - scheme.savefreq = 5 - scheme.nthreads = args.k - - if args.nogui: - scheme.start() - else: - import waves.viewer as v - gui = v.MeshViewer(scheme) - gui.vmin = -0.1 - gui.vmax = 0.1 - gui.start() - -if __name__ == "__main__": - main() diff --git a/waves/broken/geuz/geophysique_param.geo b/waves/broken/geuz/geophysique_param.geo deleted file mode 100644 index 86865c09..00000000 --- a/waves/broken/geuz/geophysique_param.geo +++ /dev/null @@ -1,20 +0,0 @@ -lc = 10; -X = 250; -Y = 250; -Z = 250; - -DefineConstant[ - Freq = {10, Name "Input/Frequency"} -]; - -OMEGA_1 = 1; -OMEGA_2 = 2; -OMEGA_3 = 3; -OMEGA_4 = 4; - -GAMMAD = 10; - -GAMMAINF_1 = 11; -GAMMAINF_2 = 12; -GAMMAINF_3 = 13; -GAMMAINF_4 = 14; diff --git a/waves/broken/waves01_onelab.py b/waves/broken/waves01_onelab.py deleted file mode 100755 index fbe41711..00000000 --- a/waves/broken/waves01_onelab.py +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# Simple 2D wave propagation test - -import sys -#sys.path.append("/usr/local/bin") -#sys.path.append("C:\local\gmsh-2.9.0-Windows") - -import wutils -wutils.findbins() -import waves as w -import tbox as tb - -import wtools as wt - -import onelab -olab = onelab.client(__file__) - -time = olab.defineNumber('Dyna/time [s]', value=0.0) -wspeed = olab.defineNumber('Param/wave speed', value=10.0, - attributes={'Highlight':'Pink'}) - -if olab.action == 'check': - exit(0) - -def exportMshOpt(): - txt=""" -//n = PostProcessing.NbViews - 1; -//If(n >= 0) -n=0; -Mesh.SurfaceEdges = 0; -Mesh.VolumeEdges = 0; -View[n].IntervalsType = 3; -View[n].CustomMax = 0.1; -View[n].CustomMin = 0; -View[n].NbIso = 16; -View[n].RangeType = 2; -View[n].SaturateValues = 1; -//EndIf - """ - optFile = open(olab.getPath("results_merged.msh.opt"),'w') - optFile.write(txt) - optFile.close() - -exportMshOpt() - -class OneLabCallback(w.DisplayHook): - def __init__(self, msh, scheme): - w.DisplayHook.__init__(self) - self.msh = msh - self.scheme = scheme - scheme.setGUI(self) - scheme.wgmsh = w.Wgmsh_WG_ONE - - def display(self, nt, t, u): - """ C++ => python callback - """ - #print "[GUI] nt=", nt, "t=", t - global olab - - ttot=self.scheme.ttot - olab.setNumber(olab.name + '/Progress', value=t, min=0, max=ttot, visible=0) - olab.setNumber('Dyna/time [s]', value=t) - olab.setNumber('Dyna/step', value=nt) - - olab.setNumber('Solu/phi', value=u[0]) - olab.addNumberChoice('Solu/phi', u[0]) - - - - # ask Gmsh to refresh - olab.setString('Gmsh/Action', value='refresh') - - # stop if we are asked to (by Gmsh) - if(olab.getString(olab.name + '/Action') == 'stop'): - self.scheme.stopit=True - - filenames = ['waves01.msh', 'res.msh'] - with open('results_merged.msh', 'w') as outfile: - for fname in filenames: - with open(fname) as infile: - for line in infile: - outfile.write(line) - olab.mergeFile(olab.checkPath('results_merged.msh')) - #olab.mergeFile('results_merged.msh') - - def refresh(self): - # donne la main au GUI a chaque pas - pass - def start(self): - self.scheme.start() - -def main(): - global olab - msh = wutils.MeshLoader("waves01.geo").execute() - print(msh) - - pbl = w.Problem(msh) - print(pbl) - - Nx=50 - c = wspeed - X=10.0; Y=10.0; Z=2.0 - freq=10.0 - lam = c / freq - lc = lam / 10 - - Le=X/Nx - dt=Le/c/10 - - scheme = w.ForwardEuler(msh, pbl) - - #wt.SinSource(msh, "Line2", 5.0) - - w.Medium(pbl, "Volume", c) - - if 0: - wt.SinSource(pbl, "Line1", 10.0) - w.Boundary(pbl, "FaceX1", c) - w.Boundary(pbl, "FaceY1", c) - - if 0: - wt.SinSource(pbl, "FaceX0", 10.0) - w.Boundary(pbl, "FaceX1", c) - - if 1: - s = wt.MultiSource(pbl, "FaceY0") - s.addSource(tb.Vector3d(3,0,0),5) - s.addSource(tb.Vector3d(7,0,0),20) - w.Boundary(pbl, "FaceX0", c) - w.Boundary(pbl, "FaceX1", c) - w.Boundary(pbl, "FaceY1", c) - - if 0: - wt.PulseSource(pbl, "Line1", 10.0, shift=0.3, width=100.0) - w.Boundary(pbl, "FaceX1", c) - w.Boundary(pbl, "FaceY1", c) - - # boundaries - - - scheme.ttot = 10.0 - scheme.dt = dt - scheme.savefreq=5 - scheme.nthreads=12 - - - usegui=1 - if not usegui: - scheme.start() - else: - import viewer as v - gui = OneLabCallback(msh, scheme) - gui.start() - - - #raw_input("<Press a key>") - -if __name__ == "__main__": - main() diff --git a/waves/exe/CMakeLists.txt b/waves/exe/CMakeLists.txt deleted file mode 100644 index ec845ea8..00000000 --- a/waves/exe/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Example of compiled problem using "waves" - -FILE(GLOB SRCS *.h *.cpp *.inl *.hpp) -ADD_EXECUTABLE(waves1 ${SRCS}) -MACRO_DebugPostfix(waves1) -TARGET_LINK_LIBRARIES(waves1 waves) diff --git a/waves/exe/main.cpp b/waves/exe/main.cpp deleted file mode 100644 index 2825a71f..00000000 --- a/waves/exe/main.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "waves.h" -#include "wMshData.h" -#include "wProblem.h" -#include "wForwardEuler.h" -#include "wGmshImport.h" -#include "wGmshExport.h" - -// Note that the file strates.msh must be generated from waves/tests/attic/strates.geo using gmsh, and placed in the current directory -int main() -{ - auto msh = std::make_shared<tbox::MshData>(); - tbox::GmshImport *gmshLoader = new tbox::GmshImport(msh); - tbox::GmshExport *gmshWriter = new tbox::GmshExport(msh); - gmshLoader->load(std::string("strates.msh"), -1); - - auto pbl = std::make_shared<waves::Problem>(msh); - - waves::ForwardEuler scheme(pbl); - scheme.start(gmshWriter); - - delete gmshLoader; - delete gmshWriter; - - return 0; -} diff --git a/waves/models/__init__.py b/waves/models/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/waves/models/cube.geo b/waves/models/cube.geo deleted file mode 100644 index 506ab0fd..00000000 --- a/waves/models/cube.geo +++ /dev/null @@ -1,50 +0,0 @@ -// a cube meshed with hex - - -DefineConstant[ Lx = { 1, Min 5, Max 20, Step 1, Name "Lengths/Lx" } ]; -DefineConstant[ Ly = { 1, Min 5, Max 20, Step 1, Name "Lengths/Ly" } ]; -DefineConstant[ Lz = { 1, Min 1, Max 2, Step 1, Name "Lengths/Lz" } ]; - -DefineConstant[ Nx = { 1, Min 1, Max 200, Step 10, Name "Mesh/Nx" } ]; -DefineConstant[ Ny = { 1, Min 1, Max 200, Step 10, Name "Mesh/Ny" } ]; -DefineConstant[ Nz = { 1, Min 1, Max 200, Step 10, Name "Mesh/Nz" } ]; - -lc = 1; // useless -Point(1) = { 0, 0, 0, lc}; -Point(2) = { Lx, 0, 0, lc}; -Point(3) = { Lx, Ly, 0, lc}; -Point(4) = { 0, Ly, 0, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 1}; - -Line Loop(5) = {1, 2, 3, 4}; - -Plane Surface(6) = {5}; - -Transfinite Line {1, 3} = Nx+1 Using Progression 1; -Transfinite Line {4, 2} = Ny+1 Using Progression 1; - -Transfinite Surface {6}; -Recombine Surface {6}; -Extrude {0, 0, Lz} { - Surface{6}; Layers{Nz}; Recombine; -} -Physical Volume("Volume") = {1}; - -Physical Surface("FaceZ0") = {6}; -Physical Surface("FaceZ1") = {28}; -Physical Surface("FaceY0") = {15}; -Physical Surface("FaceX1") = {19}; -Physical Surface("FaceY1") = {23}; -Physical Surface("FaceX0") = {27}; - -Physical Line("Line1") = {13}; -Physical Line("Line2") = {14}; -Physical Line("Line3") = {18}; -Physical Line("Line4") = {22}; - - - diff --git a/waves/models/cube2mat.geo b/waves/models/cube2mat.geo deleted file mode 100644 index 43d32239..00000000 --- a/waves/models/cube2mat.geo +++ /dev/null @@ -1,73 +0,0 @@ -// 2 materiaux - - -DefineConstant[ Lx = { 1, Min 5, Max 20, Step 1, Name "Lengths/Lx" } ]; -DefineConstant[ Ly1 = { 1, Min 5, Max 20, Step 1, Name "Lengths/Ly1" } ]; -DefineConstant[ Ly2 = { 1, Min 5, Max 20, Step 1, Name "Lengths/Ly2" } ]; -DefineConstant[ Lz = { 1, Min 1, Max 2, Step 1, Name "Lengths/Lz" } ]; - -DefineConstant[ Nx = { 1, Min 1, Max 200, Step 10, Name "Mesh/Nx" } ]; -DefineConstant[ Ny1 = { 1, Min 1, Max 200, Step 10, Name "Mesh/Ny1" } ]; -DefineConstant[ Ny2 = { 1, Min 1, Max 200, Step 10, Name "Mesh/Ny2" } ]; -DefineConstant[ Nz = { 1, Min 1, Max 200, Step 10, Name "Mesh/Nz" } ]; - -lc = Lx/Nx; // useless - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { Lx, 0, 0, lc}; -Point(3) = { Lx, Ly1+Ly2, 0, lc}; -Point(4) = { 0, Ly1+Ly2, 0, lc}; - -Point(5) = { 0, Ly1, 0, lc}; -Point(6) = { Lx, Ly2, 0, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 6}; -Line(3) = {6, 5}; -Line(4) = {5, 1}; -Line(5) = {5, 4}; -Line(6) = {4, 3}; -Line(7) = {3, 6}; - - - -Line Loop(8) = {6, 7, 3, 5}; -Plane Surface(9) = {8}; -Line Loop(10) = {1, 2, 3, 4}; -Plane Surface(11) = {10}; - -// --- -Transfinite Line {1, 3, 6} = Nx-1 Using Progression 1; -Transfinite Line {2, 4} = Ny1-1 Using Progression 1; -Transfinite Line {7, 5} = Ny2-1 Using Progression 1; -Transfinite Surface {9}; -Transfinite Surface {11}; -// --- - -Recombine Surface {9}; -Recombine Surface {11}; - -Extrude {0, 0, Lz} { - Surface{9}; Layers{Nz}; Recombine; -} -Extrude {0, 0, Lz} { - Surface{11}; Layers{Nz}; Recombine; -} - - -Physical Volume("Volume1") = {2}; -Physical Volume("Volume2") = {1}; - - -Physical Surface("FaceY0") = {42}; -Physical Surface("FaceX1_1") = {46}; -Physical Surface("FaceX1_2") = {24}; -Physical Surface("FaceY1") = {20}; -Physical Surface("FaceX0_1") = {54}; -Physical Surface("FaceX0_2") = {32}; - - - -Physical Line("Line1") = {40}; - - diff --git a/waves/models/plane1mat.py b/waves/models/plane1mat.py deleted file mode 100755 index 8f1daf1e..00000000 --- a/waves/models/plane1mat.py +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# Simple 2D wave-propagation test in 1 material - -import waves as w -import tbox -import tbox.gmsh as gmsh -import waves.srcs as srcs -import waves.utils as u - - -def model(p={}): - # configure/build mesh - pars = {'Lx': p['Lx'], 'Ly': p['Ly'], 'Nx': p['Nx'], 'Ny': p['Ny']} - msh = gmsh.MeshLoader("cube.geo", __file__).execute(**pars) - gmshWriter = tbox.GmshExport(msh) - pbl = w.Problem(msh) - - # compute time-step size - Lex = p['Lx'] / p['Nx'] - Ley = p['Ly'] / p['Ny'] - dt = min(Lex, Ley) / p['c'] / 10 * 2 - - pbl.add(w.Medium(msh, "Volume", p['c'])) - - if p['bc'] == 'sinsrc': # source dans le coin inf gauche - pbl.add(srcs.SinSource(msh, "Line1", p['freq'])) - pbl.add(w.Boundary(msh, "FaceX1", p['c'])) - pbl.add(w.Boundary(msh, "FaceY1", p['c'])) - - elif p['bc'] == 'planewave': # onde plane de bas en haut - pbl.add(srcs.SinSource(msh, "FaceX0", p['freq'])) - pbl.add(w.Boundary(msh, "FaceX1", p['c'])) - - elif p['bc'] == 'interf1': # interférence de 2 srcs sur la frontière basse - s = srcs.MultiSource(msh, "FaceY0") - s.addSource(tbox.Vector3d(3, 0, 0), p['freq'] / 2) - s.addSource(tbox.Vector3d(7, 0, 0), p['freq']) - pbl.add(s) - pbl.add(w.Boundary(msh, "FaceX0", p['c'])) - pbl.add(w.Boundary(msh, "FaceX1", p['c'])) - pbl.add(w.Boundary(msh, "FaceY1", p['c'])) - - elif p['bc'] == 'pulse': # un pulse qui part du coin inf gauche - pbl.add( - srcs.PulseSource(msh, "Line1", p['freq'], shift=0.3, width=100.0)) - pbl.add(w.Boundary(msh, "FaceX1", p['c'])) - pbl.add(w.Boundary(msh, "FaceY1", p['c'])) - - elif p['bc'] == 'interf2': # 2 sources non synchrones au centre du domaine - s = srcs.MultiSource(msh, "Volume") - s.addSource(tbox.Vector3d(3 * p['Lx'] / 10, p['Ly'] / 2, 0), p['freq']) - s.addSource( - tbox.Vector3d(7 * p['Lx'] / 10, p['Ly'] / 2, 0), 1.05 * p['freq']) - #pbl.add(s.__disown__()) - pbl.add(s) - pbl.add(w.Boundary(msh, "FaceX0", p['c'])) - pbl.add(w.Boundary(msh, "FaceX1", p['c'])) - pbl.add(w.Boundary(msh, "FaceY0", p['c'])) - pbl.add(w.Boundary(msh, "FaceY1", p['c'])) - else: - raise Exception('Unknown BC type (%s)' % p['bc']) - - scheme = w.ForwardEuler(pbl) - #scheme.wgmsh = w.Wgmsh_WG_ALL # write .pos files - scheme.ttot = p['ttot'] - scheme.dt = dt - scheme.savefreq = 5 - return scheme, gmshWriter - - -def runmodel(**d): - p = {} - p['bc'] = 'interf2' - p['ttot'] = 1.0 - p['Lx'] = 10.0 - p['Ly'] = 10.0 - p['Nx'] = 50 - p['Ny'] = 50 - p['c'] = 10.0 - p['freq'] = 10.0 - p.update(d) - - scheme, writer = model(p) - u.integrate(scheme, writer) - - -if __name__ == "__main__": - runmodel() diff --git a/waves/models/plane2mat.py b/waves/models/plane2mat.py deleted file mode 100755 index 693a9cc4..00000000 --- a/waves/models/plane2mat.py +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# Simple 2D wave-propagation test in 2 materials - -import waves as w -import tbox -import tbox.gmsh as gmsh -import waves.srcs as srcs -import waves.utils as u - - -def model(p={}): - # configure/build mesh - pars = { - 'Lx': p['Lx'], - 'Ly1': p['Ly1'], - 'Ly2': p['Ly2'], - 'Nx': p['Nx'], - 'Ny1': p['Ny1'], - 'Ny2': p['Ny2'] - } - msh = gmsh.MeshLoader("cube2mat.geo", __file__).execute(**pars) - gmshWriter = tbox.GmshExport(msh) - pbl = w.Problem(msh) - - # compute time-step size - Lex = float(p['Lx']) / p['Nx'] - Ley1 = float(p['Ly1']) / p['Ny1'] - Ley2 = float(p['Ly2']) / p['Ny2'] - dt1 = min(Lex, Ley1) / p['c1'] - dt2 = min(Lex, Ley2) / p['c2'] - dt = min(dt1, dt2) * 0.8 - #lam = maxc / p['freq'] - - pbl.add(w.Medium(msh, "Volume1", p['c1'])) - pbl.add(w.Medium(msh, "Volume2", p['c2'])) - - if p['bc'] == 'sinsrc': # source de bas en haut - pbl.add(srcs.SinSource(msh, "FaceY0", p['freq'])) - pbl.add(w.Boundary(msh, "FaceY1", p['c2'])) - pbl.add(w.Boundary(msh, "FaceY0", p['c1'])) - - elif p['bc'] == 'interf1': # interference de 2 sources sur la frontière basse - s = srcs.MultiSource(msh, "FaceY0") - s.addSource(tbox.Vector3d(3, 0, 0), p['freq'] / 2) - s.addSource(tbox.Vector3d(7, 0, 0), 2 * p['freq']) - pbl.add(s) - pbl.add(w.Boundary(msh, "FaceX0_1", p['c1'])) - pbl.add(w.Boundary(msh, "FaceX0_2", p['c2'])) - pbl.add(w.Boundary(msh, "FaceX1_1", p['c1'])) - pbl.add(w.Boundary(msh, "FaceX1_2", p['c2'])) - pbl.add(w.Boundary(msh, "FaceY1", p['c2'])) - - elif p['bc'] == 'pulse': # un pulse qui part du coin inf gauche - pbl.add( - srcs.PulseSource(msh, "FaceY0", p['freq'], shift=0.3, width=200.0)) - #pbl.add(w.Boundary(msh, "FaceX0_1", p['c1'])) - #pbl.add(w.Boundary(msh, "FaceX0_2", p['c2'])) - #pbl.add(w.Boundary(msh, "FaceX1_1", p['c1'])) - #pbl.add(w.Boundary(msh, "FaceX1_2", p['c2'])) - pbl.add(w.Boundary(msh, "FaceY1", p['c2'])) - pbl.add(w.Boundary(msh, "FaceY0", p['c1'])) - - elif p['bc'] == 'reflex': # réflexion/réfraction (Bulthuis) - pbl.add(srcs.SinSource(msh, "Line1", p['freq'])) - #pbl.add(w.Boundary(msh, "FaceX0_1", p['c1'])) - #pbl.add(w.Boundary(msh, "FaceX0_2", p['c2'])) - pbl.add(w.Boundary(msh, "FaceX1_1", p['c1'])) - pbl.add(w.Boundary(msh, "FaceX1_2", p['c2'])) - pbl.add(w.Boundary(msh, "FaceY1", p['c2'])) - #pbl.add(w.Boundary(msh, "FaceY0", p['c1'])) - else: - raise Exception('Unknown BC type (%s)' % p['bc']) - - scheme = w.ForwardEuler(pbl) - #scheme.wgmsh = w.Wgmsh_WG_ALL # write .pos files - scheme.ttot = p['ttot'] - scheme.dt = dt - scheme.savefreq = 5 - - return scheme, gmshWriter - - -def runmodel(**d): - p = {} - p['bc'] = 'reflex' - p['ttot'] = 1.0 - p['Lx'] = 10.0 - p['Ly1'] = 5.0 - p['Ly2'] = 5.0 - p['Nx'] = 100 - p['Ny1'] = 50 - p['Ny2'] = 50 - p['c1'] = 10.0 - p['c2'] = 20.0 - p['freq'] = 10.0 - p.update(d) - - scheme, writer = model(p) - u.integrate(scheme, writer) - - -if __name__ == "__main__": - runmodel() diff --git a/waves/src/CMakeLists.txt b/waves/src/CMakeLists.txt deleted file mode 100644 index e281b8ac..00000000 --- a/waves/src/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# CMake input file of waves.so - -FILE(GLOB SRCS *.h *.cpp *.inl *.hpp) - -ADD_LIBRARY(waves SHARED ${SRCS}) -MACRO_DebugPostfix(waves) -TARGET_INCLUDE_DIRECTORIES(waves PUBLIC ${PROJECT_SOURCE_DIR}/waves/src) - -TARGET_LINK_LIBRARIES(waves tbox fwk) - -INSTALL(TARGETS waves DESTINATION ${CMAKE_INSTALL_PREFIX}) - -SOURCE_GROUP(base REGULAR_EXPRESSION ".*\\.(cpp|inl|hpp|h)") -SOURCE_GROUP(schemes REGULAR_EXPRESSION ".+(TimeIntegration|Runge|Euler|Newmark).+") diff --git a/waves/src/wBoundary.cpp b/waves/src/wBoundary.cpp deleted file mode 100644 index 52238cac..00000000 --- a/waves/src/wBoundary.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wBoundary.h" -#include "wProblem.h" -#include "wTag.h" -using namespace waves; - -Boundary::Boundary(std::shared_ptr<MshData> _msh, int no, double _c) : Group(_msh, no), c(_c) -{ - //pbl.bnds.push_back(this); -} - -Boundary::Boundary(std::shared_ptr<MshData> _msh, std::string const &name, double _c) : Group(_msh, name), c(_c) -{ - //pbl.bnds.push_back(this); -} - -void Boundary::write(std::ostream &out) const -{ - out << "Boundary on " << *tag; -} diff --git a/waves/src/wBoundary.h b/waves/src/wBoundary.h deleted file mode 100644 index 98ef337e..00000000 --- a/waves/src/wBoundary.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WBOUNDARY_H -#define WBOUNDARY_H - -#include "waves.h" -#include "wGroup.h" - -using namespace tbox; - -namespace waves -{ - -/** - * @brief boundaries which requires a special treatment - */ - -class WAVES_API Boundary : public Group -{ -public: - double c; - Boundary(std::shared_ptr<MshData> _msh, int no, double _c); - Boundary(std::shared_ptr<MshData> _msh, std::string const &name, double _c); - virtual ~Boundary() { std::cout << "~Boundary()\n"; } - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; -} // namespace waves - -#endif //WBOUNDARY_H diff --git a/waves/src/wDisplayHook.cpp b/waves/src/wDisplayHook.cpp deleted file mode 100644 index 432f096f..00000000 --- a/waves/src/wDisplayHook.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wDisplayHook.h" - -using namespace waves; - -DisplayHook::DisplayHook() -{ -} - -void DisplayHook::display(int nt, double t, std::vector<double> &u) -{ - std::cout << "DisplayHook::display()\n"; -} - -void DisplayHook::refresh() -{ - std::cout << "DisplayHook::refresh()\n"; -} diff --git a/waves/src/wDisplayHook.h b/waves/src/wDisplayHook.h deleted file mode 100644 index 859859da..00000000 --- a/waves/src/wDisplayHook.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WDISPLAYHOOK_H -#define WDISPLAYHOOK_H - -#include "waves.h" -#include "wObject.h" -#include <vector> - -namespace waves -{ - -/** - * @brief quad element - */ - -class WAVES_API DisplayHook : public fwk::wObject -{ -public: - DisplayHook(); - virtual void display(int nt, double t, std::vector<double> &u); - virtual void refresh(); -}; - -} // namespace waves - -#endif //WDISPLAYHOOK_H diff --git a/waves/src/wForwardEuler.cpp b/waves/src/wForwardEuler.cpp deleted file mode 100644 index 9efb91b8..00000000 --- a/waves/src/wForwardEuler.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wForwardEuler.h" -#include "wMshData.h" -#include "wNode.h" -#include "wElement.h" -#include "wTimer.h" -#include "wTag.h" -#include "wProblem.h" -#include "wDisplayHook.h" -#include "wSource.h" -#include "wResults.h" -#include "wMshExport.h" -using namespace tbox; -using namespace waves; - -ForwardEuler::ForwardEuler(std::shared_ptr<waves::Problem> _pbl) : TimeIntegration(_pbl) -{ -} - -void ForwardEuler::start(MshExport *mshWriter) -{ - std::cout << *this; - chrono1.start(); - - auto msh = pbl->msh; - u1.resize(msh->nodes.size()); - v1.resize(msh->nodes.size()); - Eigen::Map<Eigen::VectorXd> u1_(u1.data(), u1.size()), v1_(v1.data(), v1.size()); - - // matrix assembly - Eigen::SparseMatrix<double, Eigen::RowMajor> K(msh->nodes.size(), msh->nodes.size()); - std::vector<double> Md(msh->nodes.size()); - Eigen::Map<Eigen::VectorXd> Md_(Md.data(), Md.size()); - buildKM(K, Md, u1); - - Eigen::SparseMatrix<double, Eigen::RowMajor> S(msh->nodes.size(), msh->nodes.size()); - buildS(S); - - // setup results - Results results; - results.scalars_at_nodes["u"] = &u1; - //results.scalars_at_nodes["v"] = &v1; - - // time integration - - std::cout << "\n\nTime integration...\n"; - std::cout << *this << '\n'; - - double t = 0.0; - int nt = 1; - results.nt = nt; - results.time = t; - - while (t < ttot && !stopit) - { - //if(verbose) std::cout << "nt " << nt << " t=" << t << "\n"; - if (verbose) - std::cout << "nt " << nt << " t=" << t << " stopit=" << stopit << "\n"; - - //std::for_each(msh->srcs.begin(), msh->srcs.end(), [&](Source *s) { s->apply(t, u1); }); - for (auto s : pbl->srcs) - s->apply(t, u1); - - t += dt; - nt++; - - // equation #1 - u1_ += v1_ * dt; // u1 = u0 + dt*v0 - - for (auto s : pbl->srcs) - s->apply(t, u1); - - // equation #2 - v1_.array() -= dt * (K * u1_ + S * v1_).array() / Md_.array(); - - if (nt % savefreq == 0) - { - //std::cout << "nt " << nt << " t=" << t << "\n"; - results.time = t; - if (wgmsh == Wgmsh::WG_ONE) - { - results.nt++; - mshWriter->save("res", results); - } - else if (wgmsh == Wgmsh::WG_ALL) - { - results.nt++; - char filename[256]; - sprintf(filename, "res_%06d", nt); - mshWriter->save(filename, results); - } - if (dhook) - dhook->display(nt, t, u1); - } - if (dhook) - dhook->refresh(); - } - - chrono1.stop(); - std::cout << "[cpu] " << chrono1 << '\n'; -} diff --git a/waves/src/wForwardEuler.h b/waves/src/wForwardEuler.h deleted file mode 100644 index 1be5443b..00000000 --- a/waves/src/wForwardEuler.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WFORWARDEULER_H -#define WFORWARDEULER_H - -#include "waves.h" -#include "wTimeIntegration.h" - -namespace waves -{ - -/** - * @brief simple explicit Forward Euler time integration - */ - -class WAVES_API ForwardEuler : public TimeIntegration -{ -public: - ForwardEuler(std::shared_ptr<Problem> _pbl); - virtual ~ForwardEuler() { std::cout << "~ForwardEuler()\n"; } - - virtual void start(tbox::MshExport *mshWriter) override; - virtual char const *clsname() const override { return "ForwardEuler"; } -}; - -} // namespace waves - -#endif //WFORWARDEULER_H diff --git a/waves/src/wMedium.cpp b/waves/src/wMedium.cpp deleted file mode 100644 index af87497c..00000000 --- a/waves/src/wMedium.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wMedium.h" -#include "wProblem.h" -#include "wTag.h" -using namespace waves; - -Medium::Medium(std::shared_ptr<MshData> _msh, int no, double _c) : Group(_msh, no), c(_c) -{ - //pbl.media.push_back(this); -} - -Medium::Medium(std::shared_ptr<MshData> _msh, std::string const &name, double _c) : Group(_msh, name), c(_c) -{ - //pbl.media.push_back(this); -} - -void Medium::write(std::ostream &out) const -{ - out << "Medium on " << *tag << " with c=" << this->c; -} diff --git a/waves/src/wMedium.h b/waves/src/wMedium.h deleted file mode 100644 index a3e370af..00000000 --- a/waves/src/wMedium.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WMEDIUM_H -#define WMEDIUM_H - -#include "waves.h" -#include "wGroup.h" - -using namespace tbox; - -namespace waves -{ - -/** - * @brief a medium (with a speed of wave) - * @todo c => Fct (cfr heat) - */ - -class WAVES_API Medium : public Group -{ -public: - double c; - Medium(std::shared_ptr<MshData> _msh, int no, double _c); - Medium(std::shared_ptr<MshData> _msh, std::string const &name, double _c); - virtual ~Medium() { std::cout << "~Medium()\n"; } - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; -} // namespace waves - -#endif //WMEDIUM_H diff --git a/waves/src/wNewmark.cpp b/waves/src/wNewmark.cpp deleted file mode 100644 index 91952128..00000000 --- a/waves/src/wNewmark.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wNewmark.h" -#include "wMshData.h" -#include "wNode.h" -#include "wElement.h" -#include "wTimer.h" -#include "wTag.h" -#include "wProblem.h" -#include "wDisplayHook.h" -#include "wSource.h" -#include "wResults.h" -#include "wMshExport.h" -using namespace tbox; -using namespace waves; - -Newmark::Newmark(std::shared_ptr<waves::Problem> _pbl) : TimeIntegration(_pbl) -{ - gamma = 0.5; - beta = 0.25; -} - -void Newmark::start(MshExport *mshWriter) -{ - std::cout << *this; - chrono1.start(); - - auto msh = pbl->msh; - u1.resize(msh->nodes.size()); - v1.resize(msh->nodes.size()); - Eigen::Map<Eigen::VectorXd> u1_(u1.data(), u1.size()), v1_(v1.data(), v1.size()); - - // matrix assembly - Eigen::SparseMatrix<double, Eigen::RowMajor> K(msh->nodes.size(), msh->nodes.size()); - std::vector<double> Md(msh->nodes.size()); - Eigen::Map<Eigen::VectorXd> Md_(Md.data(), Md.size()); - buildKM(K, Md, u1); - - Eigen::SparseMatrix<double, Eigen::RowMajor> S(msh->nodes.size(), msh->nodes.size()); - buildS(S); - - // setup results - Results results; - results.scalars_at_nodes["u"] = &u1; - //results.scalars_at_nodes["v"] = &v1; - - // time integration - - std::cout << "\n\nTime integration...\n"; - std::cout << *this << '\n'; - - double t = 0.0; - int nt = 1; - results.nt = nt; - results.time = t; - - while (t < ttot && !stopit) - { - if (verbose) - std::cout << "nt " << nt << " t=" << t << "\n"; - - for (auto s : pbl->srcs) - s->apply(t, u1); - - t += dt; - nt++; - - // equation #1 - u1_ += v1_ * dt; // u1 = u0 + dt*v0 - - for (auto s : pbl->srcs) - s->apply(t, u1); - - // equation #2 - v1_.array() -= dt * (K * u1_ + S * v1_).array() / Md_.array(); - - if (nt % savefreq == 0) - { - //std::cout << "nt " << nt << " t=" << t << "\n"; - results.time = t; - results.nt++; - //mshWriter->save("res", results); - - if (dhook) - dhook->display(nt, t, u1); - } - if (dhook) - dhook->refresh(); - } - - chrono1.stop(); - std::cout << "[cpu] " << chrono1 << '\n'; -} diff --git a/waves/src/wNewmark.h b/waves/src/wNewmark.h deleted file mode 100644 index b03d5808..00000000 --- a/waves/src/wNewmark.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WNEWMARK_H -#define WNEWMARK_H - -#include "waves.h" -#include "wTimeIntegration.h" - -namespace waves -{ - -/** - * @brief implicit Newmark - */ - -class WAVES_API Newmark : public TimeIntegration -{ -public: - double gamma; - double beta; - - Newmark(std::shared_ptr<Problem> _pbl); - virtual ~Newmark() { std::cout << "~Newmark()\n"; } - - virtual void start(tbox::MshExport *mshWriter) override; - virtual char const *clsname() const override { return "Newmark"; } -}; - -} // namespace waves - -#endif //WNEWMARK_H diff --git a/waves/src/wProblem.cpp b/waves/src/wProblem.cpp deleted file mode 100644 index f5effcb2..00000000 --- a/waves/src/wProblem.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wProblem.h" -#include "wMshData.h" -#include "wSource.h" -#include "wMedium.h" -#include "wBoundary.h" -#include "wElement.h" - -#include "wTag.h" -using namespace waves; - -Problem::Problem(std::shared_ptr<MshData> _msh) : msh(_msh) -{ -} - -Problem::~Problem() -{ - std::cout << "~Problem()\n"; - std::cout << "\tstill " << srcs.size() << " source(s) remaining.\n"; - for (auto s : srcs) - std::cout << "\t\t" << *s << " (use_count=" << s.use_count() << ")\n"; -} - -/** - * @brief Initialize the elements precomputed values - */ -void Problem::initElems() -{ - // Update volume Jacobian - for (auto vol : media) - for (auto e : vol->tag->elems) - e->initValues(true); - // Update surface Jacobian (Neumann B.C.) - for (auto surf : bnds) - for (auto e : surf->tag->elems) - e->initValues(false); -} - -void Problem::write(std::ostream &out) const -{ - out << "waves::Problem:\n"; - out << " + mesh:\n"; - out << *msh; - out << " + sources:\n"; - for (auto s : srcs) - out << *s << '\n'; - out << " + media:\n"; - for (auto m : media) - out << *m << '\n'; - out << " + boundaries:\n"; - for (auto b : bnds) - out << *b << '\n'; -} diff --git a/waves/src/wProblem.h b/waves/src/wProblem.h deleted file mode 100644 index adff43b5..00000000 --- a/waves/src/wProblem.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WPROBLEM_H -#define WPROBLEM_H - -#include "waves.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <memory> - -using namespace tbox; - -namespace waves -{ - -/** - * @brief main wave Problem object - */ - -class WAVES_API Problem : public fwk::wSharedObject -{ -public: - std::shared_ptr<MshData> msh; -#ifndef SWIG - std::vector<std::shared_ptr<Source>> srcs; - std::vector<std::shared_ptr<Medium>> media; - std::vector<std::shared_ptr<Boundary>> bnds; -#endif - Problem(std::shared_ptr<MshData> _msh); - virtual ~Problem(); - - void add(std::shared_ptr<Source> s) { srcs.push_back(s); } - void add(std::shared_ptr<Medium> m) { media.push_back(m); } - void add(std::shared_ptr<Boundary> b) { bnds.push_back(b); } - -#ifndef SWIG - void initElems(); - virtual void write(std::ostream &out) const override; -#endif -}; -} // namespace waves - -#endif //WPROBLEM_H diff --git a/waves/src/wRungeKutta.cpp b/waves/src/wRungeKutta.cpp deleted file mode 100644 index 75e9baf2..00000000 --- a/waves/src/wRungeKutta.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wRungeKutta.h" -#include "wMshData.h" -#include "wNode.h" -#include "wElement.h" -#include "wTimer.h" -#include "wTag.h" -#include "wProblem.h" -#include "wDisplayHook.h" -#include "wSource.h" -#include "wResults.h" -#include "wMshExport.h" -using namespace tbox; -using namespace waves; - -RungeKutta::RungeKutta(std::shared_ptr<waves::Problem> _pbl) : TimeIntegration(_pbl) -{ -} - -void RungeKutta::start(MshExport *mshWriter) -{ - std::cout << *this; - chrono1.start(); - - auto msh = pbl->msh; - u1.resize(msh->nodes.size()); - v1.resize(msh->nodes.size()); - - // matrix assembly - Eigen::SparseMatrix<double, Eigen::RowMajor> K(msh->nodes.size(), msh->nodes.size()); - std::vector<double> Md(msh->nodes.size()); - buildKM(K, Md, u1); - - Eigen::SparseMatrix<double, Eigen::RowMajor> S(msh->nodes.size(), msh->nodes.size()); - buildS(S); - - // setup results - Results results; - results.scalars_at_nodes["u"] = &u1; - //results.scalars_at_nodes["v"] = &v1; - - // time integration - - std::cout << "\n\nTime integration...\n"; - std::cout << *this << '\n'; - - std::vector<double> tmp1(msh->nodes.size()), tmp2(msh->nodes.size()); - double t = 0.0; - int nt = 1; - results.nt = nt; - results.time = t; - - std::vector<double> up1(msh->nodes.size()); - std::vector<double> vp1(msh->nodes.size()); - std::vector<double> up2(msh->nodes.size()); - std::vector<double> vp2(msh->nodes.size()); - std::vector<double> up3(msh->nodes.size()); - std::vector<double> vp3(msh->nodes.size()); - - std::vector<double> u2(msh->nodes.size()); - std::vector<double> v2(msh->nodes.size()); - - //Node *snod = msh->ntags["Source Point"]->elems[0]->nodes[0]; - - while (t < ttot) - { - std::cout << "nt " << nt << " t=" << t << "\n"; - - //u1[snod->row] = sin(2*M_PI*20*t); // BC - //if(source) source->apply(t, u1); - std::for_each(pbl->srcs.begin(), pbl->srcs.end(), [&](std::shared_ptr<Source> s) { s->apply(t, u1); }); - - t += dt; - nt++; - - predictor(up1, vp1, u1, v1, u1, v1, dt, Md, K, S, 1.0, t); - predictor(up2, vp2, up1, vp1, u1, v1, dt, Md, K, S, 1.0, t); - predictor(up3, vp3, up2, vp2, u1, v1, dt, Md, K, S, 1.0, t); - - predictor(u2, v2, u1, v1, u1, v1, dt, Md, K, S, 1. / 2., t); - predictor(u1, v1, up1, vp1, u2, v2, dt, Md, K, S, 1. / 3., t); - predictor(u2, v2, up2, vp2, u1, v1, dt, Md, K, S, 1. / 8., t); - predictor(u1, v1, up3, vp3, u2, v2, dt, Md, K, S, 1. / 24., t); - - //u1[snod->row] = sin(2*M_PI*20*t); //BC bis - //if(source) source->apply(t, u1); - std::for_each(pbl->srcs.begin(), pbl->srcs.end(), [&](std::shared_ptr<Source> s) { s->apply(t, u1); }); - - if (nt % savefreq == 0) - { - //std::cout << "nt " << nt << " t=" << t << "\n"; - results.time = t; - results.nt++; - //mshWriter->save("res", results); - - if (dhook) - dhook->display(nt, t, u1); - } - if (dhook) - dhook->refresh(); - } - - chrono1.stop(); - std::cout << "[cpu] " << chrono1 << '\n'; -} - -void RungeKutta::predictor(std::vector<double> &up2, std::vector<double> &vp2, // premier membre - std::vector<double> &up1, std::vector<double> &vp1, // predicteur - std::vector<double> &u0, std::vector<double> &v0, // sol au temps precedent - double dt, - std::vector<double> &Md, - Eigen::SparseMatrix<double, Eigen::RowMajor> &K, - Eigen::SparseMatrix<double, Eigen::RowMajor> &S, double ak, double t) -{ - // Define maps - Eigen::Map<Eigen::VectorXd> u0_(u0.data(), u0.size()), v0_(v0.data(), v0.size()), up1_(up1.data(), up1.size()), vp1_(vp1.data(), vp1.size()), up2_(up2.data(), up2.size()), vp2_(vp2.data(), vp2.size()), Md_(Md.data(), Md.size()); - // equation #1 - up2_ = u0_ + vp1_ * ak * dt; - - //up2[snod->row] = sin(2*M_PI*20*t); //BC bis - //if(source) source->apply(t, up2); - - std::for_each(pbl->srcs.begin(), pbl->srcs.end(), [&](std::shared_ptr<Source> s) { s->apply(t, up2); }); - - // equation #2 - vp2_.array() = v0_.array() - ak * dt * (K * up1_ + S * vp1_).array() / Md_.array(); -} diff --git a/waves/src/wRungeKutta.h b/waves/src/wRungeKutta.h deleted file mode 100644 index e79690fd..00000000 --- a/waves/src/wRungeKutta.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WRUNGEKUTTA_H -#define WRUNGEKUTTA_H - -#include "waves.h" -#include "wTimeIntegration.h" -#include <Eigen/Sparse> -#include <vector> -#include <iostream> - -namespace waves -{ - -/** - * @brief explicit Runge Kutta time integration - */ - -class WAVES_API RungeKutta : public TimeIntegration -{ -public: - RungeKutta(std::shared_ptr<Problem> _pbl); - virtual ~RungeKutta() { std::cout << "~RungeKutta()\n"; } - virtual char const *clsname() const override { return "RungeKutta"; } - - virtual void start(tbox::MshExport *mshWriter) override; - -private: - void predictor(std::vector<double> &up2, std::vector<double> &vp2, // premier membre - std::vector<double> &up1, std::vector<double> &vp1, // predicteur - std::vector<double> &u0, std::vector<double> &v0, // sol au temps precedent - double dt, - std::vector<double> &Md, - Eigen::SparseMatrix<double, Eigen::RowMajor> &K, - Eigen::SparseMatrix<double, Eigen::RowMajor> &S, double ak, double t); -}; - -} // namespace waves - -#endif //WRUNGEKUTTA_H diff --git a/waves/src/wSource.cpp b/waves/src/wSource.cpp deleted file mode 100644 index 595eea55..00000000 --- a/waves/src/wSource.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wSource.h" -#include "wProblem.h" -#include "wTag.h" -#include "wElement.h" -#include "wNode.h" -#include <algorithm> -using namespace waves; - -Source::Source(std::shared_ptr<MshData> _msh, int no) : Group(_msh, no) -{ - for (auto e : tag->elems) - for (auto n : e->nodes) - nodes.push_back(n); - /* - std::for_each(tag->elems.begin(), tag->elems.end(), [&](Element *e) { - std::for_each(e->nodes.begin(), e->nodes.end(), [&](Node *n) { - nodes.push_back(n); - }); - }); -*/ - //pbl.srcs.push_back(this); -} - -Source::Source(std::shared_ptr<MshData> _msh, std::string const &name) : Group(_msh, name) -{ - for (auto e : tag->elems) - for (auto n : e->nodes) - nodes.push_back(n); - - //pbl.srcs.push_back(this); -} - -void Source::write(std::ostream &out) const -{ - out << "Source on " << *tag; - out << "(" << nodes.size() << " nodes)"; - //std::for_each(nodes.begin(), nodes.end(), [&](Node *n) { out << '\t' << *n << '\n'; }); - //for(auto n : nodes) { out << '\t' << *n << '\n'; } -} diff --git a/waves/src/wSource.h b/waves/src/wSource.h deleted file mode 100644 index 6ed54658..00000000 --- a/waves/src/wSource.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WSOURCE_H -#define WSOURCE_H - -#include "waves.h" -#include "wGroup.h" -#include <vector> -#include <string> - -using namespace tbox; - -namespace waves -{ - -/** - * @brief manage the sources - */ - -class WAVES_API Source : public Group -{ -public: - std::vector<Node *> nodes; - - Source(std::shared_ptr<MshData> _msh, int no); - Source(std::shared_ptr<MshData> _msh, std::string const &name); - virtual ~Source() { std::cout << "~Source()\n"; } - virtual void apply(double t, std::vector<double> &u) {} - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; -} // namespace waves - -#endif //WSOURCE_H diff --git a/waves/src/wTimeIntegration.cpp b/waves/src/wTimeIntegration.cpp deleted file mode 100644 index 7f13762b..00000000 --- a/waves/src/wTimeIntegration.cpp +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wTimeIntegration.h" -#include "wMshData.h" -#include "wNode.h" -#include "wElement.h" -#include "wQuad4.h" -#include "wTimer.h" -#include "wTag.h" -#include "wProblem.h" -#include "wMedium.h" -#include "wBoundary.h" -#include "wWaveTerm.h" -#include "wFct0.h" -#include "wMshExport.h" -#include <typeinfo> -#include <deque> - -#include <tbb/global_control.h> -#include <tbb/parallel_for_each.h> -#include <tbb/spin_mutex.h> -using namespace fwk; -using namespace tbox; -using namespace waves; - -TimeIntegration::TimeIntegration(std::shared_ptr<Problem> _pbl) : pbl(_pbl) -{ - dhook = NULL; - - // default values - ttot = 10.0; - dt = 1.0e-1 / 5; - savefreq = 5; - nthreads = 1; - wgmsh = Wgmsh::WG_NONE; - - verbose = false; - stopit = false; - - // Update element memory - pbl->initElems(); -} - -void TimeIntegration::start(MshExport *mshWriter) -{ -} - -void TimeIntegration::dummyIC() -{ - std::cout << "initial condition...\n"; - - auto msh = pbl->msh; - - // initial condition - for (auto nod : msh->nodes) - { - double px = nod->pos(0); - double py = nod->pos(1); - double pz = nod->pos(2); - double sx = 0.0; - double sy = 0.0; - double sz = 0.0; - double R = sqrt((px - sx) * (px - sx) + (py - sy) * (py - sy) + (pz - sz) * (pz - sz)); - if (R < 1.0) - { - u1[nod->row] = 0.0; - v1[nod->row] = 0.0; - } - else - { - u1[nod->row] = 0.0; - v1[nod->row] = 0.0; - } - } -} - -void TimeIntegration::buildS(Eigen::SparseMatrix<double, Eigen::RowMajor> &S2) -{ - tbb::spin_mutex mutex; - tbb::global_control control(tbb::global_control::max_allowed_parallelism, nthreads); - - auto msh = pbl->msh; - std::deque<Eigen::Triplet<double>> T; // list of triplets to build S matrix - - std::cout << "building S (TBB/lambda) using " << nthreads << " threads...\n"; - - for (auto bnd : pbl->bnds) - { - std::cout << "\tprocessing " << *bnd << '\n'; - std::cout << "normal=" << static_cast<Quad4 *>(bnd->tag->elems[0])->getNormal() << '\n'; - tbb::parallel_for_each(bnd->tag->elems.begin(), bnd->tag->elems.end(), [&](Element *e) { - if (e->type() != ElType::QUAD4) - return; - //std::cout << "processing element #" << e->no << "\n"; - - // ** Se matrix => S vector - Eigen::MatrixXd Se = WaveTerm::buildM(*e); - - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); - - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - for (size_t jj = 0; jj < e->nodes.size(); ++jj) - { - Node *nodj = e->nodes[jj]; - T.push_back(Eigen::Triplet<double>(nodi->row, nodj->row, bnd->c * Se(ii, jj))); - } - } - }); - } - // Build, clean and turn to compressed row format - S2.setFromTriplets(T.begin(), T.end()); - S2.prune(0.); - S2.makeCompressed(); - - std::cout << "S (" << S2.rows() << "," << S2.cols() << ") nnz=" << S2.nonZeros() << "\n"; - chrono1.read(); - std::cout << "[cpu] " << chrono1 << '\n'; -} - -void TimeIntegration::buildKM(Eigen::SparseMatrix<double, Eigen::RowMajor> &K2, - std::vector<double> &Md, std::vector<double> const &u) -{ - Timer chrono; - chrono.start(); - buildKM_tbb_lambda(K2, Md, u); - chrono.stop(); - std::cout << "[cpu:buildKM] " << chrono << '\n'; -} - -void TimeIntegration::buildKM_tbb_lambda(Eigen::SparseMatrix<double, Eigen::RowMajor> &K2, - std::vector<double> &Md, std::vector<double> const &u) -{ - tbb::spin_mutex mutex; - tbb::global_control control(tbb::global_control::max_allowed_parallelism, nthreads); - - auto msh = pbl->msh; - std::deque<Eigen::Triplet<double>> T; // list of triplets to build K matrix - - std::cout << "building K/M (TBB/lambda) using " << nthreads << " threads...\n"; - - for (auto mat : pbl->media) - { - std::cout << "\tprocessing " << *mat << '\n'; - tbb::parallel_for_each(mat->tag->elems.begin(), mat->tag->elems.end(), [&](Element *e) { - if (e->type() != ElType::HEX8) - return; - //std::cout << "processing element #" << e->no << "\n"; - - // ** Me matrix => Md vector - Eigen::MatrixXd Me = WaveTerm::buildM(*e); - - // ** Ke matrix => K matrix - Eigen::MatrixXd Ke = WaveTerm::buildK(*e, u); - - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); - - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - for (size_t jj = 0; jj < e->nodes.size(); ++jj) - { - Node *nodj = e->nodes[jj]; - T.push_back(Eigen::Triplet<double>(nodi->row, nodj->row, (mat->c * mat->c) * Ke(ii, jj))); - Md[nodi->row] += Me(ii, jj); - } - } - }); - } - // Build, clean and turn to compressed row format - K2.setFromTriplets(T.begin(), T.end()); - K2.prune(0.); - K2.makeCompressed(); - - std::cout << "S (" << K2.rows() << "," << K2.cols() << ") nnz=" << K2.nonZeros() << "\n"; - chrono1.read(); - std::cout << "[cpu] " << chrono1 << '\n'; -} - -/*void TimeIntegration::build(MATTYPE type, Eigen::SparseMatrix<double, Eigen::RowMajor> &A2) -{ - tbb::spin_mutex mutex; - tbb::global_control control(tbb::global_control::max_allowed_parallelism, nthreads); // TODO mettre ça ailleurs... - - auto msh = pbl->msh; - std::deque<Eigen::Triplet<double>> T; // list of triplets to build K matrix - - std::cout << "building " << type << " using " << nthreads << " threads...\n"; - - for (auto mat : pbl->media) - { - std::cout << "\tprocessing " << *mat << '\n'; - tbb::parallel_for_each(mat->tag->elems.begin(), mat->tag->elems.end(), - [&](Element *e) { - if (e->type() != ElType::HEX8) - return; - Eigen::MatrixXd Ae = e->build(type); - - // assembly - tbb::spin_mutex::scoped_lock lock(mutex); - for (size_t ii = 0; ii < e->nodes.size(); ++ii) - { - Node *nodi = e->nodes[ii]; - for (size_t jj = 0; jj < e->nodes.size(); ++jj) - { - Node *nodj = e->nodes[jj]; - T.push_back(Eigen::Triplet<double>(nodi->row, nodj->row, Ae(ii, jj))); - } - } - }); - } - // Build, clean and turn to compressed row format - A2.setFromTriplets(T.begin(), T.end()); - A2.prune(0.); - A2.makeCompressed(); - - std::cout << "S (" << A2.rows() << "," << A2.cols() << ") nnz=" << A2.nonZeros() << "\n"; - chrono1.read(); - std::cout << "[cpu] " << chrono1 << '\n'; -}*/ - -void TimeIntegration::write(std::ostream &out) const -{ - out << clsname() << "\n"; - out << "\tttot = " << ttot << "\n"; - out << "\tdt = " << dt << "\n"; - out << "\tsavefreq = " << savefreq << "\n"; -} diff --git a/waves/src/wTimeIntegration.h b/waves/src/wTimeIntegration.h deleted file mode 100644 index b47326b9..00000000 --- a/waves/src/wTimeIntegration.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WTIMEINTEGRATION_H -#define WTIMEINTEGRATION_H - -#include "waves.h" -#include "wObject.h" -#include "wTimer.h" -#include "wElement.h" -#include <iostream> -#include <vector> -#include <memory> -#include <Eigen/Sparse> - -namespace waves -{ - -enum class Wgmsh -{ - WG_NONE = 0, ///< do not write results on disk - WG_ONE = 1, ///< continuously overwrite the same result file (onelab) - WG_ALL = 2 ///< write a separate file for each archived step -}; - -/** - * @brief Time integration base class - */ - -class WAVES_API TimeIntegration : public fwk::wObject -{ -public: - bool verbose; - std::shared_ptr<Problem> pbl; -#ifndef SWIG - DisplayHook *dhook; -#endif - - bool stopit; - - int nthreads; ///< nb of threads for the assembly - Wgmsh wgmsh; ///< how to write results on disk? - - double ttot; ///< final time - double dt; ///< time step - int savefreq; ///< archive/update_gui frequency - - fwk::Timer chrono1; - - std::vector<double> u1; - std::vector<double> v1; - - TimeIntegration(std::shared_ptr<waves::Problem> _pbl); - - virtual char const *clsname() const { return "TimeIntegration"; } - - virtual void start(tbox::MshExport *mshWriter); - - void dummyIC(); - - void buildS(Eigen::SparseMatrix<double, Eigen::RowMajor> &S2); - - void buildKM(Eigen::SparseMatrix<double, Eigen::RowMajor> &K2, std::vector<double> &Md, std::vector<double> const &u); - void buildKM_tbb_lambda(Eigen::SparseMatrix<double, Eigen::RowMajor> &K2, std::vector<double> &Md, std::vector<double> const &u); - - void setGUI(DisplayHook &hook) { dhook = &hook; } - - //void build(tbox::MATTYPE type, Eigen::SparseMatrix<double, Eigen::RowMajor> &A2); - - void stop() { stopit = true; } - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -} // namespace waves - -#endif //WTIMEINTEGRATION_H diff --git a/waves/src/wWaveTerm.cpp b/waves/src/wWaveTerm.cpp deleted file mode 100644 index 6b92dbee..00000000 --- a/waves/src/wWaveTerm.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wWaveTerm.h" - -#include "wElement.h" -#include "wCache.h" -#include "wGauss.h" - -using namespace waves; -using namespace tbox; - -/** - * @brief Build volume stiffness matrix for the waves equation on one element - */ -Eigen::MatrixXd WaveTerm::buildK(Element const &e, std::vector<double> const &u) -{ - // Get precomputed values - Cache &cache = e.getVCache(); - Gauss &gauss = cache.getVGauss(); - - // Stiffness matrix - Eigen::MatrixXd K = Eigen::MatrixXd::Zero(e.nodes.size(), e.nodes.size()); - for (size_t k = 0; k < gauss.getN(); ++k) - { - // Jacobian inverse and shape functions - Eigen::Matrix3d const &J = e.getJinv(k); - Eigen::MatrixXd const &dff = cache.getDsf(k); - - // Elementary stiffness matrix - K += (J * dff).transpose() * J * dff * gauss.getW(k) * e.getDetJ(k); - } - return K; -} - -/** - * @brief Build volume/surface mass matrix for the waves equation on one element - */ -Eigen::MatrixXd WaveTerm::buildM(Element const &e) -{ - // Get precomputed values - Cache &cache = e.getVCache(); - Gauss &gauss = cache.getVGauss(); - - // Mass matrix - Eigen::MatrixXd M = Eigen::MatrixXd::Zero(e.nodes.size(), e.nodes.size()); - for (size_t k = 0; k < gauss.getN(); ++k) - { - // Shape functions - Eigen::VectorXd const &ff = cache.getSf(k); - M += ff * ff.transpose() * gauss.getW(k) * e.getDetJ(k); - } - return M; -} diff --git a/waves/src/wWaveTerm.h b/waves/src/wWaveTerm.h deleted file mode 100644 index 6ad3a384..00000000 --- a/waves/src/wWaveTerm.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WWAVETERM_H -#define WWAVETERM_H - -#include "waves.h" - -#include <vector> -#include <Eigen/Dense> - -namespace waves -{ - -/** - * @brief Formulation of wave terms - */ -class WAVES_API WaveTerm -{ -public: - // Stiffness matrix - static Eigen::MatrixXd buildK(tbox::Element const &e, std::vector<double> const &u); - // Mass matrix - static Eigen::MatrixXd buildM(tbox::Element const &e); -}; - -} // namespace waves -#endif //WWAVETERM_H diff --git a/waves/src/waves.h b/waves/src/waves.h deleted file mode 100644 index 46f05cca..00000000 --- a/waves/src/waves.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2022 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// global header of the waves module - -#ifndef WAVES_H -#define WAVES_H - -#if defined(WIN32) -#ifdef waves_EXPORTS -#define WAVES_API __declspec(dllexport) -#else -#define WAVES_API __declspec(dllimport) -#endif -#else -#define WAVES_API -#endif - -#include "tbox.h" - -namespace waves -{ -class Problem; -class Source; -class Medium; -class Boundary; - -class DisplayHook; - -class WaveTerm; - -class TimeIntegration; -class ForwardEuler; -class RungeKutta; -class Newmark; -} // namespace waves - -#endif //WAVES_H diff --git a/waves/srcs.py b/waves/srcs.py deleted file mode 100644 index 47a99501..00000000 --- a/waves/srcs.py +++ /dev/null @@ -1,86 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# custom sources coded with python - -import waves as w -import tbox -import math - - -class SinSource(w.Source): - def __init__(self, msh, num_or_name, freq): - w.Source.__init__(self, msh, num_or_name) - self.freq = freq - - def apply(self, t, u): - for n in self.nodes: # necessite %nothread swig::SwigPyIterator::~SwigPyIterator() dans le .i - u[n.row] = math.sin(2 * math.pi * self.freq * t) - - -class Src: - def __init__(self, nod, freq): - self.nod = nod - self.freq = freq -# def __del__(self): -# print "[Src] I'm dying..." - - -class MultiSource(w.Source): - def __init__(self, msh, num_or_name): - w.Source.__init__(self, msh, num_or_name) - - self.srcs = [] - - def apply(self, t, u): - for s in self.srcs: # necessite %nothread swig::SwigPyIterator::~SwigPyIterator() dans le .i - u[s.nod.row] = math.sin(2 * math.pi * s.freq * t) - - def addSource(self, p, freq): - dist = 1e10 - for n in self.nodes: - v = n.pos - p - v[2] = 0 - d = v.norm() - if d < dist: - dist = d - for n in self.nodes: - v = n.pos - p - v[2] = 0 - d = v.norm() - if abs(d - dist) < 1.0e-6: - print("node source selected at ", n) - print("dist", dist) - print("nod=", n) - self.srcs.append(Src(n, freq)) - - def __del__(self): - print("[MultiSource] I'm dying...") - - -class PulseSource(w.Source): - def __init__(self, msh, num_or_name, freq, shift, width): - w.Source.__init__(self, msh, num_or_name) - self.freq = freq - self.shift = shift - self.width = width - - def apply(self, t, u): - for n in self.nodes: - shift = 0.3 - u[n.row] = math.sin(2 * math.pi * self.freq * t) * math.exp( - -(t - self.shift) * (t - self.shift) * self.width) diff --git a/waves/tests/attic/bulthuis.geo b/waves/tests/attic/bulthuis.geo deleted file mode 100755 index 15180a74..00000000 --- a/waves/tests/attic/bulthuis.geo +++ /dev/null @@ -1,78 +0,0 @@ -/* ========================================================================= * - * - * MATH0471-A - * Projet de calcul scientifique multiphysique - * Domaine paramétrable pour résoudre l'équation d'onde. - * -/* ========================================================================= * - -/*-----------Parameters-----------------------------------*/ - -xposition[]={0,10,20}; //Division along x axis -strate[]={0,-5,-10,-20,-30}; //Division along y axis -Z=1; - -nx[]={30,30}; //Number of subdivisions along each division (x axis) -ny[]={1,2,3,4}; //Number of subdivisions along each divison (y axis) -nz=2; //Number of subdivisions along z axis (for z>0) - -objects[]={}; //Number of the block associated with an object - -/*---------------------------------------------------------*/ - -lengthxposition=#xposition[]; -lengthstrate=#strate[]; -nbobjects=#objects[]; - -For k In {0:lengthstrate-1} //Point definition - For j In {1:lengthxposition} - Point(k*lengthxposition+j)={xposition[j-1],strate[k],0,1.0}; -EndFor -EndFor - -For k In {0:lengthstrate-1} //Horizontal line definition - For j In {1:lengthxposition-1} - Line(k*(lengthxposition-1)+j)={k*lengthxposition+j,k*lengthxposition+j+1}; - Transfinite Line {k*(lengthxposition-1)+j}=nx[j-1]+1; -EndFor -EndFor - -nbhorizontal = lengthstrate*(lengthxposition-1); - -For k In {0:lengthstrate-2} //Vertical line definition - For j In {1:lengthxposition} - Line(nbhorizontal+k*lengthxposition+j)={k*lengthxposition+j,(k+1)*lengthxposition+j}; - Transfinite Line {nbhorizontal+k*lengthxposition+j}=ny[k]+1; -EndFor -EndFor - - -For k In {0:(lengthstrate-2)} //Surface definition + extrusion - For j In {1:lengthxposition-1} - stop=0; - - For i In {0:nbobjects-1} - If (k*(lengthxposition-1)+j == objects[i]) - stop=1; - EndIf - EndFor - - If(stop !=1) - Line Loop(k*(lengthxposition-1)+j)={k*(lengthxposition-1)+j,nbhorizontal+k*lengthxposition+j+1,-((k+1)*(lengthxposition-1)+j), - -(nbhorizontal+k*lengthxposition+j)}; - Plane Surface(k*(lengthxposition-1)+j)={k*(lengthxposition-1)+j}; - Transfinite Surface{k*(lengthxposition-1)+j}; - Recombine Surface{k*(lengthxposition-1)+j}; - - Extrude {0, 0, Z} { - Surface{k*(lengthxposition-1)+j}; Layers{nz}; Recombine; - } - Extrude {0, 0, -Z} { - Surface{k*(lengthxposition-1)+j}; Layers{nz}; Recombine; - } - EndIf - - EndFor -EndFor - - diff --git a/waves/tests/attic/strates.geo b/waves/tests/attic/strates.geo deleted file mode 100644 index f6e5f0fd..00000000 --- a/waves/tests/attic/strates.geo +++ /dev/null @@ -1,49 +0,0 @@ -// $Id$ -// fichier de donnees gmsh - -lc = 1/2; - - -Lx = 10; -Ly = 10; - -Lz = 10/2; - -nl = 20/2; - -Point(1) = { 0, 0, 0, lc}; -Point(2) = { Lx, 0, 0, lc}; -Point(3) = { Lx, -Ly, 0, lc}; -Point(4) = {-Lx, -Ly, 0, lc}; -Point(5) = {-Lx, 0, 0, lc}; - -Line(1) = {1, 2}; -Line(2) = {2, 3}; -Line(3) = {3, 4}; -Line(4) = {4, 5}; -Line(5) = {5, 1}; -Line Loop(6) = {5, 1, 2, 3, 4}; -Plane Surface(7) = {6}; -Recombine Surface {7}; - -Extrude {0, 0, Lz} -{ - Surface{7}; Layers{nl}; Recombine; -} - -Extrude {0, 0, -Lz} -{ - Surface{7}; Layers{nl}; Recombine; -} - -// physical entities - -Physical Point("Source Point") = {1}; -Physical Line("Measurement line") = {1}; -Physical Surface("Up Side") = {17, 44, 48, 21}; -Physical Surface("Bottom Side") = {29, 56}; -Physical Surface("Front Side") = {34}; -Physical Surface("Rear Side") = {61}; -Physical Surface("Right Side") = {25, 52}; -Physical Surface("Left Side") = {33, 60}; -Physical Volume("Volume") = {1, 2}; diff --git a/waves/tests/mat1/interf1.py b/waves/tests/mat1/interf1.py deleted file mode 100755 index ecb9854d..00000000 --- a/waves/tests/mat1/interf1.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -if __name__ == "__main__": - import waves.models.plane1mat as m - m.runmodel(bc='interf1', Ly=5.0, Ny=50) diff --git a/waves/tests/mat1/interf2.py b/waves/tests/mat1/interf2.py deleted file mode 100755 index b2adf845..00000000 --- a/waves/tests/mat1/interf2.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -if __name__ == "__main__": - import waves.models.plane1mat as m - m.runmodel(bc='interf2') diff --git a/waves/tests/mat1/planewave.py b/waves/tests/mat1/planewave.py deleted file mode 100755 index c3b96081..00000000 --- a/waves/tests/mat1/planewave.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -if __name__ == "__main__": - import waves.models.plane1mat as m - m.runmodel(bc='planewave', Ly=1., Ny=10, Lx=30., Nx=300, ttot=3.0) diff --git a/waves/tests/mat1/pulse.py b/waves/tests/mat1/pulse.py deleted file mode 100755 index 61bacc5b..00000000 --- a/waves/tests/mat1/pulse.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -if __name__ == "__main__": - import waves.models.plane1mat as m - m.runmodel(bc='pulse', Lx=5., Ly=5., Nx=50, Ny=50) diff --git a/waves/tests/mat1/sinsrc.py b/waves/tests/mat1/sinsrc.py deleted file mode 100755 index 571580b0..00000000 --- a/waves/tests/mat1/sinsrc.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -if __name__ == "__main__": - import waves.models.plane1mat as m - m.runmodel(bc='sinsrc') diff --git a/waves/tests/mat2/interf1.py b/waves/tests/mat2/interf1.py deleted file mode 100755 index 8342157a..00000000 --- a/waves/tests/mat2/interf1.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -if __name__ == "__main__": - import waves.models.plane2mat as m - m.runmodel(bc='interf1') diff --git a/waves/tests/mat2/pulse.py b/waves/tests/mat2/pulse.py deleted file mode 100755 index 6596d94e..00000000 --- a/waves/tests/mat2/pulse.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -if __name__ == "__main__": - import waves.models.plane2mat as m - m.runmodel(bc='pulse', Lx=2.0, Nx=20, Ny1=100) diff --git a/waves/tests/mat2/reflex.py b/waves/tests/mat2/reflex.py deleted file mode 100755 index 8bd0db96..00000000 --- a/waves/tests/mat2/reflex.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -if __name__ == "__main__": - import waves.models.plane2mat as m - m.runmodel(bc='reflex', Ny2=25) diff --git a/waves/tests/mat2/sinsrc.py b/waves/tests/mat2/sinsrc.py deleted file mode 100755 index 575ea91f..00000000 --- a/waves/tests/mat2/sinsrc.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -if __name__ == "__main__": - import waves.models.plane2mat as m - m.runmodel( - bc='sinsrc', Ly1=10, Ny1=100, Ly2=10, Ny2=50, Lx=2., Nx=10, ttot=2.) diff --git a/waves/utils.py b/waves/utils.py deleted file mode 100644 index ffab945d..00000000 --- a/waves/utils.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import tbox -import waves as w - - -def integrate(scheme, writer, vmin=-0.1, vmax=0.1): - from fwk.wutils import parseargs - args = parseargs() - - scheme.nthreads = args.k - print(scheme) - - if args.nogui: - scheme.start(writer) - else: - import waves.viewer as v - gui = v.MeshViewer(scheme) - gui.vmin = vmin - gui.vmax = vmax - gui.start() diff --git a/waves/viewer.py b/waves/viewer.py deleted file mode 100644 index 197bf050..00000000 --- a/waves/viewer.py +++ /dev/null @@ -1,456 +0,0 @@ -# -*- coding: utf-8 -*- -# test encoding: à -é-è-ô-ï-€ - - -# Copyright 2022 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import sys -import waves as w -import tbox as tb - -# TODO: creer un objet dataset qui gere l'ugrid (comme dans Metafor) - -# Qt -try: - from PyQt5.QtCore import * - from PyQt5.QtGui import * - from PyQt5.QtWidgets import * - print("PyQt5 (Qt %s) loaded!" % QT_VERSION_STR) -except : - try: - import PySide2 - from PySide2.QtCore import * - from PySide2.QtGui import * - from PySide2.QtWidgets import * - #print("PySide2 loaded!") - print("PySide2 (Qt %s) loaded!" % PySide2.__version__) - except : - print("Unable to load PyQt nor PySide2") - sys.exit() - - -# vtk -import vtk -try: - from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor - print("using vtk.qt.QVTKRenderWindowInteractor") -except: - from tboxVtk.qt5vtk6.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor - print("using pki.qt5vtk6.QVTKRenderWindowInteractor") - -# ----------------------------------------------------------------------------------------- - - -class MeshViewer(QWidget, w.DisplayHook): - - app = QApplication(sys.argv) - """ - Qt GUI for visu. the output - """ - - def __init__(self, scheme): - #super(MeshViewer, self).__init__() # a eclaircir... marche pô - w.DisplayHook.__init__(self) - QWidget.__init__(self) - - scheme.setGUI(self) - - self.msh = scheme.pbl.msh - self.scheme = scheme - self.writer = tb.GmshExport(self.msh) - - self.running = 'init' - self.vmin = -0.1 - self.vmax = 0.1 - - print("starting MeshViewer init...") - - self.__setupGUI() - self.__setupVTK() - - self.app.lastWindowClosed.connect(self.app.quit) - self.show() - self.vtkwidget.Initialize( - ) # [Linux] faire ca le plus tard possible (apres self.show!!) - print("MeshViewer ready.") - - def closeEvent(self, event): - self.scheme.stopit = True - self.running = 'running' # sort de "while self.running=='pause'" - print("GUI killed!") - QWidget.closeEvent(self, event) - - def start(self): - self.app.exec_() - - def __setupGUI(self): - - self.setWindowTitle("MeshViewer") - self.resize(800, 600) - - # vtk window - - self.vtkwidget = QVTKRenderWindowInteractor( - self) # "self" sinon, rien ne s'affiche - - self.vtkwidget.setSizePolicy( - QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) - self.vtkwidget.setMinimumSize(QSize(300, 300)) - self.vtkwidget.setSizePolicy(QSizePolicy.Expanding, - QSizePolicy.Expanding) - - #self.vtkwidget.Initialize() # plante sous Linux!! - - self.renderer = vtk.vtkRenderer() - self.renderer.SetBackground(1.0, 1.0, 1.0) - self.vtkwidget.GetRenderWindow().AddRenderer(self.renderer) - - style = vtk.vtkInteractorStyleTrackballCamera() - self.vtkwidget.SetInteractorStyle(style) - - hbox = QHBoxLayout() - self.setLayout(hbox) - hbox.addWidget(self.vtkwidget) - - pan = QFrame() - pan.setMaximumSize(QSize(200, 999999)) - hbox.addWidget(pan) - #hbox.setMargin(0) # sinon vtkwidget degouline en bas - #hbox.setSpacing(0) # sinon vtkwidget clignote sur le côté - - vbox = QVBoxLayout() - pan.setLayout(vbox) - - self.startBut = QPushButton(self.tr("start!")) - self.startBut.clicked.connect(self.startSlot) - vbox.addWidget(self.startBut) - - groupBox = QGroupBox("Scale") - gbox = QGridLayout() - label = QLabel("vmin") - gbox.addWidget(label, 0, 0) - self.vminlinedt = QLineEdit('%f' % self.vmin) - self.vminlinedt.editingFinished.connect(self.updateTCoords) - gbox.addWidget(self.vminlinedt, 0, 1) - label = QLabel("vmax") - gbox.addWidget(label, 1, 0) - self.vmaxlinedt = QLineEdit('%f' % self.vmax) - self.vmaxlinedt.editingFinished.connect(self.updateTCoords) - gbox.addWidget(self.vmaxlinedt, 1, 1) - groupBox.setLayout(gbox) - vbox.addWidget(groupBox) - - verbchk = QCheckBox("verbose") - verbchk.setChecked(self.scheme.verbose) - verbchk.stateChanged.connect(self.verboseSlot) - vbox.addWidget(verbchk) - - groupBox = QGroupBox("Infos") - self.steplabel = QLabel("step # 0") - self.timelabel = QLabel("time = 0") - gbox = QVBoxLayout() - groupBox.setLayout(gbox) - gbox.addWidget(self.steplabel) - gbox.addWidget(self.timelabel) - vbox.addWidget(groupBox) - - vbox.addStretch(1) - - def verboseSlot(self, state): - self.scheme.verbose = (state != 0) - if not state: - print("<verbose=OFF>") - - def startSlot(self): - if self.running == 'init': - self.startBut.setText("Pause") # on demarre et on affiche "pause" - self.running = 'running' - self.scheme.start(self.writer) - self.startBut.setText("Quit") - self.running = 'quit' - elif self.running == 'running': # on stoppe et on affiche 'continue" - self.running = 'pause' - self.startBut.setText("Continue") - while self.running == 'pause': - self.app.processEvents(QEventLoop.WaitForMoreEvents) - elif self.running == 'pause': - self.running = 'running' - self.startBut.setText("Pause") - elif self.running == 'quit': - self.app.quit() - - def disableStart(self): - self.startBut.setDisabled(True) - - def __setupVTK(self): - - self.__createUgrid() - - # mesh - self.mesh = Mesh(self.ugrid) - self.renderer.AddActor(self.mesh.actor) - - # grid - self.grid = Grid(self.ugrid) - self.renderer.AddViewProp(self.grid.actor) - - #scalarbar - self.scalarbar = ScalarBar(self.mesh.lut) - self.renderer.AddViewProp(self.scalarbar.actor) - - self.resetCamera() - - def resetCamera(self): - self.renderer.ResetCamera() - cam1 = self.renderer.GetActiveCamera() - # 3D - if 0: - cam1.Elevation(35) - cam1.SetViewUp(0, 1, 0) - cam1.Azimuth(30) - #2D - else: - cam1.Elevation(0) - cam1.SetViewUp(0, 1, 0) - cam1.Azimuth(0) - self.renderer.ResetCameraClippingRange() - - def display(self, nt, t, u): - """ C++ => python callback - """ - #print "[GUI] nt=", nt, "t=", t - - self.steplabel.setText("step # %d (%d%%)" % - (nt, t / self.scheme.ttot * 100)) - self.timelabel.setText("time = %f" % t) - - # update data at points - for i in range(self.msh.nodes.size()): - self.scalars.SetValue(i, u[i]) - self.scalars.Modified() - - # update texture coords - #vmin, vmax = self.scalars.GetValueRange() - #vmin=-0.01 - #vmax=0.01 - - self.updateTCoords() - - def updateTCoords(self): - try: - self.vmin = float(self.vminlinedt.text()) - self.vmax = float(self.vmaxlinedt.text()) - except: - pass - - self.mesh.updateTcoords(self.vmin, self.vmax) - self.render() - - def ragequit(self): - print("rage quit!") - self.scheme.stopit = True - self.app.quit() - - #raise Exception('GUI killed!') - - def render(self): - # draw the scene - self.vtkwidget.Render() - self.app.processEvents() - - def refresh(self): - #print "[GUI] refresh" - self.app.processEvents() - - def __createUgrid(self): - print('creating vtkUnstructuredGrid...') - self.ugrid = vtk.vtkUnstructuredGrid() - self.points = vtk.vtkPoints() - self.ugrid.SetPoints(self.points) - - self.scalars = vtk.vtkFloatArray() - self.scalars.SetNumberOfComponents(1) - self.ugrid.GetPointData().SetScalars(self.scalars) - - # points / data - for i in range(self.msh.nodes.size()): - p = self.msh.nodes[i].pos - self.points.InsertPoint(i, p[0], p[1], p[2]) - #val = p.x()*p.x()+p.y()*p.y()+p.z()*p.z() - val = 0.0 - self.scalars.InsertNextValue(val) - - # hexa - for i in range(self.msh.elems.size()): - e = self.msh.elems[i] - n = e.nodes - if e.type() == tb.ELTYPE_HEX8: - hexa = vtk.vtkHexahedron() - ids = hexa.GetPointIds() - for j in range(8): - ids.SetId(j, n[j].no - 1) - self.ugrid.InsertNextCell(hexa.GetCellType(), ids) - print(self.ugrid.GetNumberOfPoints( - ), 'points and', self.ugrid.GetNumberOfCells(), 'cells converted') - - def writeXML(self, name='mesh.vtu'): - writer = vtk.vtkXMLUnstructuredGridWriter() - compressor = vtk.vtkZLibDataCompressor() - writer.SetCompressor(compressor) - writer.SetDataModeToAscii() - writer.SetInputConnection(self.producer.GetOutputPort()) - writer.SetFileName(name) - writer.Write() - - def write(self, name='mesh.vtk'): - writer = vtk.vtkUnstructuredGridWriter() - writer.SetFileName(name) - writer.SetFileTypeToASCII() - writer.SetInputConnection(self.producer.GetOutputPort()) - writer.Write() - - -class Mesh: - def __init__(self, ugrid): - - self.ugrid = ugrid - - # compatibility vtk 5/6 => use a trivial producer - #self.producer = vtk.vtkTrivialProducer() - #self.producer.SetOutput(self.ugrid) # le double producer (dans Mesh/Grid) ne marche pas sous Qt 4 => faire un objet dataset - - self.__createTexture() - self.__createTcoords() - vmin, vmax = self.ugrid.GetPointData().GetScalars().GetValueRange() - self.updateTcoords(vmin, vmax) - - self.mapper = vtk.vtkDataSetMapper() - #self.mapper.SetInputConnection(self.producer.GetOutputPort()) - self.mapper.SetInputData(ugrid) - if vtk.VTK_MAJOR_VERSION <= 7: - self.mapper.ImmediateModeRenderingOff() - self.mapper.SetResolveCoincidentTopologyToPolygonOffset() - self.mapper.ScalarVisibilityOff() - - self.actor = vtk.vtkActor() - self.actor.SetMapper(self.mapper) - self.actor.SetTexture(self.texture) - - def __createTcoords(self): - self.tcoords = vtk.vtkFloatArray() - self.tcoords.SetNumberOfComponents(2) - self.tcoords.Resize( - self.ugrid.GetPointData().GetScalars().GetNumberOfTuples()) - self.ugrid.GetPointData().SetTCoords(self.tcoords) - - def updateTcoords(self, vmin, vmax): - #print 'vmin=',vmin,' vmax=',vmax - if vmin == vmax: - dist = 1.0 - else: - dist = vmax - vmin - thr = 1. / 256. - scalars = self.ugrid.GetPointData().GetScalars() - for i in range(scalars.GetNumberOfTuples()): - val = scalars.GetTuple1(i) - tc = (val - vmin) / dist - if (tc < thr): tc = thr - if (tc > 1.0 - thr): tc = 1.0 - thr - self.tcoords.InsertTuple2(i, tc, tc) - - self.lut.SetTableRange(vmin, vmax) # utile pour la scalarbar seulement - self.lut.Build() - - def __createTexture(self): - # lookup table - #(utilisée 1x au demarrage pour la texture) - #(puis pour la scalarbar) - self.lut = vtk.vtkLookupTable() - self.lut.SetNumberOfColors(16) - self.lut.SetHueRange(0., 0.667) - self.lut.SetTableRange( - 0.0, 1.0) # valeurs bidons -> pas d'infl sur la texture - self.lut.Build() - - self.texture = vtk.vtkTexture() - dim = self.lut.GetNumberOfTableValues() - img = vtk.vtkImageData() - img.SetDimensions(dim, dim, 1) - - if vtk.VTK_MAJOR_VERSION <= 5: - img.SetScalarTypeToUnsignedChar() - img.SetNumberOfScalarComponents(3) - img.AllocateScalars() - else: - img.AllocateScalars(vtk.VTK_UNSIGNED_CHAR, 3) - - for i in range(dim): - ci = self.lut.GetTableValue(i) - for k in range(3): - img.SetScalarComponentFromDouble(i, i, 0, k, ci[k] * 255) - if vtk.VTK_MAJOR_VERSION <= 5: - self.texture.SetInput(img) - else: - self.texture.SetInputData(img) - - if 0: # --display texture using vtkImageViewer2 (DEBUG) - imageViewer = vtk.vtkImageViewer2() - if vtk.VTK_MAJOR_VERSION <= 5: - imageViewer.SetInput(img) - else: - imageViewer.SetInputData(img) - renderWindowInteractor = vtk.vtkRenderWindowInteractor() - imageViewer.SetupInteractor(renderWindowInteractor) - imageViewer.Render() - imageViewer.GetRenderer().ResetCamera() - imageViewer.Render() - renderWindowInteractor.Start() - - -class ScalarBar: - def __init__(self, lut): - self.actor = vtk.vtkScalarBarActor() - self.actor.SetLookupTable(lut) - self.actor.GetPositionCoordinate( - ).SetCoordinateSystemToNormalizedViewport() - self.actor.GetPositionCoordinate().SetValue(0.1, 0.05) - self.actor.SetOrientationToHorizontal() - self.actor.SetWidth(0.8) - self.actor.SetHeight(0.1) - self.actor.GetTitleTextProperty().SetFontFamilyToArial() - self.actor.GetLabelTextProperty().SetFontFamilyToArial() - self.actor.SetLabelFormat("%g") - self.actor.GetTitleTextProperty().SetColor(0., 0., 0.) - self.actor.GetLabelTextProperty().SetColor(0., 0., 0.) - self.actor.SetTitle("pressure") - - -class Grid: - def __init__(self, ugrid): - self.mapper = vtk.vtkDataSetMapper() - if vtk.VTK_MAJOR_VERSION <= 7: - self.mapper.ImmediateModeRenderingOff() - self.mapper.SetResolveCoincidentTopologyToPolygonOffset() - self.mapper.ScalarVisibilityOff() - self.mapper.SetInputData(ugrid) - self.actor = vtk.vtkActor() - - self.actor.GetProperty().SetRepresentationToWireframe() - self.actor.GetProperty().SetColor(0., 0., 0.) - self.actor.GetProperty().SetAmbient(1.0) - self.actor.GetProperty().SetDiffuse(0.0) - self.actor.GetProperty().SetSpecular(0.0) - self.actor.SetMapper(self.mapper) -- GitLab