From 2e63fffde29ee3d13a861572cc5e0a1178f042b3 Mon Sep 17 00:00:00 2001 From: Dimitri Komatitsch Date: Fri, 5 Oct 2018 00:56:12 +0200 Subject: [PATCH] added utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks --- .../create_OpenDX_files_to_view_a_3D_mesh.f90 | 173 +++ ...reate_OpenDX_files_to_view_the_3D_mesh.f90 | 173 +++ ...iles_for_external_faces_of_the_3D_mesh.f90 | 1212 +++++++++++++++++ ...ve_with_Hamming_window_00deg_for_crack.f90 | 47 + ..._size_=_0.02_sur_25_=_0.00080_=_0.8_mm.txt | 11 + ..._avec_petit_mailleur_ecrit_par_Dimitri.pdf | Bin 0 -> 18269 bytes ..._avec_petit_mailleur_ecrit_par_Dimitri.pdf | Bin 0 -> 18154 bytes ...and_run_all_for_Y_shaped_crack_mesher.bash | 26 + ...sh_a_Y_shaped_crack_oriented_downwards.f90 | 467 +++++++ ...mesh_a_Y_shaped_crack_oriented_upwards.f90 | 1120 +++++++++++++++ ...ack_to_extend_to_3D_oriented_downwards.svg | 496 +++++++ ..._3D_oriented_downwards_with_19_regions.png | Bin 0 -> 54922 bytes ...crack_to_extend_to_3D_oriented_upwards.svg | 496 +++++++ ...riented_upwards_with_19_regions_better.png | Bin 0 -> 30670 bytes ...th_19_regions_even_better_final_chosen.png | Bin 0 -> 30782 bytes ...ards_with_21_regions_a_bit_too_complex.png | Bin 0 -> 29438 bytes .../visualize_mesh_DX.cfg | 45 + .../visualize_mesh_DX.net | 538 ++++++++ 18 files changed, 4804 insertions(+) create mode 100644 utils/Visualization/opendx_AVS/create_OpenDX_files_to_view_a_3D_mesh.f90 create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/create_OpenDX_files_to_view_the_3D_mesh.f90 create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/create_database_files_for_external_faces_of_the_3D_mesh.f90 create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/create_pressure_plane_wave_with_Hamming_window_00deg_for_crack.f90 create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/maillage_crack_water_20_mm_thick_et_maille_par_25_elements_donc_element_size_=_0.02_sur_25_=_0.00080_=_0.8_mm.txt create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/maillage_du_crack_newer_upwards_OK_avec_petit_mailleur_ecrit_par_Dimitri.pdf create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/maillage_du_crack_older_downwards_OK_avec_petit_mailleur_ecrit_par_Dimitri.pdf create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/make_all_and_run_all_for_Y_shaped_crack_mesher.bash create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/mesh_a_Y_shaped_crack_oriented_downwards.f90 create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/mesh_a_Y_shaped_crack_oriented_upwards.f90 create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_downwards.svg create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_downwards_with_19_regions.png create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_upwards.svg create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_upwards_with_19_regions_better.png create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_upwards_with_19_regions_even_better_final_chosen.png create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_upwards_with_21_regions_a_bit_too_complex.png create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/visualize_mesh_DX.cfg create mode 100644 utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/visualize_mesh_DX.net diff --git a/utils/Visualization/opendx_AVS/create_OpenDX_files_to_view_a_3D_mesh.f90 b/utils/Visualization/opendx_AVS/create_OpenDX_files_to_view_a_3D_mesh.f90 new file mode 100644 index 000000000..cf0a70dd4 --- /dev/null +++ b/utils/Visualization/opendx_AVS/create_OpenDX_files_to_view_a_3D_mesh.f90 @@ -0,0 +1,173 @@ + +!===================================================================== +! +! S p e c f e m 3 D V e r s i o n 3 . 0 +! --------------------------------------- +! +! Main historical authors: Dimitri Komatitsch and Jeroen Tromp +! CNRS, France +! and Princeton University, USA +! (there are currently many more authors!) +! (c) October 2017 +! +! This program is free software; you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by +! the Free Software Foundation; either version 3 of the License, or +! (at your option) any later version. +! +! This program is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +! GNU General Public License for more details. +! +! You should have received a copy of the GNU General Public License along +! with this program; if not, write to the Free Software Foundation, Inc., +! 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +! +!===================================================================== + + program create_OpenDX_file_to_view_the_mesh + +! Dimitri Komatitsch, CNRS Marseille, France, September 2018 + + implicit none + + integer :: nspec,nglob + integer :: ispec,iglob + integer :: iglob_read,ispec_loop,iformat,NGNOD,ia + + double precision, dimension(:), allocatable :: x,y,z + + double precision :: xread,yread,zread,xmin,xmax,ymin,ymax,zmin,zmax + + integer, dimension(:,:), allocatable :: ibool + integer, dimension(:), allocatable :: imaterial + +! read the mesh files in ASCII format (that is the standard case) + iformat = 1 + +! the mesh contains HEX8 elements + NGNOD = 8 + +! open SPECFEM3D_Cartesian mesh file to read the points + if (iformat == 1) then + open(unit=23,file='DATA_3D/nodes_coords_file',status='old',action='read') + read(23,*) nglob + else + open(unit=23,file='DATA_3D/nodes_coords_file.bin',form='unformatted',status='old',action='read') + read(23) nglob + endif + allocate(x(nglob)) + allocate(y(nglob)) + allocate(z(nglob)) + if (iformat == 1) then + do iglob = 1,nglob + read(23,*) iglob_read,xread,yread,zread + x(iglob_read) = xread + y(iglob_read) = yread + z(iglob_read) = zread + enddo + else + read(23) x + read(23) y + read(23) z + endif + close(23) + +! compute the min and max values of each coordinate + xmin = minval(x) + xmax = maxval(x) + + ymin = minval(y) + ymax = maxval(y) + + zmin = minval(z) + zmax = maxval(z) + + print *,'Xmin and Xmax of the mesh read = ',xmin,xmax + print *,'Ymin and Ymax of the mesh read = ',ymin,ymax + print *,'Zmin and Zmax of the mesh read = ',zmin,zmax + print * + +! ************* read mesh elements ************* + +! open SPECFEM3D_Cartesian topology file to read the mesh elements + if (iformat == 1) then + open(unit=23,file='DATA_3D/mesh_file',status='old',action='read') + read(23,*) nspec + else + open(unit=23,file='DATA_3D/mesh_file.bin',form='unformatted',status='old',action='read') + read(23) nspec + endif + + allocate(ibool(NGNOD,nspec)) + allocate(imaterial(nspec)) + +! loop on the whole mesh + if (iformat == 1) then + do ispec_loop = 1,nspec + read(23,*) ispec,(ibool(ia,ispec), ia = 1,NGNOD) + enddo + else + read(23) ibool + endif + + close(23) + + print *,'Total number of elements in the mesh read = ',nspec + print * + +! read the material property numbers + open(unit=23,file='DATA_3D/materials_file',status='old',action='read') + do ispec_loop = 1,nspec + read(23,*) ispec,imaterial(ispec) + enddo + close(23) + +!! DK DK create an OpenDX file showing all the elements of the mesh + + open(unit=11,file='DX_fullmesh.dx',status='unknown') + write(11,*) 'object 1 class array type float rank 1 shape 3 items ',nglob,' data follows' + + do iglob = 1,nglob + write(11,"(f10.7,1x,f10.7,1x,f10.7)") x(iglob),y(iglob),z(iglob) + enddo + +! ************* generate elements ****************** + + write(11,*) 'object 2 class array type int rank 1 shape 8 items ',nspec,' data follows' + +! read local elements in this slice and output global AVS or DX elements + do ispec=1,nspec +! point order in OpenDX in 2D is 1,4,2,3 *not* 1,2,3,4 as in AVS +! point order in OpenDX in 3D is 4,1,8,5,3,2,7,6, *not* 1,2,3,4,5,6,7,8 as in AVS +! in the case of OpenDX, node numbers start at zero + write(11,"(i9,1x,i9,1x,i9,1x,i9,1x,i9,1x,i9,1x,i9,1x,i9)") & + ibool(4,ispec)-1, ibool(1,ispec)-1, ibool(8,ispec)-1, ibool(5,ispec)-1, & + ibool(3,ispec)-1, ibool(2,ispec)-1, ibool(7,ispec)-1, ibool(6,ispec)-1 + enddo + +! ************* generate element data values ****************** + +! output AVS or DX header for data + write(11,*) 'attribute "element type" string "cubes"' + write(11,*) 'attribute "ref" string "positions"' + write(11,*) 'object 3 class array type float rank 0 items ',nspec,' data follows' + +! read local elements in this slice and output global AVS or DX elements + do ispec=1,nspec + write(11,*) imaterial(ispec) + enddo + +! define OpenDX field + write(11,*) 'attribute "dep" string "connections"' + write(11,*) 'object "irregular positions irregular connections" class field' + write(11,*) 'component "positions" value 1' + write(11,*) 'component "connections" value 2' + write(11,*) 'component "data" value 3' + write(11,*) 'end' + + close(11) + + end program create_OpenDX_file_to_view_the_mesh + diff --git a/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/create_OpenDX_files_to_view_the_3D_mesh.f90 b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/create_OpenDX_files_to_view_the_3D_mesh.f90 new file mode 100644 index 000000000..cf0a70dd4 --- /dev/null +++ b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/create_OpenDX_files_to_view_the_3D_mesh.f90 @@ -0,0 +1,173 @@ + +!===================================================================== +! +! S p e c f e m 3 D V e r s i o n 3 . 0 +! --------------------------------------- +! +! Main historical authors: Dimitri Komatitsch and Jeroen Tromp +! CNRS, France +! and Princeton University, USA +! (there are currently many more authors!) +! (c) October 2017 +! +! This program is free software; you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by +! the Free Software Foundation; either version 3 of the License, or +! (at your option) any later version. +! +! This program is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +! GNU General Public License for more details. +! +! You should have received a copy of the GNU General Public License along +! with this program; if not, write to the Free Software Foundation, Inc., +! 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +! +!===================================================================== + + program create_OpenDX_file_to_view_the_mesh + +! Dimitri Komatitsch, CNRS Marseille, France, September 2018 + + implicit none + + integer :: nspec,nglob + integer :: ispec,iglob + integer :: iglob_read,ispec_loop,iformat,NGNOD,ia + + double precision, dimension(:), allocatable :: x,y,z + + double precision :: xread,yread,zread,xmin,xmax,ymin,ymax,zmin,zmax + + integer, dimension(:,:), allocatable :: ibool + integer, dimension(:), allocatable :: imaterial + +! read the mesh files in ASCII format (that is the standard case) + iformat = 1 + +! the mesh contains HEX8 elements + NGNOD = 8 + +! open SPECFEM3D_Cartesian mesh file to read the points + if (iformat == 1) then + open(unit=23,file='DATA_3D/nodes_coords_file',status='old',action='read') + read(23,*) nglob + else + open(unit=23,file='DATA_3D/nodes_coords_file.bin',form='unformatted',status='old',action='read') + read(23) nglob + endif + allocate(x(nglob)) + allocate(y(nglob)) + allocate(z(nglob)) + if (iformat == 1) then + do iglob = 1,nglob + read(23,*) iglob_read,xread,yread,zread + x(iglob_read) = xread + y(iglob_read) = yread + z(iglob_read) = zread + enddo + else + read(23) x + read(23) y + read(23) z + endif + close(23) + +! compute the min and max values of each coordinate + xmin = minval(x) + xmax = maxval(x) + + ymin = minval(y) + ymax = maxval(y) + + zmin = minval(z) + zmax = maxval(z) + + print *,'Xmin and Xmax of the mesh read = ',xmin,xmax + print *,'Ymin and Ymax of the mesh read = ',ymin,ymax + print *,'Zmin and Zmax of the mesh read = ',zmin,zmax + print * + +! ************* read mesh elements ************* + +! open SPECFEM3D_Cartesian topology file to read the mesh elements + if (iformat == 1) then + open(unit=23,file='DATA_3D/mesh_file',status='old',action='read') + read(23,*) nspec + else + open(unit=23,file='DATA_3D/mesh_file.bin',form='unformatted',status='old',action='read') + read(23) nspec + endif + + allocate(ibool(NGNOD,nspec)) + allocate(imaterial(nspec)) + +! loop on the whole mesh + if (iformat == 1) then + do ispec_loop = 1,nspec + read(23,*) ispec,(ibool(ia,ispec), ia = 1,NGNOD) + enddo + else + read(23) ibool + endif + + close(23) + + print *,'Total number of elements in the mesh read = ',nspec + print * + +! read the material property numbers + open(unit=23,file='DATA_3D/materials_file',status='old',action='read') + do ispec_loop = 1,nspec + read(23,*) ispec,imaterial(ispec) + enddo + close(23) + +!! DK DK create an OpenDX file showing all the elements of the mesh + + open(unit=11,file='DX_fullmesh.dx',status='unknown') + write(11,*) 'object 1 class array type float rank 1 shape 3 items ',nglob,' data follows' + + do iglob = 1,nglob + write(11,"(f10.7,1x,f10.7,1x,f10.7)") x(iglob),y(iglob),z(iglob) + enddo + +! ************* generate elements ****************** + + write(11,*) 'object 2 class array type int rank 1 shape 8 items ',nspec,' data follows' + +! read local elements in this slice and output global AVS or DX elements + do ispec=1,nspec +! point order in OpenDX in 2D is 1,4,2,3 *not* 1,2,3,4 as in AVS +! point order in OpenDX in 3D is 4,1,8,5,3,2,7,6, *not* 1,2,3,4,5,6,7,8 as in AVS +! in the case of OpenDX, node numbers start at zero + write(11,"(i9,1x,i9,1x,i9,1x,i9,1x,i9,1x,i9,1x,i9,1x,i9)") & + ibool(4,ispec)-1, ibool(1,ispec)-1, ibool(8,ispec)-1, ibool(5,ispec)-1, & + ibool(3,ispec)-1, ibool(2,ispec)-1, ibool(7,ispec)-1, ibool(6,ispec)-1 + enddo + +! ************* generate element data values ****************** + +! output AVS or DX header for data + write(11,*) 'attribute "element type" string "cubes"' + write(11,*) 'attribute "ref" string "positions"' + write(11,*) 'object 3 class array type float rank 0 items ',nspec,' data follows' + +! read local elements in this slice and output global AVS or DX elements + do ispec=1,nspec + write(11,*) imaterial(ispec) + enddo + +! define OpenDX field + write(11,*) 'attribute "dep" string "connections"' + write(11,*) 'object "irregular positions irregular connections" class field' + write(11,*) 'component "positions" value 1' + write(11,*) 'component "connections" value 2' + write(11,*) 'component "data" value 3' + write(11,*) 'end' + + close(11) + + end program create_OpenDX_file_to_view_the_mesh + diff --git a/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/create_database_files_for_external_faces_of_the_3D_mesh.f90 b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/create_database_files_for_external_faces_of_the_3D_mesh.f90 new file mode 100644 index 000000000..f082b5fec --- /dev/null +++ b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/create_database_files_for_external_faces_of_the_3D_mesh.f90 @@ -0,0 +1,1212 @@ +!===================================================================== +! +! S p e c f e m 3 D V e r s i o n 3 . 0 +! --------------------------------------- +! +! Main historical authors: Dimitri Komatitsch and Jeroen Tromp +! CNRS, France +! and Princeton University, USA +! (there are currently many more authors!) +! (c) October 2017 +! +! This program is free software; you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by +! the Free Software Foundation; either version 3 of the License, or +! (at your option) any later version. +! +! This program is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +! GNU General Public License for more details. +! +! You should have received a copy of the GNU General Public License along +! with this program; if not, write to the Free Software Foundation, Inc., +! 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +! +!===================================================================== + + program create_database_files_for_external_faces_of_the_3D_mesh + +! Dimitri Komatitsch, CNRS Marseille, France, April 2013 and February 2017 and September 2018 + + implicit none + + integer :: nspec,npoin + integer :: ispec,ipoin + integer :: ipoin_read,ispec_loop,iformat,NGNOD,ia + integer :: i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16,i17,i18,i19,i20,i21,i22,i23,i24,i25,i26,i27 + integer :: count_faces_found + + double precision, dimension(:), allocatable :: x,y,z + + double precision :: xread,yread,zread,xmin,xmax,ymin,ymax,zmin,zmax,limit,size_of_model + + logical :: already_found_a_face + + integer, dimension(:,:), allocatable :: ibool + +! to make sure coordinate roundoff problems do not occur, use a tolerance of 0.5% + double precision, parameter :: SMALL_PERCENTAGE_TOLERANCE = 1.005d0 + + double precision, parameter :: SMALL_RELATIVE_VALUE = 0.5d-3 + +! read the mesh files in ASCII format (that is the standard case) + iformat = 1 + +! the mesh contains HEX8 elements + NGNOD = 8 + +! open SPECFEM3D_Cartesian mesh file to read the points + if (iformat == 1) then + open(unit=23,file='DATA_3D/nodes_coords_file',status='old',action='read') + read(23,*) npoin + else + open(unit=23,file='DATA_3D/nodes_coords_file.bin',form='unformatted',status='old',action='read') + read(23) npoin + endif + allocate(x(npoin)) + allocate(y(npoin)) + allocate(z(npoin)) + if (iformat == 1) then + do ipoin = 1,npoin + read(23,*) ipoin_read,xread,yread,zread + x(ipoin_read) = xread + y(ipoin_read) = yread + z(ipoin_read) = zread + enddo + else + read(23) x + read(23) y + read(23) z + endif + close(23) + +! compute the min and max values of each coordinate + xmin = minval(x) + xmax = maxval(x) + + ymin = minval(y) + ymax = maxval(y) + + zmin = minval(z) + zmax = maxval(z) + + print *,'Xmin and Xmax of the mesh read = ',xmin,xmax + print *,'Ymin and Ymax of the mesh read = ',ymin,ymax + print *,'Zmin and Zmax of the mesh read = ',zmin,zmax + print * + +! ************* read mesh elements ************* + +! open SPECFEM3D_Cartesian topology file to read the mesh elements + if (iformat == 1) then + open(unit=23,file='DATA_3D/mesh_file',status='old',action='read') + read(23,*) nspec + else + open(unit=23,file='DATA_3D/mesh_file.bin',form='unformatted',status='old',action='read') + read(23) nspec + endif + + allocate(ibool(NGNOD,nspec)) + +! loop on the whole mesh + if (iformat == 1) then + do ispec_loop = 1,nspec + read(23,*) ispec,(ibool(ia,ispec), ia = 1,NGNOD) + enddo + else + read(23) ibool + endif + + close(23) + + print *,'Total number of elements in the mesh read = ',nspec + print * + +! ************* generate "absorbing_surface_file_xmin" ************* + +! first count the number of faces that are along that edge + + count_faces_found = 0 + +! Xmin + size_of_model = xmax - xmin + limit = xmin + SMALL_RELATIVE_VALUE*size_of_model + +! loop on the whole mesh + do ispec = 1,nspec + + i1 = ibool(1,ispec) + i2 = ibool(2,ispec) + i3 = ibool(3,ispec) + i4 = ibool(4,ispec) + i5 = ibool(5,ispec) + i6 = ibool(6,ispec) + i7 = ibool(7,ispec) + i8 = ibool(8,ispec) + + if (.true.) then + + already_found_a_face = .false. + +! test face 1 (bottom) + if (x(i1) < limit .and. x(i2) < limit .and. x(i3) < limit .and. x(i4) < limit) then + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 2 (top) + if (x(i5) < limit .and. x(i6) < limit .and. x(i7) < limit .and. x(i8) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 3 (left) + if (x(i1) < limit .and. x(i4) < limit .and. x(i8) < limit .and. x(i5) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 4 (right) + if (x(i2) < limit .and. x(i3) < limit .and. x(i7) < limit .and. x(i6) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 5 (front) + if (x(i1) < limit .and. x(i2) < limit .and. x(i6) < limit .and. x(i5) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 6 (back) + if (x(i4) < limit .and. x(i3) < limit .and. x(i7) < limit .and. x(i8) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + + endif + + enddo + + print *,'found ',count_faces_found,' full faces on face Xmin' + +!----------------------------- + +! open SPECFEM3D_Cartesian topology file to read the mesh elements + open(unit=24,file='DATA_3D/absorbing_surface_file_xmin',status='unknown',action='write') + +! write the total number of face elements + write(24,*) count_faces_found + +! loop on the whole mesh + do ispec = 1,nspec + + i1 = ibool(1,ispec) + i2 = ibool(2,ispec) + i3 = ibool(3,ispec) + i4 = ibool(4,ispec) + i5 = ibool(5,ispec) + i6 = ibool(6,ispec) + i7 = ibool(7,ispec) + i8 = ibool(8,ispec) + + if (NGNOD == 27) then + i9 = ibool(9,ispec) + i10 = ibool(10,ispec) + i11 = ibool(11,ispec) + i12 = ibool(12,ispec) + i13 = ibool(13,ispec) + i14 = ibool(14,ispec) + i15 = ibool(15,ispec) + i16 = ibool(16,ispec) + i17 = ibool(17,ispec) + i18 = ibool(18,ispec) + i19 = ibool(19,ispec) + i20 = ibool(20,ispec) + i21 = ibool(21,ispec) + i22 = ibool(22,ispec) + i23 = ibool(23,ispec) + i24 = ibool(24,ispec) + i25 = ibool(25,ispec) + i26 = ibool(26,ispec) + i27 = ibool(27,ispec) + endif + + if (.true.) then + +! for the six faces below it is important to make sure we write the four points +! in an order for which the normal to the face points outwards + +! test face 1 (bottom) + if (x(i1) < limit .and. x(i2) < limit .and. x(i3) < limit .and. x(i4) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i4,i3,i2,i1 + else + write(24,"(10(i9,1x))") ispec,i4,i3,i2,i1,i11,i10,i9,i12,i21 + endif + endif + +! test face 2 (top) + if (x(i5) < limit .and. x(i6) < limit .and. x(i7) < limit .and. x(i8) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i5,i6,i7,i8 + else + write(24,"(10(i9,1x))") ispec,i5,i6,i7,i8,i17,i18,i19,i20,i26 + endif + endif + +! test face 3 (left) + if (x(i1) < limit .and. x(i4) < limit .and. x(i8) < limit .and. x(i5) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i1,i5,i8,i4 + else + write(24,"(10(i9,1x))") ispec,i1,i5,i8,i4,i13,i20,i16,i12,i25 + endif + endif + +! test face 4 (right) + if (x(i2) < limit .and. x(i3) < limit .and. x(i7) < limit .and. x(i6) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i2,i3,i7,i6 + else + write(24,"(10(i9,1x))") ispec,i2,i3,i7,i6,i10,i15,i18,i14,i23 + endif + endif + +! test face 5 (front) + if (x(i1) < limit .and. x(i2) < limit .and. x(i6) < limit .and. x(i5) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i1,i2,i6,i5 + else + write(24,"(10(i9,1x))") ispec,i1,i2,i6,i5,i9,i14,i17,i13,i22 + endif + endif + +! test face 6 (back) + if (x(i4) < limit .and. x(i3) < limit .and. x(i7) < limit .and. x(i8) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i3,i4,i8,i7 + else + write(24,"(10(i9,1x))") ispec,i3,i4,i8,i7,i11,i16,i19,i15,i24 + endif + endif + + endif + + enddo + + close(24) + + print *,'File "absorbing_surface_file_xmin" has been successfully created' + print * + +! ************* generate "absorbing_surface_file_xmax" ************* + +! first count the number of faces that are along that edge + + count_faces_found = 0 + +! Xmax + size_of_model = xmax - xmin + limit = xmax - SMALL_RELATIVE_VALUE*size_of_model + +! loop on the whole mesh + do ispec = 1,nspec + + i1 = ibool(1,ispec) + i2 = ibool(2,ispec) + i3 = ibool(3,ispec) + i4 = ibool(4,ispec) + i5 = ibool(5,ispec) + i6 = ibool(6,ispec) + i7 = ibool(7,ispec) + i8 = ibool(8,ispec) + + if (.true.) then + + already_found_a_face = .false. + +! test face 1 (bottom) + if (x(i1) > limit .and. x(i2) > limit .and. x(i3) > limit .and. x(i4) > limit) then + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 2 (top) + if (x(i5) > limit .and. x(i6) > limit .and. x(i7) > limit .and. x(i8) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 3 (left) + if (x(i1) > limit .and. x(i4) > limit .and. x(i8) > limit .and. x(i5) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 4 (right) + if (x(i2) > limit .and. x(i3) > limit .and. x(i7) > limit .and. x(i6) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 5 (front) + if (x(i1) > limit .and. x(i2) > limit .and. x(i6) > limit .and. x(i5) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 6 (back) + if (x(i4) > limit .and. x(i3) > limit .and. x(i7) > limit .and. x(i8) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + + endif + + enddo + + print *,'found ',count_faces_found,' full faces on face Xmax' + +!----------------------------- + + open(unit=24,file='DATA_3D/absorbing_surface_file_xmax',status='unknown',action='write') + +! write the total number of face elements + write(24,*) count_faces_found + +! loop on the whole mesh + do ispec = 1,nspec + + i1 = ibool(1,ispec) + i2 = ibool(2,ispec) + i3 = ibool(3,ispec) + i4 = ibool(4,ispec) + i5 = ibool(5,ispec) + i6 = ibool(6,ispec) + i7 = ibool(7,ispec) + i8 = ibool(8,ispec) + + if (NGNOD == 27) then + i9 = ibool(9,ispec) + i10 = ibool(10,ispec) + i11 = ibool(11,ispec) + i12 = ibool(12,ispec) + i13 = ibool(13,ispec) + i14 = ibool(14,ispec) + i15 = ibool(15,ispec) + i16 = ibool(16,ispec) + i17 = ibool(17,ispec) + i18 = ibool(18,ispec) + i19 = ibool(19,ispec) + i20 = ibool(20,ispec) + i21 = ibool(21,ispec) + i22 = ibool(22,ispec) + i23 = ibool(23,ispec) + i24 = ibool(24,ispec) + i25 = ibool(25,ispec) + i26 = ibool(26,ispec) + i27 = ibool(27,ispec) + endif + + if (.true.) then + +! for the six faces below it is important to make sure we write the four points +! in an order for which the normal to the face points outwards + +! test face 1 (bottom) + if (x(i1) > limit .and. x(i2) > limit .and. x(i3) > limit .and. x(i4) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i4,i3,i2,i1 + else + write(24,"(10(i9,1x))") ispec,i4,i3,i2,i1,i11,i10,i9,i12,i21 + endif + endif + +! test face 2 (top) + if (x(i5) > limit .and. x(i6) > limit .and. x(i7) > limit .and. x(i8) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i5,i6,i7,i8 + else + write(24,"(10(i9,1x))") ispec,i5,i6,i7,i8,i17,i18,i19,i20,i26 + endif + endif + +! test face 3 (left) + if (x(i1) > limit .and. x(i4) > limit .and. x(i8) > limit .and. x(i5) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i1,i5,i8,i4 + else + write(24,"(10(i9,1x))") ispec,i1,i5,i8,i4,i13,i20,i16,i12,i25 + endif + endif + +! test face 4 (right) + if (x(i2) > limit .and. x(i3) > limit .and. x(i7) > limit .and. x(i6) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i2,i3,i7,i6 + else + write(24,"(10(i9,1x))") ispec,i2,i3,i7,i6,i10,i15,i18,i14,i23 + endif + endif + +! test face 5 (front) + if (x(i1) > limit .and. x(i2) > limit .and. x(i6) > limit .and. x(i5) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i1,i2,i6,i5 + else + write(24,"(10(i9,1x))") ispec,i1,i2,i6,i5,i9,i14,i17,i13,i22 + endif + endif + +! test face 6 (back) + if (x(i4) > limit .and. x(i3) > limit .and. x(i7) > limit .and. x(i8) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i3,i4,i8,i7 + else + write(24,"(10(i9,1x))") ispec,i3,i4,i8,i7,i11,i16,i19,i15,i24 + endif + endif + + endif + + enddo + + close(24) + + print *,'File "absorbing_surface_file_xmax" has been successfully created' + print * + +! ************* generate "absorbing_surface_file_ymin" ************* + +! first count the number of faces that are along that edge + + count_faces_found = 0 + +! Ymin + size_of_model = ymax - ymin + limit = ymin + SMALL_RELATIVE_VALUE*size_of_model + +! loop on the whole mesh + do ispec = 1,nspec + + i1 = ibool(1,ispec) + i2 = ibool(2,ispec) + i3 = ibool(3,ispec) + i4 = ibool(4,ispec) + i5 = ibool(5,ispec) + i6 = ibool(6,ispec) + i7 = ibool(7,ispec) + i8 = ibool(8,ispec) + + if (.true.) then + + already_found_a_face = .false. + +! test face 1 (bottom) + if (y(i1) < limit .and. y(i2) < limit .and. y(i3) < limit .and. y(i4) < limit) then + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 2 (top) + if (y(i5) < limit .and. y(i6) < limit .and. y(i7) < limit .and. y(i8) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 3 (left) + if (y(i1) < limit .and. y(i4) < limit .and. y(i8) < limit .and. y(i5) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 4 (right) + if (y(i2) < limit .and. y(i3) < limit .and. y(i7) < limit .and. y(i6) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 5 (front) + if (y(i1) < limit .and. y(i2) < limit .and. y(i6) < limit .and. y(i5) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 6 (back) + if (y(i4) < limit .and. y(i3) < limit .and. y(i7) < limit .and. y(i8) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + + endif + + enddo + + print *,'found ',count_faces_found,' full faces on face Ymin' + +!----------------------------- + + open(unit=24,file='DATA_3D/absorbing_surface_file_ymin',status='unknown',action='write') + +! write the total number of face elements + write(24,*) count_faces_found + +! loop on the whole mesh + do ispec = 1,nspec + + i1 = ibool(1,ispec) + i2 = ibool(2,ispec) + i3 = ibool(3,ispec) + i4 = ibool(4,ispec) + i5 = ibool(5,ispec) + i6 = ibool(6,ispec) + i7 = ibool(7,ispec) + i8 = ibool(8,ispec) + + if (NGNOD == 27) then + i9 = ibool(9,ispec) + i10 = ibool(10,ispec) + i11 = ibool(11,ispec) + i12 = ibool(12,ispec) + i13 = ibool(13,ispec) + i14 = ibool(14,ispec) + i15 = ibool(15,ispec) + i16 = ibool(16,ispec) + i17 = ibool(17,ispec) + i18 = ibool(18,ispec) + i19 = ibool(19,ispec) + i20 = ibool(20,ispec) + i21 = ibool(21,ispec) + i22 = ibool(22,ispec) + i23 = ibool(23,ispec) + i24 = ibool(24,ispec) + i25 = ibool(25,ispec) + i26 = ibool(26,ispec) + i27 = ibool(27,ispec) + endif + + if (.true.) then + +! for the six faces below it is important to make sure we write the four points +! in an order for which the normal to the face points outwards + +! test face 1 (bottom) + if (y(i1) < limit .and. y(i2) < limit .and. y(i3) < limit .and. y(i4) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i4,i3,i2,i1 + else + write(24,"(10(i9,1x))") ispec,i4,i3,i2,i1,i11,i10,i9,i12,i21 + endif + endif + +! test face 2 (top) + if (y(i5) < limit .and. y(i6) < limit .and. y(i7) < limit .and. y(i8) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i5,i6,i7,i8 + else + write(24,"(10(i9,1x))") ispec,i5,i6,i7,i8,i17,i18,i19,i20,i26 + endif + endif + +! test face 3 (left) + if (y(i1) < limit .and. y(i4) < limit .and. y(i8) < limit .and. y(i5) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i1,i5,i8,i4 + else + write(24,"(10(i9,1x))") ispec,i1,i5,i8,i4,i13,i20,i16,i12,i25 + endif + endif + +! test face 4 (right) + if (y(i2) < limit .and. y(i3) < limit .and. y(i7) < limit .and. y(i6) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i2,i3,i7,i6 + else + write(24,"(10(i9,1x))") ispec,i2,i3,i7,i6,i10,i15,i18,i14,i23 + endif + endif + +! test face 5 (front) + if (y(i1) < limit .and. y(i2) < limit .and. y(i6) < limit .and. y(i5) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i1,i2,i6,i5 + else + write(24,"(10(i9,1x))") ispec,i1,i2,i6,i5,i9,i14,i17,i13,i22 + endif + endif + +! test face 6 (back) + if (y(i4) < limit .and. y(i3) < limit .and. y(i7) < limit .and. y(i8) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i3,i4,i8,i7 + else + write(24,"(10(i9,1x))") ispec,i3,i4,i8,i7,i11,i16,i19,i15,i24 + endif + endif + + endif + + enddo + + close(24) + + print *,'File "absorbing_surface_file_ymin" has been successfully created' + print * + +! ************* generate "absorbing_surface_file_ymax" ************* + +! first count the number of faces that are along that edge + + count_faces_found = 0 + +! Ymax + size_of_model = ymax - ymin + limit = ymax - SMALL_RELATIVE_VALUE*size_of_model + +! loop on the whole mesh + do ispec = 1,nspec + + i1 = ibool(1,ispec) + i2 = ibool(2,ispec) + i3 = ibool(3,ispec) + i4 = ibool(4,ispec) + i5 = ibool(5,ispec) + i6 = ibool(6,ispec) + i7 = ibool(7,ispec) + i8 = ibool(8,ispec) + + if (.true.) then + + already_found_a_face = .false. + +! test face 1 (bottom) + if (y(i1) > limit .and. y(i2) > limit .and. y(i3) > limit .and. y(i4) > limit) then + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 2 (top) + if (y(i5) > limit .and. y(i6) > limit .and. y(i7) > limit .and. y(i8) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 3 (left) + if (y(i1) > limit .and. y(i4) > limit .and. y(i8) > limit .and. y(i5) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 4 (right) + if (y(i2) > limit .and. y(i3) > limit .and. y(i7) > limit .and. y(i6) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 5 (front) + if (y(i1) > limit .and. y(i2) > limit .and. y(i6) > limit .and. y(i5) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 6 (back) + if (y(i4) > limit .and. y(i3) > limit .and. y(i7) > limit .and. y(i8) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + + endif + + enddo + + print *,'found ',count_faces_found,' full faces on face Ymax' + +!----------------------------- + + open(unit=24,file='DATA_3D/absorbing_surface_file_ymax',status='unknown',action='write') + +! write the total number of face elements + write(24,*) count_faces_found + +! loop on the whole mesh + do ispec = 1,nspec + + i1 = ibool(1,ispec) + i2 = ibool(2,ispec) + i3 = ibool(3,ispec) + i4 = ibool(4,ispec) + i5 = ibool(5,ispec) + i6 = ibool(6,ispec) + i7 = ibool(7,ispec) + i8 = ibool(8,ispec) + + if (NGNOD == 27) then + i9 = ibool(9,ispec) + i10 = ibool(10,ispec) + i11 = ibool(11,ispec) + i12 = ibool(12,ispec) + i13 = ibool(13,ispec) + i14 = ibool(14,ispec) + i15 = ibool(15,ispec) + i16 = ibool(16,ispec) + i17 = ibool(17,ispec) + i18 = ibool(18,ispec) + i19 = ibool(19,ispec) + i20 = ibool(20,ispec) + i21 = ibool(21,ispec) + i22 = ibool(22,ispec) + i23 = ibool(23,ispec) + i24 = ibool(24,ispec) + i25 = ibool(25,ispec) + i26 = ibool(26,ispec) + i27 = ibool(27,ispec) + endif + + if (.true.) then + +! for the six faces below it is important to make sure we write the four points +! in an order for which the normal to the face points outwards + +! test face 1 (bottom) + if (y(i1) > limit .and. y(i2) > limit .and. y(i3) > limit .and. y(i4) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i4,i3,i2,i1 + else + write(24,"(10(i9,1x))") ispec,i4,i3,i2,i1,i11,i10,i9,i12,i21 + endif + endif + +! test face 2 (top) + if (y(i5) > limit .and. y(i6) > limit .and. y(i7) > limit .and. y(i8) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i5,i6,i7,i8 + else + write(24,"(10(i9,1x))") ispec,i5,i6,i7,i8,i17,i18,i19,i20,i26 + endif + endif + +! test face 3 (left) + if (y(i1) > limit .and. y(i4) > limit .and. y(i8) > limit .and. y(i5) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i1,i5,i8,i4 + else + write(24,"(10(i9,1x))") ispec,i1,i5,i8,i4,i13,i20,i16,i12,i25 + endif + endif + +! test face 4 (right) + if (y(i2) > limit .and. y(i3) > limit .and. y(i7) > limit .and. y(i6) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i2,i3,i7,i6 + else + write(24,"(10(i9,1x))") ispec,i2,i3,i7,i6,i10,i15,i18,i14,i23 + endif + endif + +! test face 5 (front) + if (y(i1) > limit .and. y(i2) > limit .and. y(i6) > limit .and. y(i5) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i1,i2,i6,i5 + else + write(24,"(10(i9,1x))") ispec,i1,i2,i6,i5,i9,i14,i17,i13,i22 + endif + endif + +! test face 6 (back) + if (y(i4) > limit .and. y(i3) > limit .and. y(i7) > limit .and. y(i8) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i3,i4,i8,i7 + else + write(24,"(10(i9,1x))") ispec,i3,i4,i8,i7,i11,i16,i19,i15,i24 + endif + endif + + endif + + enddo + + close(24) + + print *,'File "absorbing_surface_file_ymax" has been successfully created' + print * + +! ************* generate "absorbing_surface_file_bottom" ************* + +! first count the number of faces that are along that edge + + count_faces_found = 0 + +! Zmin + size_of_model = zmax - zmin + limit = zmin + SMALL_RELATIVE_VALUE*size_of_model + +! loop on the whole mesh + do ispec = 1,nspec + + i1 = ibool(1,ispec) + i2 = ibool(2,ispec) + i3 = ibool(3,ispec) + i4 = ibool(4,ispec) + i5 = ibool(5,ispec) + i6 = ibool(6,ispec) + i7 = ibool(7,ispec) + i8 = ibool(8,ispec) + + if (.true.) then + + already_found_a_face = .false. + +! test face 1 (bottom) + if (z(i1) < limit .and. z(i2) < limit .and. z(i3) < limit .and. z(i4) < limit) then + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 2 (top) + if (z(i5) < limit .and. z(i6) < limit .and. z(i7) < limit .and. z(i8) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 3 (left) + if (z(i1) < limit .and. z(i4) < limit .and. z(i8) < limit .and. z(i5) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 4 (right) + if (z(i2) < limit .and. z(i3) < limit .and. z(i7) < limit .and. z(i6) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 5 (front) + if (z(i1) < limit .and. z(i2) < limit .and. z(i6) < limit .and. z(i5) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 6 (back) + if (z(i4) < limit .and. z(i3) < limit .and. z(i7) < limit .and. z(i8) < limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + + endif + + enddo + + print *,'found ',count_faces_found,' full faces on face Zmin' + +!----------------------------- + + open(unit=24,file='DATA_3D/absorbing_surface_file_bottom',status='unknown',action='write') + +! write the total number of face elements + write(24,*) count_faces_found + +! loop on the whole mesh + do ispec = 1,nspec + + i1 = ibool(1,ispec) + i2 = ibool(2,ispec) + i3 = ibool(3,ispec) + i4 = ibool(4,ispec) + i5 = ibool(5,ispec) + i6 = ibool(6,ispec) + i7 = ibool(7,ispec) + i8 = ibool(8,ispec) + + if (NGNOD == 27) then + i9 = ibool(9,ispec) + i10 = ibool(10,ispec) + i11 = ibool(11,ispec) + i12 = ibool(12,ispec) + i13 = ibool(13,ispec) + i14 = ibool(14,ispec) + i15 = ibool(15,ispec) + i16 = ibool(16,ispec) + i17 = ibool(17,ispec) + i18 = ibool(18,ispec) + i19 = ibool(19,ispec) + i20 = ibool(20,ispec) + i21 = ibool(21,ispec) + i22 = ibool(22,ispec) + i23 = ibool(23,ispec) + i24 = ibool(24,ispec) + i25 = ibool(25,ispec) + i26 = ibool(26,ispec) + i27 = ibool(27,ispec) + endif + + if (.true.) then + +! for the six faces below it is important to make sure we write the four points +! in an order for which the normal to the face points outwards + +! test face 1 (bottom) + if (z(i1) < limit .and. z(i2) < limit .and. z(i3) < limit .and. z(i4) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i4,i3,i2,i1 + else + write(24,"(10(i9,1x))") ispec,i4,i3,i2,i1,i11,i10,i9,i12,i21 + endif + endif + +! test face 2 (top) + if (z(i5) < limit .and. z(i6) < limit .and. z(i7) < limit .and. z(i8) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i5,i6,i7,i8 + else + write(24,"(10(i9,1x))") ispec,i5,i6,i7,i8,i17,i18,i19,i20,i26 + endif + endif + +! test face 3 (left) + if (z(i1) < limit .and. z(i4) < limit .and. z(i8) < limit .and. z(i5) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i1,i5,i8,i4 + else + write(24,"(10(i9,1x))") ispec,i1,i5,i8,i4,i13,i20,i16,i12,i25 + endif + endif + +! test face 4 (right) + if (z(i2) < limit .and. z(i3) < limit .and. z(i7) < limit .and. z(i6) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i2,i3,i7,i6 + else + write(24,"(10(i9,1x))") ispec,i2,i3,i7,i6,i10,i15,i18,i14,i23 + endif + endif + +! test face 5 (front) + if (z(i1) < limit .and. z(i2) < limit .and. z(i6) < limit .and. z(i5) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i1,i2,i6,i5 + else + write(24,"(10(i9,1x))") ispec,i1,i2,i6,i5,i9,i14,i17,i13,i22 + endif + endif + +! test face 6 (back) + if (z(i4) < limit .and. z(i3) < limit .and. z(i7) < limit .and. z(i8) < limit) then + if (NGNOD == 8) then + write(24,*) ispec,i3,i4,i8,i7 + else + write(24,"(10(i9,1x))") ispec,i3,i4,i8,i7,i11,i16,i19,i15,i24 + endif + endif + + endif + + enddo + + close(24) + + print *,'File "absorbing_surface_file_bottom" has been successfully created' + print * + +! ************* generate "free_or_absorbing_surface_file_zmax" ************* + +! first count the number of faces that are along that edge + + count_faces_found = 0 + +! Zmax + size_of_model = zmax - zmin + limit = zmax - SMALL_RELATIVE_VALUE*size_of_model + +! loop on the whole mesh + do ispec = 1,nspec + + i1 = ibool(1,ispec) + i2 = ibool(2,ispec) + i3 = ibool(3,ispec) + i4 = ibool(4,ispec) + i5 = ibool(5,ispec) + i6 = ibool(6,ispec) + i7 = ibool(7,ispec) + i8 = ibool(8,ispec) + + already_found_a_face = .false. + +! test face 1 (bottom) + if (z(i1) > limit .and. z(i2) > limit .and. z(i3) > limit .and. z(i4) > limit) then + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 2 (top) + if (z(i5) > limit .and. z(i6) > limit .and. z(i7) > limit .and. z(i8) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 3 (left) + if (z(i1) > limit .and. z(i4) > limit .and. z(i8) > limit .and. z(i5) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 4 (right) + if (z(i2) > limit .and. z(i3) > limit .and. z(i7) > limit .and. z(i6) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 5 (front) + if (z(i1) > limit .and. z(i2) > limit .and. z(i6) > limit .and. z(i5) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + +! test face 6 (back) + if (z(i4) > limit .and. z(i3) > limit .and. z(i7) > limit .and. z(i8) > limit) then + if (already_found_a_face) stop 'error: element with two faces on the same edge found!' + count_faces_found = count_faces_found + 1 + already_found_a_face = .true. + endif + + enddo + + print *,'found ',count_faces_found,' full faces on face Zmax' + +!----------------------------- + + open(unit=24,file='DATA_3D/free_or_absorbing_surface_file_zmax',status='unknown',action='write') + +! write the total number of face elements + write(24,*) count_faces_found + +! loop on the whole mesh + do ispec = 1,nspec + + i1 = ibool(1,ispec) + i2 = ibool(2,ispec) + i3 = ibool(3,ispec) + i4 = ibool(4,ispec) + i5 = ibool(5,ispec) + i6 = ibool(6,ispec) + i7 = ibool(7,ispec) + i8 = ibool(8,ispec) + + if (NGNOD == 27) then + i9 = ibool(9,ispec) + i10 = ibool(10,ispec) + i11 = ibool(11,ispec) + i12 = ibool(12,ispec) + i13 = ibool(13,ispec) + i14 = ibool(14,ispec) + i15 = ibool(15,ispec) + i16 = ibool(16,ispec) + i17 = ibool(17,ispec) + i18 = ibool(18,ispec) + i19 = ibool(19,ispec) + i20 = ibool(20,ispec) + i21 = ibool(21,ispec) + i22 = ibool(22,ispec) + i23 = ibool(23,ispec) + i24 = ibool(24,ispec) + i25 = ibool(25,ispec) + i26 = ibool(26,ispec) + i27 = ibool(27,ispec) + endif + +! for the six faces below it is important to make sure we write the four points +! in an order for which the normal to the face points outwards + +! test face 1 (bottom) + if (z(i1) > limit .and. z(i2) > limit .and. z(i3) > limit .and. z(i4) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i4,i3,i2,i1 + else + write(24,"(10(i9,1x))") ispec,i4,i3,i2,i1,i11,i10,i9,i12,i21 + endif + endif + +! test face 2 (top) + if (z(i5) > limit .and. z(i6) > limit .and. z(i7) > limit .and. z(i8) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i5,i6,i7,i8 + else + write(24,"(10(i9,1x))") ispec,i5,i6,i7,i8,i17,i18,i19,i20,i26 + endif + endif + +! test face 3 (left) + if (z(i1) > limit .and. z(i4) > limit .and. z(i8) > limit .and. z(i5) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i1,i5,i8,i4 + else + write(24,"(10(i9,1x))") ispec,i1,i5,i8,i4,i13,i20,i16,i12,i25 + endif + endif + +! test face 4 (right) + if (z(i2) > limit .and. z(i3) > limit .and. z(i7) > limit .and. z(i6) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i2,i3,i7,i6 + else + write(24,"(10(i9,1x))") ispec,i2,i3,i7,i6,i10,i15,i18,i14,i23 + endif + endif + +! test face 5 (front) + if (z(i1) > limit .and. z(i2) > limit .and. z(i6) > limit .and. z(i5) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i1,i2,i6,i5 + else + write(24,"(10(i9,1x))") ispec,i1,i2,i6,i5,i9,i14,i17,i13,i22 + endif + endif + +! test face 6 (back) + if (z(i4) > limit .and. z(i3) > limit .and. z(i7) > limit .and. z(i8) > limit) then + if (NGNOD == 8) then + write(24,*) ispec,i3,i4,i8,i7 + else + write(24,"(10(i9,1x))") ispec,i3,i4,i8,i7,i11,i16,i19,i15,i24 + endif + endif + + enddo + + close(24) + + print *,'File "free_or_absorbing_surface_file_zmax" has been successfully created' + print * + + end program create_database_files_for_external_faces_of_the_3D_mesh + diff --git a/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/create_pressure_plane_wave_with_Hamming_window_00deg_for_crack.f90 b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/create_pressure_plane_wave_with_Hamming_window_00deg_for_crack.f90 new file mode 100644 index 000000000..6c62971d2 --- /dev/null +++ b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/create_pressure_plane_wave_with_Hamming_window_00deg_for_crack.f90 @@ -0,0 +1,47 @@ + + program create_Hamming_window + + implicit none + + integer, parameter :: NSOURCES = 1000 + + double precision, parameter :: xs_min = 0.020d0 + double precision, parameter :: xs_size = 0.010d0 + + double precision, parameter :: factor_max = 1.d10 + +! pi + double precision, parameter :: PI = 3.141592653589793d0 + + integer :: isource + + double precision :: x,hamming + + do isource = 1,NSOURCES + +! Hamming apodization window +! see e.g. http://docs.scipy.org/doc/numpy/reference/generated/numpy.hamming.html +! and http://www.mathworks.fr/fr/help/signal/ref/hamming.html + x = dble(isource - 1) / dble(NSOURCES - 1) + hamming = 0.54d0 - 0.46d0*cos(2*PI*x) + + write(*,*) '# source ',isource + write(*,*) 'source_surf = .false.' + write(*,*) 'xs = ',xs_min + x * xs_size + write(*,*) 'zs = 0.075' + write(*,*) 'source_type = 1' + write(*,*) 'time_function_type = 1' + write(*,*) 'name_of_source_file = YYYYYYYYYYYYYYYYYY' + write(*,*) 'burst_band_width = 0.' + write(*,*) 'f0 = 0.5d6' + write(*,*) 'tshift = 0.d0' + write(*,*) 'angleforce = 0.0' + write(*,*) 'Mxx = 1.' + write(*,*) 'Mzz = 1.' + write(*,*) 'Mxz = 0.' + write(*,*) 'factor = ',factor_max * hamming + + enddo + + end program create_Hamming_window + diff --git a/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/maillage_crack_water_20_mm_thick_et_maille_par_25_elements_donc_element_size_=_0.02_sur_25_=_0.00080_=_0.8_mm.txt b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/maillage_crack_water_20_mm_thick_et_maille_par_25_elements_donc_element_size_=_0.02_sur_25_=_0.00080_=_0.8_mm.txt new file mode 100644 index 000000000..0d5233a94 --- /dev/null +++ b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/maillage_crack_water_20_mm_thick_et_maille_par_25_elements_donc_element_size_=_0.02_sur_25_=_0.00080_=_0.8_mm.txt @@ -0,0 +1,11 @@ + +- cluster CPU + +- email SolTechnic + +========================= + +- maillage crack (water 20 mm thick et maille par 25 elements, donc element size = 0.02 sur 25 = 0.00080 = 0.8 mm) + +-relecture articles Sharham et Alexis + diff --git a/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/maillage_du_crack_newer_upwards_OK_avec_petit_mailleur_ecrit_par_Dimitri.pdf b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/maillage_du_crack_newer_upwards_OK_avec_petit_mailleur_ecrit_par_Dimitri.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9bfbd185c438b3baa772aa9a2b9bc5b8f8dc7398 GIT binary patch literal 18269 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 0.085d0 - geomtol .and. z(ibool(4,ispec)) > 0.085d0 - geomtol) then +! ispec_free_surface_found = ispec_free_surface_found + 1 +! ! 'acoustic_surface' contains 1/ element number, 2/ number of nodes that form the free surface, +! ! 3/ first node on the free surface, 4/ second node on the free surface, if relevant (if 2/ is equal to 2) +! write(20,*) ispec,' 2 ',ibool(3,ispec),ibool(4,ispec) +! endif +! enddo +! if (ispec_free_surface_found /= nx_base + nx_base) stop 'error in detecting acoustic free surface' + close(20) + + open(unit=20,file='DATA/axial_elements_file',status='unknown') + write(20,*) '0' ! create an empty file (file listing zero elements) + close(20) + + open(unit=20,file='DATA/absorbing_surface_file',status='unknown') +! write(20,*) '0' ! create an empty file (file listing zero elements) + +! count the number of absorbing edges + ispec_absorbing_surface_found = 0 + do ispec = 1,nspec + if (x(ibool(1,ispec)) < geomtol .and. x(ibool(4,ispec)) < geomtol) & + ispec_absorbing_surface_found = ispec_absorbing_surface_found + 1 + if (x(ibool(2,ispec)) > 0.050d0 - geomtol .and. x(ibool(3,ispec)) > 0.050d0 - geomtol) & + ispec_absorbing_surface_found = ispec_absorbing_surface_found + 1 + + if (z(ibool(1,ispec)) < geomtol .and. z(ibool(2,ispec)) < geomtol) & + ispec_absorbing_surface_found = ispec_absorbing_surface_found + 1 + if (z(ibool(3,ispec)) > 0.085d0 - geomtol .and. z(ibool(4,ispec)) > 0.085d0 - geomtol) & + ispec_absorbing_surface_found = ispec_absorbing_surface_found + 1 + enddo + write(20,*) ispec_absorbing_surface_found + +! write the absorbing edges +! ! 'absorbing_surface' contains 1/ element number, 2/ number of nodes that form the free surface, +! ! 3/ first node on the free surface, 4/ second node on the free surface, if relevant (if 2/ is equal to 2) + do ispec = 1,nspec + if (x(ibool(1,ispec)) < geomtol .and. x(ibool(4,ispec)) < geomtol) then + write(20,*) ispec,' 2 ',ibool(1,ispec),ibool(4,ispec),ILEFT + endif + + if (x(ibool(2,ispec)) > 0.050d0 - geomtol .and. x(ibool(3,ispec)) > 0.050d0 - geomtol) then + write(20,*) ispec,' 2 ',ibool(2,ispec),ibool(3,ispec),IRIGHT + endif + + if (z(ibool(1,ispec)) < geomtol .and. z(ibool(2,ispec)) < geomtol) then + write(20,*) ispec,' 2 ',ibool(1,ispec),ibool(2,ispec),IBOTTOM + endif + + if (z(ibool(3,ispec)) > 0.085d0 - geomtol .and. z(ibool(4,ispec)) > 0.085d0 - geomtol) then + write(20,*) ispec,' 2 ',ibool(3,ispec),ibool(4,ispec),ITOP + endif + enddo + + close(20) + + open(unit=20,file='DATA/Surf_acforcing_Bottom_enforcing_mesh',status='unknown') + write(20,*) '0' ! create an empty file (file listing zero elements) + close(20) + + open(unit=20,file='DATA/absorbing_cpml_file',status='unknown') + write(20,*) '0' ! create an empty file (file listing zero elements) + close(20) + + open(unit=20,file='DATA/courbe_eros_nodes',status='unknown') + write(20,*) '0' ! create an empty file (file listing zero elements) + close(20) + + +! save the mesh in Gnuplot format for verification + call save_gnuplot_file(x,z,nglob,ibool,ngnod,nspec) + + print *,'done creating and saving the 2D mesh' + +!! DK DK +!! DK DK also save a 3D mesh, by extending the mesh identical to itself in the third direction +!! DK DK + + print *,'creating and saving the 3D mesh...' + print *,'the 3D mesh contains ',nglob * (ny + 1),' unique points, and ',nspec * ny,' elements' + +! create SPECFEM3D_Cartesian mesh file for the points + open(unit=20,file='DATA_3D/nodes_coords_file',status='unknown',action='write') + write(20,*) nglob * (ny + 1) + ipoin3D = 0 + do iy = 1,ny + 1 + y = (iy - 1) * deltaY + do ipoin = 1,nglob + ipoin3D = ipoin3D + 1 + write(20,*) ipoin3D,x(ipoin),y,z(ipoin) + enddo + enddo + close(20) + + open(unit=20,file='DATA_3D/mesh_file',status='unknown') + write(20,*) nspec * ny + ispec3D = 0 + do iy = 1,ny + do ispec = 1,nspec + ispec3D = ispec3D + 1 +! the 3D element is created by using the 2D element, and the 2D element of the next plane in the Y direction, +! which is nglob grid points further in the list of points, due to the fact that to create the 3D mesh +! we extend of the 2D mesh (which contains nglob points) identical to itself in the third direction. +! To get the point order right, see file numbering_convention_8_nodes.png + write(20,*) ispec3D,ibool(1,ispec) + (iy-1) * nglob,ibool(2,ispec) + (iy-1) * nglob, & + ibool(2,ispec) + iy * nglob,ibool(1,ispec) + iy * nglob, & + ibool(4,ispec) + (iy-1) * nglob,ibool(3,ispec) + (iy-1) * nglob, & + ibool(3,ispec) + iy * nglob,ibool(4,ispec) + iy * nglob + enddo + enddo + close(20) + + open(unit=20,file='DATA_3D/materials_file',status='unknown') + ispec3D = 0 + do iy = 1,ny + do ispec = 1,nspec + ispec3D = ispec3D + 1 + write(20,*) ispec3D,imat(ispec) + enddo + enddo + close(20) + + print *,'done creating and saving the 3D mesh' + + end program mesh_a_Y_shaped_crack + +!--------- + + subroutine generate_region(ip1,ip2,ip3,ip4,nx,nz,ispec,ipoin,xnpgeo,znpgeo,material_number,x,z,imat,nspec,NGLOB_MAX, & + region_number,big_X_offset) + + implicit none + + integer :: ip1,ip2,ip3,ip4,nx,nz,ispec,ipoin,material_number,region_number + double precision :: big_X_offset + +! points defining the different regions to mesh + double precision, dimension(31) :: xnpgeo,znpgeo + + double precision :: ratio_ix,ratio_iz,ratio_ixplus1,ratio_izplus1 + double precision :: x1,z1,x2,z2,x3,z3,x4,z4 + double precision :: xbackup1,zbackup1 + double precision :: xbackup2 + double precision :: big_offset_local + + integer :: ix,iz + + integer :: nspec,NGLOB_MAX + double precision, dimension(NGLOB_MAX) :: x,z + integer, dimension(nspec) :: imat + +! introduce split nodes on the crack or not (if not, the crack becomes invisible i.e. it does not exist any more +! and the layers that contain it become homogeneous and continuous; this is useful to provide a reference solution to compare to) + logical, parameter :: INTRODUCE_SPLIT_NODES_ON_THE_CRACK_UGLY = .true. + + if (INTRODUCE_SPLIT_NODES_ON_THE_CRACK_UGLY) then +! big_offset_local = 0.03d0 * (50.d0/1000.d0/64.d0) !! 3% of average size of an element + big_offset_local = 0.0003d0 * (50.d0/1000.d0/64.d0) !! 0.03% of average size of an element + else + big_offset_local = 0.d0 + endif + +!! DK DK YYYYYYYYYYYYYYYYYYYYYY + if (INTRODUCE_SPLIT_NODES_ON_THE_CRACK_UGLY) then + if (region_number == 5) then + xbackup1 = xnpgeo(ip3) + xnpgeo(ip3) = xnpgeo(ip3) - big_offset_local + endif + + if (region_number == 7) then + xbackup1 = xnpgeo(ip2) + xnpgeo(ip2) = xnpgeo(ip2) - big_offset_local + xbackup2 = xnpgeo(ip3) + xnpgeo(ip3) = xnpgeo(ip3) - big_offset_local + endif + + if (region_number == 9) then + xbackup1 = xnpgeo(ip2) + xnpgeo(ip2) = xnpgeo(ip2) - big_offset_local + endif + + if (region_number == 10) then + xbackup1 = xnpgeo(ip1) + zbackup1 = znpgeo(ip1) + xnpgeo(ip1) = xnpgeo(ip1) + big_offset_local + znpgeo(ip1) = znpgeo(ip1) + big_offset_local + endif + endif +!! DK DK YYYYYYYYYYYYYYYYYYYYYY + + do iz = 0,nz-1 + do ix = 0,nx-1 + +! generate one more mesh element + ispec = ispec + 1 + +! store the material number + imat(ispec) = material_number + + ratio_ix = ix / dble(nx) + ratio_iz = iz / dble(nz) + + ratio_ixplus1 = (ix+1) / dble(nx) + ratio_izplus1 = (iz+1) / dble(nz) + +! point 1 + call interpolate_bilinear(x1,z1,ip1,ip2,ip3,ip4,xnpgeo,znpgeo,ratio_ix,ratio_iz) + +! point 2 + call interpolate_bilinear(x2,z2,ip1,ip2,ip3,ip4,xnpgeo,znpgeo,ratio_ixplus1,ratio_iz) + +! point 3 + call interpolate_bilinear(x3,z3,ip1,ip2,ip3,ip4,xnpgeo,znpgeo,ratio_ixplus1,ratio_izplus1) + +! point 4 + call interpolate_bilinear(x4,z4,ip1,ip2,ip3,ip4,xnpgeo,znpgeo,ratio_ix,ratio_izplus1) + +! shift the points to introduce split nodes automatically if needed + if (region_number == 5 .or. region_number == 7 .or. region_number == 9) then + ! right edge of the region left of the crack, shift the two points that are on the IRIGHT edge of the element, + ! which corresponds to the crack + if (ix == nx-1) then + x2 = x2 + big_X_offset + x3 = x3 + big_X_offset + endif + endif + + if (region_number == 11) then + ! left edge of the region right of the crack, shift the two points that are on the ILEFT edge of the element, + ! which corresponds to the crack + if (ix == 0) then + ! use a negative sign this time, because the center point of the Y of the crack needs to be split twice, + ! once to the right and the second time to the left, since that particular point is shared between three branches + ! of the crack instead of shared between only two side + x1 = x1 - big_X_offset + x4 = x4 - big_X_offset + endif + endif + +! save the points created + x(ipoin+1) = x1 + z(ipoin+1) = z1 + + x(ipoin+2) = x2 + z(ipoin+2) = z2 + + x(ipoin+3) = x3 + z(ipoin+3) = z3 + + x(ipoin+4) = x4 + z(ipoin+4) = z4 + + ipoin = ipoin + 4 + + enddo + enddo + +!! DK DK YYYYYYYYYYYYYYYYYYYYYY +! restore the right geometrical position of the nodes, after having introduced the splitting above + if (INTRODUCE_SPLIT_NODES_ON_THE_CRACK_UGLY) then + if (region_number == 5) then + xnpgeo(ip3) = xbackup1 + endif + + if (region_number == 7) then + xnpgeo(ip2) = xbackup1 + xnpgeo(ip3) = xbackup2 + endif + + if (region_number == 9) then + xnpgeo(ip2) = xbackup1 + endif + + if (region_number == 10) then + xnpgeo(ip1) = xbackup1 + znpgeo(ip1) = zbackup1 + endif + endif +!! DK DK YYYYYYYYYYYYYYYYYYYYYY + + end subroutine generate_region + +!--------- + + subroutine interpolate_bilinear(x,z,ip1,ip2,ip3,ip4,xnpgeo,znpgeo,gamma_interp_x,gamma_interp_z) + + implicit none + + integer :: ip1,ip2,ip3,ip4 + +! points defining the different regions to mesh + double precision, dimension(31) :: xnpgeo,znpgeo + + double precision :: gamma_interp_x,gamma_interp_z + double precision :: x,z + double precision :: val1,val2,val3,val4 + + ! interpolation rule + val1 = xnpgeo(ip1) + val2 = xnpgeo(ip2) + val3 = xnpgeo(ip3) + val4 = xnpgeo(ip4) + x = val1 * (1.d0-gamma_interp_x) * (1.d0-gamma_interp_z) + & + val2 * gamma_interp_x * (1.d0-gamma_interp_z) + & + val3 * gamma_interp_x * gamma_interp_z + & + val4 * (1.d0-gamma_interp_x) * gamma_interp_z + + val1 = znpgeo(ip1) + val2 = znpgeo(ip2) + val3 = znpgeo(ip3) + val4 = znpgeo(ip4) + z = val1 * (1.d0-gamma_interp_x) * (1.d0-gamma_interp_z) + & + val2 * gamma_interp_x * (1.d0-gamma_interp_z) + & + val3 * gamma_interp_x * gamma_interp_z + & + val4 * (1.d0-gamma_interp_x) * gamma_interp_z + + end subroutine interpolate_bilinear + +!------------------------- + +!!! this is adapted from src/meshfem2D/save_gnuplot_file.f90 of SPECFEM2D to display the mesh in Gnuplot format + + subroutine save_gnuplot_file(x,z,nglob,ibool,ngnod,nspec) + +! creates a Gnuplot file that displays the grid + + implicit none + + integer :: ngnod,nspec,nglob + integer, dimension(ngnod,nspec) :: ibool + double precision, dimension(nglob) :: x,z + + ! local parameters + integer :: ispec,ier + + open(unit=20,file='gridfile.gnu',status='unknown',iostat=ier) + if (ier /= 0) stop 'Error opening gnuplot file for writing: gridfile.gnu' + + do ispec = 1,nspec + + ! draw horizontal lines of the grid + write(20,*) sngl(x(ibool(1,ispec))),sngl(z(ibool(1,ispec))) + write(20,*) sngl(x(ibool(2,ispec))),sngl(z(ibool(2,ispec))) + write(20,10) + + write(20,*) sngl(x(ibool(3,ispec))),sngl(z(ibool(3,ispec))) + write(20,*) sngl(x(ibool(4,ispec))),sngl(z(ibool(4,ispec))) + write(20,10) + + ! draw vertical lines of the grid + write(20,*) sngl(x(ibool(1,ispec))),sngl(z(ibool(1,ispec))) + write(20,*) sngl(x(ibool(4,ispec))),sngl(z(ibool(4,ispec))) + write(20,10) + + write(20,*) sngl(x(ibool(2,ispec))),sngl(z(ibool(2,ispec))) + write(20,*) sngl(x(ibool(3,ispec))),sngl(z(ibool(3,ispec))) + write(20,10) + + enddo + + close(20) + + 10 format('') + + ! create a Gnuplot script to display the grid + open(unit=20,file='plot_gridfile.gnu',status='unknown',iostat=ier) + if (ier /= 0) stop 'Error saving plot_gridfile.gnu file' + + write(20,*) '#set term wxt' + write(20,*) 'set term x11' + write(20,*) 'set term qt' + write(20,*) + write(20,*) '#set term postscript portrait color solid "Helvetica" 22' + write(20,100) '#set output "maillage_du_crack_newer_upwards_OK_avec_petit_mailleur_ecrit_par_Dimitri.ps"' + write(20,*) + + ! use same unit length on both X and Y axes + write(20,*) 'set size ratio -1' + + ! size of our model + write(20,*) 'set xrange [0:0.050]' + write(20,*) 'set yrange [0:0.085]' + + ! draw rectangles showing the water and steel layers + write(20,*) 'set object 1 rect from 0,0.065 to 0.050,0.085 fc rgb "#99FFFF" back' + write(20,*) 'set object 2 rect from 0,0.035 to 0.050,0.050 fc rgb "#888888" back' + write(20,*) 'set object 3 rect from 0,0 to 0.050,0.015 fc rgb "#888888" back' + + write(20,*) 'plot "gridfile.gnu" title "" w l lc black' + write(20,*) 'pause -1 "Hit any key..."' + close(20) + + 100 format(a200) + + end subroutine save_gnuplot_file + +! +!----------------------------------------------------------------------- +! + + subroutine rank(A,IND,N) +! +! Use Heap Sort (p 233 Numerical Recipes) +! + implicit none + + integer N + double precision A(N) + integer IND(N) + + integer i,j,l,ir,indx + double precision q + + do j = 1,N + IND(j)=j + enddo + + if (n == 1) return + L=n/2+1 + ir=n + 100 continue + if (l > 1) then + l=l-1 + indx=ind(l) + q=a(indx) + ELSE + indx=ind(ir) + q=a(indx) + ind(ir)=ind(1) + ir=ir-1 + if (ir == 1) then + ind(1)=indx + return + endif + endif + i=l + j=l+l + 200 continue + if (J <= IR) then + if (J < IR) then + if (A(IND(j)) < A(IND(j+1))) j=j+1 + endif + if (q < A(IND(j))) then + IND(I)=IND(J) + I=J + J=J+J + ELSE + J=IR+1 + endif + goto 200 + endif + IND(I)=INDX + goto 100 + + end subroutine rank + +!----------------------------------------------------------------------- + + subroutine swap(a,w,ind,n) +! +! Use IND to sort array A (p 233 Numerical Recipes) +! + implicit none + + integer n + double precision A(N),W(N) + integer IND(N) + + integer j + + W(:) = A(:) + + do j = 1,N + A(j) = W(ind(j)) + enddo + + end subroutine swap + +!----------------------------------------------------------------------- + + subroutine iswap(a,w,ind,n) +! +! Use IND to sort array A +! + implicit none + + integer n + integer A(N),W(N),IND(N) + + integer j + + W(:) = A(:) + + do j = 1,N + A(j) = W(ind(j)) + enddo + + end subroutine iswap + diff --git a/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_downwards.svg b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_downwards.svg new file mode 100644 index 000000000..fca63072e --- /dev/null +++ b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_downwards.svg @@ -0,0 +1,496 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + y + z + 1 + + 2 + + 3 + + 4 + + Water + + + + + + + + + diff --git a/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_downwards_with_19_regions.png b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_downwards_with_19_regions.png new file mode 100644 index 0000000000000000000000000000000000000000..8842b9bc9fe48ed2e131d4f3ef368f8cbadd90f0 GIT binary patch literal 54922 zcmXtA1z1$y(_Tc85Mc>Xnx!NJk#2-VN>VzdySq_AmX;RjZV-@8L0Y;S>F%ZDJN*97 zM?5T-yZ4@Z&di*5-g$>01vv?9Okzw31cEIk30HzZP_-bCht=p0z>!qnGg|Ni%|J#1 z4!OJkOl!=I21hXLBsCl%5G?%rZxqOnq~{O_B}5ATR@rTOXU^5@!`Rj1gLOJ?sgbuo zs$zykKb4z9d#teHU>{$+fpfhfphuuS5^pc{q(N%9<=+KmP;wN6SRf!2rh=b9jc5ClP~w2wd=6i;lg6|7oD_ZYVJ| z>>)T{H-k`shkwHt$6JHm8$b=aT$8*}_+Xku`2Wu5H8sX~7xv%Pd0|e{;kZm-&cUsC zU`_%OU8xd?E%y80_j-Ac(Ph;&?ys>}mBb#Q5D|NCNe~-SDBm|~qrzbHvhs(sU7c79 z3=AwT8w_G!1qXSn>iYtvWrB%(Pr_S{|0bWY_zpjUK>V=a{!drXH4+D?ikMNV%XboK zr!-zX70h;5E@Y%`Egv2bx)51(*Y#SphWmrtea?Wj@kW zP?3-NMYVL!VD6|rm%?V@wEDtDbU(|~q|sqr4H27hhXQGNR900Wdo0!@4W-(Ge%9K4 z;aa`w(i>;3dUrxb-|c-M(i4>}Y^SQDB2E`if4XT~tEH%TJ1J(!>`LLe#Jep4rc)cg zEo5(J1zj-$S3njX-IdjJ=0IGkS6^=HhrORwg`UYa{YYXE^zr1rrUI>py`*jbL`3Wht4i{I@(8T9HnzS?1TQ?}UBs z!ZLF;&0{IwlXD0Z**~l!0*k&La&ZT^A+{N8B@-JK})?Rti zpNe%pfcRa({rkU5Aar(G=BBju3@^DIMga;_jOTMD}2Fa;ACef=JXPrrvl$-VR4BncpwEV4(GK?t8zeV;K=#*08>wI z?~X7V_t~1B?``U8Ngs+CFeo*;oXaP7=3t7+MT(!2^LcUPmi_#>cvqx~J9E+&Tv|D; zMM7I`K9lYlp}X-Ocp0mKYTN;}D7g5*N6)(`8}Gn5Z3tXm zQNNkGGfBke^ImfSkCnwk!@xq1VB{X1v|h8KAvv5I%oE8w{|pEJ?-J-K7E4(Y=V2~A zgX+Q@4x|2l5W-8~v$NrjYfyt?Hn-3rL;6P#ITkrebdEph>kHj2Zcmh4*CSbbb#^`g zGqLHBI!0%+c#_gOApG%9*I`n}(NXz=&&4O-gWy#?&7AjtTsH01a!WQuz~FijgS@== zqV6`A=8lzI+Sgv31{>>re_x$L*g=0{KEpzsjP_r^8Z$k)UqMsg zNw1%@nQNC_V`UC008icC+AofPyP`n+v>fv;pJqcQ4qXWnGa?PfaG zT8rD%)L6X-AMH`#lcs$iC*UGAocYxClXF4$e%*l{oX@q&z&Xo?s>kf`qDGbT^(_E$7K z5P4JUb^Qg$k@(d=N+@#E)3#zwaRZpHooi@~&Q1*ozH|inXb~LdJNhviZ~-40={Qy1^gRwo)V_Xl>ZMiKYR6(Not%fivGMq;$=v%<1&yf2-Cy_T;NZ`u zo2XZ=iJZ0xlexlmU}6Nmj%qN;{Ite!d!0Gt#)tG@-Me?%W*IOYHLUBa=xiWhPE-~9 zg1vppON%Z(BKb9;H!$ZELMWdlITcLwKpO_d$GhX!(`TXEVM5?uILm)X?=L2qGgcUE1yO1g>>Mi*^9-#fr^and%)GIw+RphTzMYokS1ru_x% z$Hm`};+bC(U?=m-b$BV!HH|?7LdhNr`|@Q@*u=%I_Z7C+zwC)2VKDnc(DY~!l8E>Z z1fH~ork)?T3KuQkrGPlZ_R`567h*C4BB zv6H!X{!$}+oh}mhPujVxmI~#K81##!T~v*cUig!R5+sFc!~NaC(NQ`$L|ye60cnQv zWkv{?ch3VRWvpOyGRSd`H}((|j3^A?fwtzn|AB)bXnF-0o-qc*%@0Jt z>xS9SpBow)X8(KPm8`0zs;jB0lrd%=f{DdJEbH#BAthDzwzL_!Y0B}8knl)8Tltca z023C~z1q~|1E+~CM?pcsR{rGUbGzmXe%{`qfS1_H1!-yD(iU;!V*jZ?{OZvk-2qTvx1 zT>;-i(dq1v%_)rpmZslIZ+&#Z*X2b87lq2@C8zZ?vp|M996n;wmzkkiWey#yGcM%9 z48YN~hvZ?rTly7C3x+GwIApmh(#DPzx-%gRmdt+DSzZJRA0b~Kew=J)KW zQ-nqO2Xcp5jL{VsZ;uzxR9aKukCd^O2SFBbRT&xYK>;LheKN0M2cVHaoLw0~`<;{g z<<0ehEnE2=M;L?H8w{xzQLq2Jp{e!$qA%GqYq3shJD0{i*Q8H#ESnh=3iqIX@xJ<2 z!-hl_#yV`qpn)~~%N7$P zY1)94w=8nfvP{E7H783*Gz^Dw+iKc2k>owy8h_QK6>&~(-^lN}mve$_o56rEdZ#;& z3y9)_br5;=l7(fu(Q&(~IMH=)(&1wGkv+YlWVf2MbX<(mk-n5Y|3jx@)(yBrP-Ed6 zsQHuXyBGPbB7|s+BOe0%_Lm=BxZhb#oe#u?!T*$7IlW)s6U1A>!vnDCL;iz9E>uYF zDmwDsl8%!E?2Tr|o2#tnybeTy#cD;qN_IyH%lMS@E2jOS?vQx_qhPo=;F{w4kvA){ z>cPmZkdV@IqFg{PHfA{J(Re#KBnF`25ta)BhSWr0wiB_b|7hctLy8xKbN-m)tDPSR-O{u}S#KS%1jfu z2mY$%%iPZnoU;K8Q&S14EIzi~^b{v@J7*jC11A)(pO0aq2!z75!v{M?ewIIk>@c#j zUY%~s$9uhLrW7tMF!a*EM5ZgyGC={!g{=h{X1}18% z)?21iPAA3lcI>U#J4%*^2Wj`<6_V!-CX?55d|73exfA!%l|l_`{^|xJ(Ro|T><=fi zH;N@+-}ErZf7tZH@4WSNJL+=THB3oBV(M25Kq5dyhbYuzVjb&wUexOO=;|LUCiu5{ z=a=DSwv{0CU;YUc^~!4%Nmz~1(9I9-OBkU~^>Xr>BtF6Slkg&RQVp;G@D$P%GdGj! zWhDxrX4rn_6Ha6%oexcWOJ?tJq>`hr#hN@Xp;N8DG;#wE5)p#lzKTxv!v`HQZ$3Az zGVs?;vT)2!*!6kvLAIo@0qq8jYwKWf&{tmKIwjF|J|_&n$Kw9s%6UzWdBuu`AosNE zTu=4pxhV^}wo{3XH8Vu>;P>`-_`}8UtneKJQ(@R2Ko888 zuS8$i-q?nB8x>qXiqS+ItO+ z8F-6T@0#$uw?#ul}IVXH4itlMDc0|rA#xVnK4sa_oP7xCm31-J*ITMF{M_9NC}EhD_Gybc&1 z>oChf|L$_<)8>;_C%|cF;U-Z3(KLiC&NOV^as0sCj#I_{Ms~uIE;KrO*FQH_*mUK( zP3MH=#}D_H>wy}OQ$a}iz8QFPi@Zx0+8`{&-;_rw=XcffMYhPbhVRIh!&7Tt`~>h<778ffSpM|i zBXmgVM2_|2?Rt+tkooJ}b_*dTbE(6y?U(A}~Z z=!q~fj{x#y36I`y6A*>q=37?RJX0)w<;vbWNUPiPF=MG`;V}W`qq;{e?YySsRO7^` zesEXI~YuciBHAf;Q5*{d3H&1J9zK zE?whfAX!n?1;1lyJ<{ofl$yQ^xg=Jrvg&FwwE0X3DP@6=#RVoXzAux zw4tte|GE_M2VX(|#Z6d>;t}9Tj5qNwm%$|*NxAijXeu3)8 zbpP~rO}QyPhhul%AG--G!km~>OJXzR%BsD&zayv&A+A*R(#RLUnOfMEH+g%T^@wl> zTf8QWGENLGSsy!NHi}Q|9bySzpxrU^zAsLtI-|=b`oN&{l_f`6-dy|_cj9nx zfz$?!^r77{Vvu3X^mPO-96U!L(Y%QFsI^}r>ld%N$b=_Y1L!3 zOMktqQ+y|JyrJ-P?q%CNJA^!3KS?Q_*b>AZC_v77DQA1X4dZn^R+Dog`*I9sC_obr`ZU-G9-CC}C~9dl9?bmg7ROy#cP>m)SVwRDw7v3~yB_ zXaNsB-FWwxUPd)-0V04#FJbm3p#T#TWHk_r061)O#`fca4{All8`aWF8{p;rNkZK> z)8-jT!CIbcjM)TvY4@8XwcfKE`jiflN5IRJQocGpSiAk>v?GB0w@ED_ugvH@`UO*6)*_IWTqPH5$k`XS`m1P+teH<> zuqdg#Poc^V;3mE=q{@`1Snw5t!h@Z_D#4P&j@Y;YIK!WFd7U64mksJq;S>+t_Tn8$ zs9TtOr$f;D-ljVf+yi5~4AtTp!L#c^*3e|-!Tby24B?ntNql2?KE;!MoT3e=arphB*j3h z2T-bk0C$AhYsK1IRr;8XJZ1S+kIrYSk~C3rWph{a(O&Y+pUQMR4;;}Ti}~um3*n67 z{z^g0@^u!es1SuO1G)SZ{Md+hxM7sA45y4@I0N`JcacxyR!Wb?yux2GOml}=QV1vQx1iZ&j{e>Rm?C`o#uAUFIf$eK7DLSw9qo=TOtv`WM zl#HayRjRgV(JGpl62_S9U>c-F)=YgQ`1`_e}K zs3FMNd7Y2c<>aak?h?n5_7i99)_hk5dw7}*9!cw~mzYc&Ri z(!Kd1X$y-EdP4VRwyCf*S^k46Z1W?>y!dEP9*LqWOqeA7WmO2uf$lx*4|#LggC8|V z`PF!e%bNd}`HVh@$!l>tMWG+^I|q^lV^e(gL_MZKn$KOLSKLjT(8fastvxkOfy2Vg z@TSU*x4CvR_~8qLWFz^tKXuD`^>0!iy zToy@A^5xmt4GqjU*R>%;!z@|3I?XPt9bttNCAv-aH=6eL>4`2;N}D9)LmaRS^N_sp zR~edss-1%sI9He`zNwwPe0>oqHfD+rn7@N9gaV8X7DEZr@yfq6A4eyLDBtCugl$gp z<`|mFdD`0#g>9>q>NF-L*bDOWv$Jy3v$E2!o4Clyx#-%+$@R-NHu)TxGWVjPq2+)1 zjEef@^XD&s`5_79#=x;1&a-!Oa~tXS2W5<%)<~8@13QiGHJP?Wrf8)f;@fYqKjk59 zi)bRh-9!-4XIDOWK>W*^Xs$}fN#!xYvu6Y=>x4u^v9WP6ad9y*1Vn_-?q7hf*tjjO zTN`O%2{<8qt@4!z*wG`&kg}?ms?%GUpBNR=70wxNu2CPXI0X2Lpk@!Nr7Pq;7{eyc z8{Jw=TU_*m#8!y*ZbiHe$89MTwijPTug&bZPq1ITE@RFdo953b8P;S}Ns}g2U(K9K z=s9sb^}$UL*j~p*PDhW)_x#CY^K+H(7j^W<@)6j|oq|RCYjg-@|Gy-)ArLh+Dn~d@`gG+NsPx zz6mogwxCwajNCeN!~>ZA=Uw|a0|0#hf~Kj$TDKf*OCrY$!iXrwp`f%>V3aCY z3rm>Myh-OqNh_fi{gOCJU9`VgNvHObfu(5uAw6XD_r$w=c1C6VVSk7MNkQ_>8qEAv zeqm@gqpz-c{ok<3%8vK$33r79SW`z2A+tXm9sJ=&gNBS$5T1l?*;8iwWM`77oxd&g z^oJGRqKwMNsqM-!g`IN}n2+XzA-cHG;2!8SI!#&4Lr7A1yQX2M85;Jn#_@;6WqjV{ z2D;Ae<=2|li=&E1b2GoZFPD?i7Y~y@r2hb%CS>$MbbS%CeF8#Zp)R?}m?YJ?`Jo(n zw;88u>U4M*F}p{y#n#LAIAK}5{3=&Ga5r*!BjgJo3+PN7#P4`4O|&vAYtp$SI&UvW zz#?j&8rHss{VAH_BL`t?>4BW4VyT)e$$G^F4s5vHg}q?ZjsAg~0N@7{qi`XABFV1g zJ#H)rDHLIj{=s3}M)g%=|0MGL+zLzL#4XXV>&Gy(xX|RDcf`a;Qfs{LFjElZoic5k z*0Q%6hBSzyG<@11rLrZzHzvQAmwBphsrU3*vyUn8xGk6$PF=y%JKHyI??~9?Z?V_a z%)fI!C{DAxdWOvV6cuHlPgsEcB;i4duTrhcSn@gG4*aS?!KVlM;~t&B13sW&pG3YI z{jzT|kg_DMIaU<7IMMxKXSN`PM|(l2BkyTJed=2)>v+vg`5KO&R!lIzR<$MvPDC0g?LgQbQ!b+EX=jR0>7!Ij~+%i~}Y6TBv$+QfevIos>>uoV@Jf1Y-Reeq3j>bw6?6NkuUEXU{#?fPSSO9d<_idG z7<&6SH5`r(;SBkh#a%JlcGayEff0dTjFr>%boWC9c~?vvuA&an`~2S}zoU|@)+Huy zqGTQ1v#|u+e@&Zq-_8sO;%xOp+^{2=WN5B)^#SFGFh*FFL^OpUXll8~+V&&K1dVKn zbkj9mcI*bfzg?6E{S-(bJOc2C0j9!sk8ew_CjOHB?%*a8^F{>?mBx?72{ZF;BM82-C!kne$ zbJ4DCtHK_``=~hrn>*-aEti!lQ3J<0ik@Jz|BC3~$8VAO*b#>MaB;Y&>wHxqL2` zvB9hacS_xBoDeAx>9JP`fI?lAjYELbJJDyu=`PRhN54ca5H#Y5~CrD=T^(6QNFw~{3B%P zt191=I;4!AB+;cD^H}aV-9q(Me?-z`=`&W&s(Ln#_a~O0xM}> z$w{6+I&Kmw4u9wTtx5tE{{9OW?=X9e*!M!u-41xoK1j1CQ9}0YE)1?-Mg00M{9crsKVHIlj)*dcFR*sebwj%arKj- z8NgsW5C?`mAE}SK3q`330NxZVyWM_wRAp|9ZmTpyl>dT9Ii-AAPNBv*n&!-;a^Og- zEJjvPmtm{m#=`f<+qRem-(@?q{+=YIeq6{bI+GhY6%)(1B9-*8R@Ivt?SaB8zKitE znacf_m%r%4@2VXx;<+fcrUiX=&hwXqlQ{_~fR5nZhu`KDoF;hlArN?$R8s^E9v(kd zwoL~g=a;XK8cshuhh%3}HOkNQ{QEekUF=So!ocddp;1SENGI&uK!Vb6&k-ZvL<|lL zG#lo!NIZ3P)s>!VY@~z!Yl=x$5sWGK^pu6QiakC%YI~bK%v~jeqvmPqRlAaT$LMO+ zHu!G8;f}$_G)?t|Slh3%xzz?ei}dvO$)V0$nVQ>L)rKSeqboFYLCO>LtrFPK>Ht*FSe4^zfh#p|G{a+nQqUTESe+Wo5J1$DaG4J^A3z zA$35ts{|qW7{(=P+Ss+JCG!&y?m4|rbe2>X$5+*JOC%cDc(P2O`eZuA>H5@xFaaF{ zy|-FFA%3R%?JB9z6wM;*wS50;m!YMFD{)9zWFcFwS=-#=CpCgAJtF_9?;$5D*>@zOZyVAOeaxsl zvB2WOC82Y+H$`Q@m_B4C@Y6QlSw^{+3-vKhwN0(ZYDP`Ie-%A+d<^aeaScZIq)$-( z^i)vX)m0Clscvy`>w3MQC7UKTMM)$J{z;!@!!ysW+)J&S5n(CX|uXC{rLkqvCz*%0xU-m%epZ>JC zIa|1O(2Z2j9{dY$o%c9i6?=qL?9>7#^9xYX1z zF!5ZRJgf;54tgy_#m2!=B(7|E6{zBCqV>;w;JltK2)D(>?9IoY2ZW^{ieHZJZc)KV z1(Kcza{nErL2{3MOq7khnd0xJNfWLNI$ON2C}e$(NBmq$QI&w|muATmHQO>ZuwyJN zPMUG-l?nv?G&c%C&_%)t;=j2aivGyHIm$jEnJE1#!9nN~z;*UkYGd^v{E=qyny7~+ zNCxZ`70u1rdV3zAjunVFfBdKrO&6I0)dLkYomz*(%StA`E@xVe3lxZl zs3MP0*Vfllmc@l+nrJL()hnUiM5=QOB zmTXKP&hrd9-f5tV&&2-qtCX#Fg=?s`%@d4vPn;Hhj8qBrzNQW&kHvfVoad>5#tYLg z%SnkE>-{MS%@jjX!BUKmP+1G+Ml~vn*ch2Fa?PpmNhEQZ>E4 zg}gMBz}c0ZvfmKtNf^lo)!KrBLJigN67Tm0skf+sPxj|C<1@Y8PP%^2)!$am$_o3& zIg04(|29qaqFhmKlL)om`Y6a7mSeCTC(LcF?RwCX(i_h*De#Ui-gR%bc){;CwS=r0 zqt%ZF*+L)fxJ1v9I@&ko?LVQ0Jb}COwazzndR4a-n;po)>uBbiwRQcoh<19(;^8Nx zjIUv%qYLV}CW{K4Fww6=$W1lY_=5e(DId7m6Rghqr!AHk6t~565_uC7rtppR^#z8i z8Bput-Szz7f*yfx{p7_$|35&89pOA9hms3=d=m~D^y*U)1Sut8xv{s$ZyOx1;)aLu z-cp=-%yr{S$ffWcU6@i-Srgst9G8YZ=aq8{cGBzVcb#|Z?neP7vQwO&HQOaDt<xltP5dX{1nJKQDJ+G6_J7keYym)LXV)vHf-xd-`Rv$fv6 zB&B^qu^xZt7v!R$6cm-@R@g6~2h&)h;YFQga(yl7w-imABI@HT(}Q{TjoKEQ_ydew zwm%(3+SC5IO`y2FinI*7fTnk=5BO4Ahqv%?{EHAC8;GK|BA%KR@UmL}SZ`XT6ZEY( zL%pMCRnNt0X5-M@klXrN=Oa&-{ptIy=m@#zLNtd!p~Z52%I@8~RH!>Q>^LJD)Y(_9U_|EL|Vz z5}90&S=+@AHM)7VHb!?^!TpjsGN$PSZ60g|q|iEF!PXh5K3=nZDyj;GY?73JSX&~8 z<$M$c*$+E6UN#cugcB3Sp+oBqgZ_6!BbKPf7{6`BYL|*H$aRkC|oKKQ8 zBKQfgG)K%Uv4q@ie%p)n^hzf?N@de7lS}F%m*0G{eeUHoD&8CbG z)LK`mImBHi)h(w-FOM9f1C6m^719tls&Pd;vEPGN09%bqPIedCE&7(5%Ip1xmAex- zOS;l9Tew=R!r~gOM`QmfO)FnM{CjFDzspLa=|EQ9=u8Qv@cym76v^Fr@mlV56|ywQ zF!12OlW3@^IK}866^Qt9!*_uMJ)%vuQAVX%Mz&%I z5efoT$-J-@mjf~C*jrcnQ%ll$8X6kq&224hZKqqH&hm7ftMM80S6t>(jP%m`LX=WO z*R#p}(}xv6-e#~nDk*92M%LK?gmmZ8pzM7d2SWSgFZL=Q%+VaQgCoSC)R?I@m2uP{ zQ}^0ZR5y;GqBp$8lz-nU*1`XkRwefT)J-12X z1_5Sj!Bd$!`UJ!;&AzWl%X!~*mD}0hfLVIh?|U43*J!(b7yF%qa>(NA2=xaEdsu7Q z;A5gjuxj zuC_q5%^%4Lsn3xi8rYwz?5oRG+i$8cX?_-O$9>1`k9fK>^GfaI!J*>g(0{U_zp0{n zF0Q2a=>sCFEC((dC8M>|w@2j5>~$(7>RRJ|1IT&~O;;o<+Max|&kflRM^9ExpHAZ* zy}~hcBvnmLH=$N9!a?1l80;fZg@mQ zouUc%;KY*`ZyV&x>geqP36rsQpr($ggtAJ$YCwpXCte-JQ-^Yqcjy+u4c0Au5N&V4yGBf6Liy|rqi)U&&-^z{5q;r^-`A-Ne zhg~{2AiS8X$8~6lFDl6BZBdon$0eOR;1Cc(@XPXb@0P)~?}W5YgqxuqdNo@a#k@I0 zSI#J0!ENYAUDgRQWY>V&@q_hjm8(2wGpRXfuc2}kExGLT7bYv09cF64(WX=ky~{F=u2+|fe$flypB3S>sYF$8#_9qkJ`6@H~2Z)&es-S-`c zS#^1A8;SJDdixqLmd_UK?)~2MMyTxBWk{ti4?-BoK3p@p~ zw;&!Bt9bI=>CQ#`-<&UqB{r-G$wq6Ge#Z<;nEu!)3Q@X@i%8yq#akR5PiT6xj-86n zy@24RQajap_*V-%Tg%hVsv!?pd{-vczPeSzL_xSOsIcjbxao|L1I+Lrr_kcWc{5V- z-{w&D(wR*Vbt5SF|C+zAqvxeedn+r~J5UAuBAPxN!83+<+_Aje5^Iizz3ihb&c)3U z;gBy6YAY&x&bt2$dSjVU4?!ZRMW6W$vbf}rbEldj(N!~>LhF+8u)My;2*(yLJ-PA` z8<`=mSQ$h3pC9m1_L6aWsOG~%RX|LyO!S77`|h*ck`&rDuMnqH>0E_huTJLENBnON z&Ux%M5q6ZWjOkVTjU_ITgf1=*H-)=aFQfGll0-9oFJ0EqAZ{-3jSj*BTXFx!C?VZ* z7FO7-?$}|Hv_GTD$G{Ca6|%qOR%hfGGk0@V=2F7GT>MO+RBT8BSY3K3aaad{lSx9( z*MB#o<5{xf|HqFL5>9Wr-;#D_WPJ8;SCk{Ij;ywvtMkT|XNr^*CH|`0?9yHr>8Lj8 zp2hZZV0-!`x$b#uqGT}_{sc|!ta>h&&`_R|%(<4c49#@?Ro!SdG3>{d0bj2i=@6}c z*K>%?jTGVYX_a7fS|zn23A6D=iO=s@Cd?~i4KhQwfhfQhIu`8slQ*TpW)nK0Wl*hT zsqK~F43~s6c)A=^y8^M@m6FSt0E~keo1wnCRO{-v1KSeo=-6VC_t6D1np(j1l%QEL zT|v9aDgCSIS_HqNt^!qSTjJ!x63$j~&~w=%@21}727JS@ZZGZ5pG7$fBCFFXNhUg- z>V|e=YW3=UY5L{(5*&H_sE}$QRq-`+_YoXq2_BTu`-abT&*uPA&EnLPvU`pACcI`@ zvG;xzwZ^c=^Me)KpI)By6${Hs0Bb?GD@HQhjDy(s`ZlqhqS1T#QpMCcyheqHGhRP- zx~#_bqp0Q9S4tpYv+GhRdVrw_*T|TC%K-Jt5t?ntGs9 z&C^f`@v~4!pLUiA%MTVv>J$Hc?M!vpSP+EH@4DGPW!|^8gqH~7DAV(zNv7IV6!BNXyaiVYb5J>5nOj?;*~^_=dQnOv+{ia_OB9G5H zS*tqV`FEcs&?s4pX7qNb!?RxSgzCEQ$-xnq1CYh1=e(kCp;T=(dp&p+05)>LTIXgu z<-I25S_stU%JC{n=9YPRCFPt+62&n+K`t6}a9-BtTXYpL()IdpXoBN?myHD0i?}#~ z`mWye14SkM>{jmd^sw+O-A-FdoFj7*7-Oig3H2t-bk-IsUjhP0wyQfUOHRtW`#*SWMzOqs2Rw3HCSZZRFUUDjOw@w{t@g^Q8FcK&Lf69P^EAz`h#WcxWUPp(vV|k^ z(`?Bk85A=66W!ZMa}Xnf(l0b`e7pq#0C$_moHk` z-M$9JQ%ovOT9}`!ZsqK!5e;a~m6=Fsl_$qd3*J*V_ZY0L$OW5Se(?0DC?gag(lu_b z@=C*U-1_1zJp^U6ec{d)(qqUJbV6}AxArz`-4%56qG*qw2jNtwUd1&TCw|-k4Td(K z^`H0aSwtSABR%4Kq0>pyZoAW~g=#E1jSi6?{?S%h;smsIrXL^Y;_b;yNf}L7PXHgG zibX$mI1kG>o6#|!LQy3UzJtigh}WJ6P(o#4nT9oA)&K#}d~=EFgYlc%e7{zW-R$`# z3Sf}w>+rcE6qdG_Wb(H1{TV!~LMHpa4|FI47Z^wqN{H{p-gz+gmh52>_sMaEq9iN# zSq>ug=HPduL;%v14ICs*l_gC@t1;J;4}@$u>3|L7QS)opV6H`2bp9FHsTHz#a6&Zp@h zb5(DAHGCcd;iRFH=#tcKBu`K1E1QlHoZ*c|H+FCb8+CY!z)PMi*_o%~uRv04qu$)n zVT?Z0&yyj=?z6masmkl2AM&h0=h(ObSo;j7eET|?3L}y_Lb%UX4@eb3??UH36$B!3 zgBMTj^hMFIAmh*C7*l-7e91GD@mfc2`w`@ll``!t)$7-*+qm9p3U=tZhYQ7tE;b9W z>nK&0JBLFF+lhv4zIm21%i^!~Gy`5PHfCne@9O`AcG3eat~EC6IfyS2!f)i@(u6IW zCIW(2A*H^TOWUbGI738jA%69^oDtvjA{6$6q3KGSGubjoCWQEt7g)XqX?%GA<2*1t z2CZ^OGZda~Mc;Zpdo=C=TBL!)v+l!Dr7U$~;87f}t$OoXVyO^RF!42I+V7=-xML!+ z__#QMH_oGXy2-Q#GlGB=8|iS)+}}_2lCMTKmvYsu>^wT)5?tORXLGm)`W%3`H?Sdg zME%`R;!u{$cy&o1xj*H2|DgI_q7*@kvRLHaOBy~c%Ie>RSLV;NQ(2i=St~A>GlvfL z$7OHu_*u^voqOrr@PYuPyH9)qx{$=}NZMhTP>v@;uZR_;iC&6-P6FECOf3deG1THqtH@MPqshj4 zJr1dW*T}m)T^AsVDIM_i0iw@KoaeLITH5OBHDGUkt7~)GR|Fzc^))iEmLQ`N$gYkQ z&q*h%wVWnolTNybQeQ2`KWXq-UEke z-EzRb7oe~}{~=)dxNL`%il07Jek?`vUSI#MqW)W5U7P9J5ulFg?(bIiI&<5gxp#5r*=4S!1gV8QL5}xHcHdJRLhzA4}s)hMme&55(uBSa)+uP|? z@u8Snst)V6-Pg3hbIUb;0fN=Gk5#znBKwlq2M7flfhsTHcp*<}g41&Ts5@6TFQBsJ z?{$D4XsXyry6+sY^tm8!PFl~9+@kc0-7oEhimA(^^>)oAhaJHDoz(kyU}Oi z^9Lz(jQ|qHWv#F1Ar=;v-o?n}kB9l-Hr^L~0~xMjRj0#Dwh_ea`OkEpt$~cryK;vp zRyu3}^wB|xLeT{+jDr$x>}ULSy)7J$-0Fc%u|B4QYJ%iqt^o;fcRi^$thXn{Q-8iZ zw)yJ(W%95yUeL)1t17d`WoD**F|Jr(#C$Ec^YxbzxD!-weR2;Joq`Z@sCIRaLgI2r z-^=iRA8!(qI6;HdV67|XxlEC!-ynW=^s?pwLj3@dqarxn8!6>Ku32SKf4J}MxYqQ7 zbXMWx2A5eE;?>MuBKw(a?n8Ce?;tI=n(p4F|%=Z#p%rwS>GOHviOt1<}QXsZ~1(1ce$MK@E3 zj*gFyzggHXJlnbCHXaBEMF3R~spoW{V+EusQr@6NmY95qChB~`^hN7>og*StTLd@LGun^}!J_jK;adA%0@CMYLbN~}1D7mizNRoYCHtIU8t zr)9iL#5o0MV=2hU7$)xnojhO+9i}LLnFiG=1z~nsr5N517ISExw7Xim|7(3D6QWt% z-`iVA2m8zP=20OdZ3gI6S~$T8Mx9^@%Yg~Aa2@l#{Kl#A$j^nxFi<)tub=41}ZY7p*Yr|oRXZkTYJ&w~t*3@AB*WCG=AxNFC_Fk#X-00cyeT;h?I!3Lj1Tgb6m;z0b|-2}5QpfkD@ZpGN|sp~R>V zT<8#B^)o4iwA^VmQe?N&-3X*$q{#2;cyU_-GBuD zkDyxqiT6(T`d}bL;S5BGLJiB%|Mj}>$ykNs0-Yb|$Q{*(=*bmnt)$*I16-*QR$ zYFsD6eFvQ(3K4KH)eoaQ{!%}@e@aC|I^N5e0pTm$`;HpcA>LN$Pg&iEnBe~ncvtUi z4_IvGdK}M*gWaj45HwapC?5(-yfhhAhYPj>l^>AYPYlbeD61plpFy_T&zPF{l0A|T zU}vSzkfPxO0;kVif->s&y%9f+L2+fRvcr)6y*QYRJrd~jU#J6qP!ef+cWlAHOYa-a zN}E7%82|w&*Nd3h65hYdjPzysq|9tpp!y_RCq{W)Y)HsOu8vz+K*zSCB{%pZLc0mYqaZ5xbhE5Pdwq$^yd*dO* zjvvOP?D#G$-$n*+ZN*6VXwa-tx6^zdcWx6|E!-M%{~szAaRFB3^^8+S{+j;CL2N2; z`_ZJsS*~81u*PatlY)X)R~ZnNwzsyYpaJ4B&IYI&Jn=w<%mz%l`(Kml>xlawFCp?Kqhyax| zhx0)p*wzbIS74!Vr|Zdoz45HLL*LSI{Qdp$hJNVzynOYFE`tF_@a-RE<(N`kBpLM4 zW9|mq$(Jxj=9jPaPTND)`?$l&1f5R0-om6eVn^#_Jz>*e-Yh3r@P|MFadhh=>~i)0 zn7Rt6sJgB_CZ&>!pn!ma(x9L;BGL-d4N56Umo)02BB@9Vh;(VP)?T09feM3n)MqLNVSH_emqpwz9AfBV+ry3hl39nJ3K; zkB=99-KokXMDVUT>-%5_xfbg|Ow}X7IRBlM$S%-0R#s+`x8buW&=WccJk+U`)ij-CJfYUC-OgrbJaZKdrOo7<=7)ea!4kg(8jcx9D0?T@w?% zAV}ABpQW74-=SjDtLn8=8H z`<5TaA-G*_1!_#>wttg{c%njRBoWlMI0<=PV{T!dVWK4j6c(ypWbJuBA0iAtdQ5LRwi|@w-**kMDAex`z6?VPfyP;36KIa6Ie`q5JF#N{dL*El#J6r z4yGqUa;>+2m}6rgsIgI!d8|z_NoeB@fP+6!uYdE7xjv3AM+lSMy62nqkI@fPv~``U z-_w$YiE`QPZv_MeTv-~M93GJWxec*>^}G{9N*<`|Eg~)U&Mb30HLq#ox1Lay@jCwb zaG}?GD9=PnQgVW_p_DZ>nqNxmCx1BAm8_Jv^A81SZ=Q#ezWXVE z<<+M0-L2Vx!|nW0O|S4LP_vEtIXxYuJ(Gi-B-@h3nJT7|3IJCNN{d_$G7jpVhjUS+ z-$V|1Hj-bZZLCq;V+eI?fstyUX&F4wjn*4e$OSANl!wDS=&`@oJKlslhW>>knG#vpIHORyOyCsK$E` zJDCvnMRuz3d+6#b!w2LBh(esX3<@z;E6+03*Ow?AqrFWCxQ&{7D;vM>j5_Gg`nW#w zzEs7uZ>`OOAm~KltB3Z6du|8J{J0j>fdszlIH1L*YIT@ezerJQMGMXTmcIqiQrAyR1SFHsib)?s3 ztOlQubL}54Mydo}bx8u2K2nljR0OFjRzvRNeYH}g#c1PqWo?HUa10Nd)Uq}|XJnX{ z0Bk^^a-VIg>CSf3YUJDY>@Wtd4{1A0FINj3{aZ)g?LPC3TloF^7-uLPE?XO(JlsA$ z_o?~a{?igJp(fbaIv->MRm=RcAgCIbo}* zdHU`tGHoMDLKdx(-2ubMR63feKH3M|9KLH6W&B)2TMqo?mk_Z*bu+}LGIjL5BjrVY zN+1Q(*JrLT0W>3mRUHKbq*>~uFvi`lUUTWTwD$~QYskS2f^Bw?YiPW$U$_r+j@NZS zMj-MstwS}f01=SU{^CL*gs~Rn(ZWju0S9+!a$fkhBUOMPvCI07MKEyDRPwF6(Y@2&LU3hn;Twe1 zraL|b1-Zy9!ALn;{IwIZS8 zw)lJw2WIHkN(-c{tBM{7F%?TIw}t=+<%V=MV4{D7-~=3saSnXIsMR z1V8cm%Ern?O(GNJlhe|QXxU!q1H|m6{HOXc%6EKrw(gDnbb#_($_Awygr7ct_9b`s zg`rs2@tj{d??4AD(a0~gY|Rrjo*nqIthL@Z@*TE}7O#cjd0%*n7TNq)M-?q|232yG z=5U$#@G5FeTrrh;X4#nO&jR=WC{)|#@xdx|U)baRPZUsHPqJUgM=6#HQ z&?33r@bX39#0ZOBVn-val;aV#AJBgihqib1&_X{NM?{*pxn-1 zv^iB2Ytjh<=a64Px-$G-k$gHZ<~vaF3BTe)ot_OLOra0_;&1gA=-`9AHGBoB6oVHL zlzN=5&^aBeAH$C#HlIj7NJ&OC@Hf1)coo%7lcOnyGZ175ZM?SWT|Ew5E2sNk+N)-e8~`vu0^&7^=p)W zy`I*v^{2$MXUuo+CU|dzNym9%UPlKz*-XVQNBhCS!O)V`l=g$)760cx}ub*z!4(N62wS?8zQ~kAx6~_a$gMABUcU9 zqibGLQgS`zM?iqZ^Mt;|F3jub@G#G8jFOl*+iA}-f01Vjxw(qvXORL&74Og0`BL@G zTOW!!J2{1NnGB|=X4lu(o0T8+9w*MUMVifagxojODr9D5ZQGCP?CgB<`3k6@*8rz1 zEG%HXv(@eHVN|;L4PXB4{^O$qxaZ3k&&^Wjs!>o-jAZFIwYSS2SVWjdy6h)TZ+ns5 zXVEOOUg%B)e?k4TP!OwjnbY1nbcLCioa{?coxC>k$o1H%)$buxh=2^<2- z9>LduBM93(m}^W*L2*=tFW9|sfk`#1nut6O^O~8OQlTuhn5>1Hzjp0fZ@P9lmFr>0 zauF#;#42K8p=RegqKj>plM)g#O!0AX7Y4EoVLsQGRAhttba5`z%S4ozjg)&LZ|M%}H8=jO`|LX&1^A>JiJ@0Ly#pEX&-KtNQi|tlNqn>=;*IX{PoR*|P zRuPr~SSXW*AK`rV9L&tiu$P)ehk}kf6xx$}Cl-f1WV3pH1iXZfSc=gKx?M^w>7@a` zv0ugUY^tX!F)GQ0F?e6~c;RSl6j-g5NFz=_Lo~qcad=!%-n#mLUfgn_L2Jm%iYU=ps;d1Vm)zyc< zeYkRit2t)kSL4^Kj5M^g2iwc)zeR9*{>;tIaT@n-F7z~Q;%Pwx28{N+*bW;2?UfQ& zd6hF?)od>hrK{yOR;N34#XW=eiSX0~t}fothh|z(1_&!MWm#xF z1?Lm`(%cYmDj>U4>C{3SgP4KWW}Pt-a5{<|chVNb!?;X*ZgRgmlb>hYm-e#i6U2pK znenK<`};pM9ZpbSfGR`j1s?65mO2Fgu%R3L=|7{<2@}7(y`RB#m}sv^x*Towy+4O_ zja5ryKR67N6ds;KCzz$|dwM=X2+ z=Y0jE;^N}`*BzC(o@-zVa^G}`8kN8M_X_T2vex_l#Fig2<8kZdLB-tA>W+>~^?cLg z<71^TFXQe6>Rfp_IS@v}`s^;G`IDC}Y&l#_(RryqbMpHgsg%N76uhK<=GS_jL~ebjdVS}XEH;Femz|9FOXS1rQ{aajit_5Pllfq0#5H>EYU)uedPMo zmne8P5BE0Yip9UtjE;`hmPUX&>Pyocdhx6$N%68PS^3en`p1ixV{GN*IuqsNFIj0J zXw@wWNLkR*;sG~7TjuNhIZLZ0v$Hbdx;GsJhb$(!p}F}%V@(dszo9|GC=!h1?%MdL z@{1Tl?O+G;0Lv)844Vzwa70BJRI_}vs5cxqerDztk*~xA1nosO#)<{|8*PHmcnGsR zDNv}pH+!UlO-xLN^3BXrns(Q!@Rd{5Vh1G#td~Yhi$TZB9e}9=ec81`hB;^#d!ogB z3kn`3YJz3G%BXbxm|OrfE-06kvGOsMCsk%K0-2qt;@}Kqc(#P{<9(?B;m`+fUj5CM z3FAtI#f5WOX15w~Px%dOTasxdm@XNCy=p&0=!StpwMUmZA0!zN^d`#JRZyV88vHx8 z4S@jxu{?7N3rT9D#&V&Y#&L~?V5U133vmViCswnq;qp%j6erl-?#ai!b978s&tHMX zU#J^%SWJbJZ13O@s*@@#EZi8#%$S?5SNYVV9z?KpMdsrlEVP|A99ByvSs(% zX`68H8zKaOY1-v!p}I=xTKrEUcmxErdh#+e-*m=!lsv<-9F zw7!OsH|pU63);3Hy4L|Eo&5cXuau_o#?}VT%*e_}F)vz%S&gYHIG> zy<1;lSPpx~UHe!929K%DHf#e=Ioel#ZhiSa#)R01^4YJ0af-FA`Fi!9`1=IqW;WJd zgEk=Le>sBsPI_3bkRbd11Id@qpFf9>oW!jq7OB~IIwMD5G;!zcH*7qk(GvTWl@*6) z=)Frew?Se2`Y19tGn1#+K!htNn{++==TAPP?z`b9$L_1NKN|G*oI*fwGAsey$VG$9 zDnt`>FK$mY5EDzHg>@}(oWbQ2>gvzb1%1=a^5XaT3-``%6(z2g|E9m7qDu4Nq7M`c zqJ;b%K3G^;Mc;DIc-=wcE*w=ZlAuWSGEJl&Q9|vToAdHSQQHc!_l2mUlsxqGAxM`o@bQmzhmQlMy4Y~ld~<7;IV^X5uzxYJHi-+=5mh& zH}R#LU7SkB=BD)%I?#%o2FOW$7fti@tGG8BeLm^M>!gK&p&_h`7Z(n!k>CtU6Poh* zlS{^0f_f#1F$ZN7D+=f2vUyP@JzUDI@3!!k%12>(;Vp-SuPk<%#KO{HT;76g$X#@& z!h*%c#LTf08g(Z5`X$0T+zNVC^EJ`oTZDkK2{h*56e*WF*eD(>^dytqjuiE|xwkg{BvCV3^zz5>AOs)% zas=da7ff(>ndLO@g$DX9HE4K^nZJFqd_3r(^g0z$OFgx4_2r<;3yO=SmI3qZ?e1P*Ujp0Zlb&HV zCeV`Zy7u=^a#`8yj^CdOXV%ut6)`G?NjV~_m8FeUAMp=K#1WI`y_A)e1=#MA{X$Ag z3P}E;>yalZtJc=m_V)J0g1?}HkHGrK6~ksSDyMai6~24I31;FakIe$yujKN^Y+H8p zi1AMWXSE)eoe{gsPPVE0*dfRYYE_Mmod75XD@P)%XJ8P)YuBn1Z)#wE4w@ z6A{R&tz}eKQv(2{-bkvW+|{**F>!fm3HB|9Eay@p${DTg^zVWPfN7G@@^aT87R{R! z6tTYGDXt6`W?$|7Q&(pQKrQKJ514mt*P|XkQfRvjav2=RqzW*IzNZfSYkWX`NepaY zDVf#tV&dW?sf>G)a_v^NqP4GLG}dExG`eJ?l~<0JkHY4FS0Nd&6>c;xk zc#@s~i~*cgf@&q8C$v?YgSRz2f2?=-SqobpB;V^?cse|j` zce+V?2M6FDmTDAQcGgWzP5JrxfrqNPtw|-|vk5=>hJYMWv+wt(7qosm-578V>k4?` zF`F;cUUx=4!NM!Zg_C*V!Ug_!YeH9JK{e#Lp12T~C}7-qTJH?OILbqdeYJ9zBR~N$zLte0uqFWi?_UpOO$3t_0BAvZw_qLph*wda_aew-|JPdrHwN{e z!4(7rk)NH->%6}Sz%JJ7o1b3>FfxEzz|pY=++biq3NDg>^_;A*@P`F)u)}bz5-{jp zh2o$|For&Tra6QbeVt9G0(Qe6Q3nG91K_b1z~$h}fDfhjCV*P0tgK7}`p6{%TojPU zA1h5ikj7vr>84MYZ`Arym4gVu=;C5TL`1?*o`9Fp0hCCrR8Z*P1(|T3Eue4_N1P!b z>0@gvT*_`V=Z!y((xXVnz;;BVdCkKb*jihc0D=SuBP1e%g`xyJ#pR)VnFziC&>x_b zgDY)72=+kn0owiM@IY|^+N#11!50P|G&NxyB>YbCjl*zB*{eY=1%2!5OY^ZdMRv32G`WEd}E=x4LRJ zp*Xz^j|HeWOi|BoZEIuY;8+LXx=^?V3I@&;2-sini=oLbgF*tE-HHakX4Mx$T39v! zt-00J)f(k7vUh>o>jpzvQ6Y3cl?`LPE+qsmf{3pIh)ePoLK8qXOQR9k6mX9Lz5*Rp z0{-u|vyFg&06RN7c$`q@YJYrKI79k~hllHJe+C?2@Yo(izsf>_2*D5EY?*@KvH*{@ zG4pI|x)cUn;3N^gOY*fP>|t?X;Z;_x5;)7Irlx6WY3Z(b&Ab05CwlQ~ zi3$t>;NZiBbARt`fdi!!|D1xAm6cd^N#hX)5d=QT{iO%^2@d^t8XY5}h2%1=uWlFk zJyTOtKYtc;$Gys+m_$NCqW3KTLt_M&A{t>3z&BuYEooQR%3vs?ykQZ#udB9dTIhsFynA?$@#F){1YOg(DHmKGEFV47U$f#L>~Q zP=m#r7RXC1tj}P%CFJp$na-9GBF}?xyL11K=BgJyHWVq{P$o<2LAaftP(IE&##bTo6+z)vW`LDUE8 znjbb^yVza$5ra!~&fo@O&m;HBX7?XXM5(wT6eMP>LD+Xr{K4t_gdDyE?rcDxxdft` z)tg+M*SEG}Z@U#{P zZ+hgSPDGRY2Cr{>YipWitfWHktNy`$z@aa&Q0Y5D8nP$-8IR8yoejPaLI7%PWpn(q zZzNyCmK3bKh3wrxCKVy)GZjgfTIYTr|BGKOi>7n4xBp%)QeTDyT&_tCX)al|&^rA= ztPQG}jmRkAzlAvw3g#u8AzKg!NBgjmGnK$?K06Atz=QM9>jQQ$MaJ(H{ZmvkFM-j` z4%;@OJT7or*s?_uhF<7Wi`d$7>0f}K)5Q}eMd~ZSA9J(M?66GDoGGh4T?|rwFLDgA zqhtC_w$8&3LCmQ8cxZC59EXET7!f%nifTQ;wt{;=p$sCha|dglW5OvFhyQKA_$d(2 zND@h~KqE*1mBLJfp-J3qnr0I)ZZ;|f`#%|>>?McpjHl9r=qS`o05+!&!a*TlGs-vg zfWv?xXV_S|id_G@i4@Ew-NeNam7B3Gl(6XReJVx<9mQ&bZ~$3wxi&oOJY0 zu?gx6y68E26LShwZ*^~}>0;y?Sq#!*zJ2WM?0bx`INTW8$}JZQzK>BQ8Cj&qk8G7X60K-RTnQC^`#^hGF4rojk1ldMWDY9k6c%$Pb8oHTKzZA zAlBI_-P~m1D8Je-o{xALNxp(!ggI?`dFABfO#S$w>>MPQSYkch7|W>Ko2IRuCmphF zGMHo5Ra-SO^7Gs&7rR$%KHpjP5z9A{Cjh*ZS<*+myvoUPHC>>JtD--|8`|6LWa&4) zrX#a~dG6@GT7ea+s~-0CC?vkRb(f2)uaEDmwzud(4C+(7Dq}7{iCDH(*Hml zEDB&N8Qb5+o@6Xv%A<{Hj~_wu`2O;8TyIB9OzM27&t0@$?R=V_*v;nQhuDA$>pOSu zTre3faPDK-st1t?|s9?kC_1qaV-yN*Pe41KHmbk)j+vquO+_UNn=5fQuoe8@U+ zXutK5dCbvl^9y0DWZ;AFMTNU0CqPa})%mE~Eve*N=&Css{YblVQ{bk{%JAkr`B9fe zW_f9}{WPSy>uMvhlLtX*8f5%0KRDd9W>sD}Fe?jTcP^5sd3+T@FarDzheb~I2V5o! zSd)?b2XAY=6pi~rbyU8;DfA4V;j6rf=#chrKY#w*`t#@UjfY8Rzm}FdpNy6sY%kq= zxaT}2Sy1TAWp6p8lzNR>`}ptplX=?@PoB`893O1llOG-)mcC0kqqxWSVJx{!JKL8n z48w>})6z~Zu9m46yOc6qDGFjFWixF3dweuKlbverFX|n5@qEsk0Xdr~INZ8)&ktv} zO@OZ33ll@=wqK}=hSpKo?Q)iu>znE20?ykh3-ykxWyQd8Ec7IWjFdj&=5b*+2_1`( zNLrSjh~y7D955`5dy0S=)bW^qL4ic1v+eXC=X`W&>CrB`ZrR=h-UhVp3xXZHxPK6| zv*srd7aQNUyHc!6FB3Y`bB&2`=AVG@D8$Tr>BTesX@rzl>Z+wTH$02%WcKHlmiQcJ zn$xJ9_0Hrg#ad1axw@tg=EnL0!__MzxICEOHb)xR_E4HM#@CM@aFNhUeh<$u0o~e3 zdYKq-O0R|;RN8QrllCwcf19oe_EYiPXlqW+3{heng`^Jhl znbhN&KSa7DDaC$uABlrWc(n-}fM_WU82|bGl>T`*N1|u9Lw7K;*0?PE{6|e8_g6>C zS)G|y#|a^9AWWSL%Qt&cmvEvC9Mk5KGfp~b!PyPc@ zy_n5Rbl8yZn2UOe3Oinzeu(tUeItd%Ys@jeWMpL8&IijQLGSzLqA+$<=XJ8{0rTN7 zH^KlM9=V>V$63GeEH?&^b6~2$`v%t!0lGVPj_i6^YR{Gxt`2QNOS_vz>{O#Rg1g$cV=e0 zCg)9(Pu|m}pfQeJN;`~hzj@<{u)+<0g(Q`Z*)EyXJd(=`eXC=|`Q5F}&4(7phbbvc z$dSk}$EOq+zD`7wOL6mN+5Xb~p1ktjH**#5!Ds|_`xH6a4L$#8df^8n;kCE=I0!5d z8fVff<3s3O-^1O>uMrWoMc=z~a{B9hAs%h%wNJz!BF$woAp+KKUbp?zWtoYIOLp6? zuFcsbw(0u@2;VA1eUsOIU0MX)ou-wlHtR!i*=iI{=0Qitw})nuCpERTba&{JecO1r zxeJR56d*neRxH=3H$^e}6Odqk8s(Do8vdNSn4(guhW#xtqU>!?5?NRL4JJPf&>xS9 zk7v~^T-U$yZO?}ynR_9@>SVa=s4i3YWt|WIS8wN*pjb>~UchN{u8o);O~CThGtYD& z%P`+`WxA0p?h$CF>5B2H7j~<-)W>`lG$02(cz9bkF}`($o9)s-G&%nAaHej{LeG|6 z8d%Ds&sR*wGACW6rK!t~?BzOrz#&>5Iq1NmxGC>>zNx8;1 zN{{kpSgeX<&?m<#86tP#nQj~*`#XpjRTu;LXKKGEU=;NG>1TY(lz8IUn3$#hY{MZR ziZ&vm^}`Qxccgj~6_a1N<39ZvK5c2Q=HLJfgEx3)4o41YHf7-3^@ARtzi(I;%+-QQ zmr7BOe;yXd45kW)+H|DMnTuv3yw-aw0{dj-Ss1{Pk+njI?b_OIpSTJhU^1zO?ACM+ zvkm1A1T~AV-IEiMp~oF9vYDJ|u@|8VNeRfe^981+FC}F5VO(77@^Ci&yQaXHAXdpA z)%?y2J3Y$U(qX;7?X8@Z5qWaG$xBz0WfR6lMnh<{u}v10IUJ05FKY~t&=8hy8Zh|$ z`STH8JFc}01w{o;yt=hPE-vX`KMG^hi`A9!JEmzBDQp-6_3E;=Bk20?cUd}OkrY=- zD9P;qt?QT4SGu|~nbS1qqGsLITtTwkifCWH%=D#_T4tegjw!!VsrrZ8Gk;Qg50cV9H+Z*c(OWiiNyG>5rslQikmq!>mr!4J# zSu`&>ZF@}CDyFM(o@l50HI@J5YU%0W?E6E=W?5AY4qq|zidWp zq&PY9Mfz-32M6Jd!<#m&wA`DFKrQP4fjB7j4m_=<(2UaR#_7eV5V zy~}FieZx)X0gjLqlVl}1-tB*r#t%*B{%MfAYK3a+?(7@iLCEF4VyCTzDly-f?Sth( zvcCaM3r0%mD{GeJe}&fonwEZ)2RyvNL>=`m^HuuE=pVAdXF*G}joW+L8)D=19Gh~H zw`y7sn`wWP#sy`)9mvWwD*p4s+-fMtmf3X`T&~y0VWctr5~@rGzSpnOS?O8yIMTQi zP*PGtM6IxF#>N@r6RN&nJl`CybU=={p4F@s>qIZ#+hsOw9r+|jZjgYB!bbb}Yxp_6 zs%~GB0$*9@w(nU{Kj8PbeCuOd@?H6jdlSo#iG)ckY)7+RK1s`ey!hljanzYKV1a{e zQpo0^&+BRg!Ee!ABTrH$w&EN3f_5t#C&v%_9z&{$Nf;NmQ6`%EWE23fB)Z|=z5M9k zNs5WTH{{`Q0w8qPLf*)}2Bxh82~+dr8i!3X4;MNrZ|H0p^;{x`$Y!o_uR`wXXtCi} z580yws;yUlucL$xE6e$uHt#YrN*Or@vYPqin{PzAKEThrw;S=!Jx=Q(zlnLuawE}} zJzDq+y|c-V$yn={3o3&s@y#3BS|4X3QhN03k>53NV7kv2CeUA(!N<=oJ_djI%f_q~ z1%%Jc%qqNhAyL7TlyRGh`j3uB#@_?-6GuvF#0^T$qPr{p6`}8<#k_vqYPZ&A{`2Eu zmB_p4!CWvkg;#8s+W$P&&DJetILQiID|d z>QjKZRWw~aEn(U4ekDYA^*o3Spdx8|warF^C1_`HWT+zO#kf9=myZX#P;Y0RuWb7> zY*a5bFR$bH@28#j%Oir6>vqQC>FT>6Ln!u><3QHM(N+~KQYxyGSr6jEE8FuO(FzUU zFP43`)NhjX2KFXqN)Mu>g`&&uX9zeaF*dzNl?M2ATEo!R$WOqqZw$AGQb$5Jx+Z1&#vX zML9>INP(;T{E0YPPp@hN>EE*0Xf{@uZ9G=yT0^NmbdQ*>e`x5&@hdop3d`L=)avoy zWaBrmF902*bK%+>xg)Q*EU6iC7$k`_sJ^lgYJW$Hm{t`*LoKF zdVEW|5?+*Rm3rCmFW9S5Iim|jy%D;mq;(@EX1e^4CRcF(@5hTqqWcfa7fXmds_r|R}7lJjOh z)HEZPWK$kStPTb9x2_y&R?i1-QI448OZ?~0-Sv%) z4kR~>KUkR0M(`I-`~{E1*hpXDj<6!X%}?wNhUaHar;>GnMKkpKcN+9v`J&BV$4B?D zag$2aJ`|pC^b%mHBt%>ecHj0*9`qTMyVW5iEX2!5En7s3h4r!Mu@Od0 zH=Veqc=*s=xh4!y0~BiLR=3IRZUzhm!=wm=@b>`5Sli;>)G*FB!p~%}?@0YHf47%i zJ#w(~?Dmz5ESg3v7P8nDGO4E1TN`O_Z+MF&a4#GTVyK`D+42<4gWD|6v0p$=Q3tK4 zECGp+G+nYn=5GivFNbzz%W1WE0HZ*=u@(Nn&%;9P0L|9+vLh2 zNFh)XoXp7iII2`Jebl>NoLaIF@8@1xwHRkZ%Cq$#?|T0Z+?RMY-H`WM?Qhnyy{+qr;ZMG7vB~*kL}Z zzx8jD2p`%{R7ckNN}a^U#xEXZL9T6@n5g9Pr_1DX^Gs^#ObD^a)Ed_=`^H!qTyzfs zfj#>dWNYN$KrAgU$8Nhz1$kY?n!R{_X)s@=>Cx+Vz%4@NHwS@d$E^YO&fDpuiuiNEiwKDV%3!KG#?xyiw0PSb6xj{{Jo zIVk6)rh!2m!EZTtTxW;PUv%vr`C|@JMtm;oBAgc`Z#K8pe5Md&$>kp&kqTna&k#vi zPGCn&&4vvClQ&n2rRl;RnSwo{;C%l)XMI~K7oUP3z80U{myU>W_9syZ^aXX}W*}KB zr0)p0mRYutCyvDGih)0xh+`cKL=rrI@A!C@in^Mr&c~aKU6?alHr=A#b-ePUm`?)L zQdhLtyj-m5@rJKz_cMO}e4wfP;#pK^a`YifCxZmIHsGL1gbNA_FW=xme-O$a%r{}Y zQyCKzQ{Eb}1#WA4yd>lvGq`fOuuT+%V{oRwWJ!2}va9NCP)Si+&44hO=XwBRL0JAID1K}Bal�CK(ma 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 literal 0 HcmV?d00001 diff --git a/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_upwards.svg b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_upwards.svg new file mode 100644 index 000000000..e40df799c --- /dev/null +++ b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_upwards.svg @@ -0,0 +1,496 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + y + z + 1 + + 2 + + 3 + + 4 + + Water + + + + + + + + + diff --git a/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_upwards_with_19_regions_better.png b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_upwards_with_19_regions_better.png new file mode 100644 index 0000000000000000000000000000000000000000..821a7aa2836fa9ce4db106d19632b3e398ec7fce GIT binary patch literal 30670 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

x#BQV zz5V?_4ZsM&-0u53||M1Fqv=qqf& zh2Kk!J0JivS&_C=d;B|PY<&C*Lo_)#h|yb!@dQ3sdY#2ug1N;%eWRlqYHCbmSIyiH zJCi+M2t$`jU#46P?|w8S^^ijBp0-t0R1E96DU8Py3kG@qczrFM$-X{ev|cU_ z`*S5w=krC#D`}~S(-rOyu(Z=N3GhjyPAm#>k+Nf!+nR>q@5%AucAbZZyL-nbR4V_B zjwX9;yj$G(;q6^shF&|Zb}S)ho-EAExQ^BCJVTNCK{BLFH^eqeC-js$Wti>zQh3tG z=$)A7np=!Tl=M@r3wlPY*ot;6d*(Z4M1=8 z&wfCtZIF;0PzmBa5VjFa3XFcQC+a%W+UpYIWbm&LUF~!9AkD|nY=NiTn0@C@Dh8?g z_cRMd85st@4scWBXm{I(j5uEaYagserFIT#_JZhS6x{| zTf~16R~UZV&Gl($W2}pWI7%-k2M2&VX}HRnuagiR?YPmG>0o06@T!WKIii({iYnO(z|y{8c-RgVQN_%@+86~3kq=s}PXFGvU^x||X9a(R07B7#hF@-O=O=1r~C8bw>j z+GKakFrFv~5%q80wqpzQ%0s8{&*~eNZGT&#v}0R&G*jyq=kktBa%H?;FI7o`Q$x%x z{JMYh|CnXTGV4)j`i9Zefw~4ycd8tEZl@~^t&Dcw6S1f0@mCH)!UAqe{RiahTb~vD zK88W34+isU09Tiy7qSl^`C_&7(t?$B@_)57_4XL{pjc5omZ*~j(Nh&Ra-P4KCxU{f z+jFArufN=boLIf+X;v|gFMRF`fCG-vIQ;buQVB0Tj+n5$9qG)z>C@lD;A{bwp{G2T z*lDHuw_}ZcaFf>woJi7SHB@InNGH0tqz5GB^YvFSTgjq(zot0rgKgf7)LO)>UhXn; zmFIbe8@P2|?$T74$d{rbh(FK2SFbHPhw@lK&0BQJjT4TZxJ|M=RoWgnBp`K4hedv3 zdJBxbFHT6kRDU|&*Y}W#->Ic5v4r?EBOeI(rQH=#6Qj|Qk>%q(L-6Uf1i4Uwf?b8D zznLN9PfSO{W86`z=c!R|W9X>ZRa9#a`oY}7dRUVLj zx4{^y2&a$jO(Cm>=Mp5naWdD=Y4mXPV_ljmi}2Ax7P@{*5vW#u{a;!B#1}6-Hw0+tG1j!y^0l*F&?CqgAYf?A@{5jg9G?#+|z)Mn+K%fEWI=ep?(Ve6q;s!Vl zuI&il%TUOLjUwjb3){eJMPJDGMNVFJ_Rr4t_O8~}_I4Fe6&Dx7=5ob;xOx7qzV!5Y zT#Z-)b>_}j;`u@KWr*86wt+C}<6ELCxy_I`MD`Fkqht_w!S#%0bx;s;UiKYDcXDJm)< zCMG#%cx>pU_KO$L3$gwWe7pa}%W#SEJ7C~DH{a;)0sy_d7G+2bm1bvPJldl zFl68a9&i;Xg6gN~RiH%Q_;~x=791G_GA1QvdpkQjCp+rdJx_CynOI|lw@GtVdb**s zG`=0@MxbGQG3+33qa>lvw-P2GUu17HqrvybC7e9zG+FrP5Wzke8aY1%f|3raNz*US zfJ-xhkZ?OAGh%OHaa2Z8(xZs$fC}LZn9(Wx|oSRPrM7onA#kfD*5;wqew1W0(Jci1B zMeJO1VFAX~*te;>oA@6-+=zvRRYzMVStCk?tkf1O3k>bV0|dhOOK~xrEx{|Pe0uGC XWrcFc_LdRU{}D2hiV_84`ab^$xYCS| literal 0 HcmV?d00001 diff --git a/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_upwards_with_19_regions_even_better_final_chosen.png b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/setting_2D_crack_to_extend_to_3D_oriented_upwards_with_19_regions_even_better_final_chosen.png new file mode 100644 index 0000000000000000000000000000000000000000..b151804c39a30cdb21a337f28821ba1841421a66 GIT binary patch literal 30782 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 z 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 literal 0 HcmV?d00001 diff --git a/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/visualize_mesh_DX.cfg b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/visualize_mesh_DX.cfg new file mode 100644 index 000000000..26afbdf71 --- /dev/null +++ b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/visualize_mesh_DX.cfg @@ -0,0 +1,45 @@ +// +// time: Fri Sep 21 02:12:54 2018 +// +// version: 3.2.0 (format), 4.4.4 (DX) +// +// +// panel[0]: position = (0.0750,0.6981), size = 0.2781x0.1611, startup = 1, devstyle = 1 +// title: value = Control Panel +// +// workspace: width = 500, height = 500 +// layout: snap = 0, width = 50, height = 50, align = NN +// +// panel[2]: position = (0.3609,0.6981), size = 0.2776x0.1611, startup = 1, devstyle = 1 +// title: value = Control Panel +// +// workspace: width = 500, height = 500 +// layout: snap = 0, width = 50, height = 50, align = NN +// +// node Image[2]: +// depth: value = 24 +// window: position = (0.1562,0.0426), size = 0.6641x0.8815 +// input[1]: defaulting = 0, value = "Image_2" +// input[4]: defaulting = 0, value = 1 +// input[5]: defaulting = 0, value = [0.025 0.025 0.0425] +// input[6]: defaulting = 0, value = [0.0943607 -0.252846 0.0756326] +// input[7]: defaulting = 0, value = 0.154491 +// input[8]: defaulting = 0, value = 1261 +// input[9]: defaulting = 0, value = 0.722839 +// input[10]: defaulting = 0, value = [0.0387653 0.127856 0.991035] +// input[11]: defaulting = 1, value = 30.0001 +// input[12]: defaulting = 0, value = 0 +// input[14]: defaulting = 0, value = 1 +// input[15]: defaulting = 0, value = "none" +// input[16]: defaulting = 0, value = "none" +// input[17]: defaulting = 0, value = 1 +// input[18]: defaulting = 0, value = 1 +// input[19]: defaulting = 0, value = 1 +// input[22]: defaulting = 0, value = "black" +// input[25]: defaulting = 0, value = "/home/latychev/boo" +// input[26]: defaulting = 0, value = "eps gray dpi=86 orient=portrait" +// input[29]: defaulting = 0, value = 0 +// input[33]: defaulting = 0, value = 1 +// input[36]: defaulting = 0, value = 1 +// input[41]: defaulting = 0, value = "rotate" +// internal caching: 1 diff --git a/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/visualize_mesh_DX.net b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/visualize_mesh_DX.net new file mode 100644 index 000000000..9cd10ae65 --- /dev/null +++ b/utils/mesher_analytical_Dimitri_for_2D_and_3D_cracks/visualize_mesh_DX.net @@ -0,0 +1,538 @@ +// +// time: Fri Sep 21 02:12:54 2018 +// +// version: 3.2.0 (format), 4.4.4 (DX) +// +// +// MODULE main +// workspace: width = 393, height = 599 +// layout: snap = 0, width = 50, height = 50, align = NN +// +macro main( +) -> ( +) { + // + // node AmbientLight[1]: x = 303, y = 277, inputs = 1, label = AmbientLight + // +main_AmbientLight_1_out_1 = + AmbientLight( + main_AmbientLight_1_in_1 + ) [instance: 1, cache: 1]; + // + // node Import[2]: x = 193, y = 42, inputs = 6, label = Import + // input[1]: defaulting = 0, visible = 1, type = 32, value = "DX_fullmesh.dx" + // input[3]: defaulting = 0, visible = 1, type = 32, value = "dx" + // +main_Import_2_out_1 = + Import( + main_Import_2_in_1, + main_Import_2_in_2, + main_Import_2_in_3, + main_Import_2_in_4, + main_Import_2_in_5, + main_Import_2_in_6 + ) [instance: 2, cache: 1]; + // + // node AutoColor[1]: x = 178, y = 167, inputs = 10, label = AutoColor + // +main_AutoColor_1_out_1, +main_AutoColor_1_out_2 = + AutoColor( + main_Import_2_out_1, + main_AutoColor_1_in_2, + main_AutoColor_1_in_3, + main_AutoColor_1_in_4, + main_AutoColor_1_in_5, + main_AutoColor_1_in_6, + main_AutoColor_1_in_7, + main_AutoColor_1_in_8, + main_AutoColor_1_in_9, + main_AutoColor_1_in_10 + ) [instance: 1, cache: 1]; + // + // node ShowConnections[1]: x = 49, y = 315, inputs = 1, label = ShowConnections + // +main_ShowConnections_1_out_1 = + ShowConnections( + main_AutoColor_1_out_1 + ) [instance: 1, cache: 1]; + // + // node Collect[1]: x = 167, y = 429, inputs = 4, label = Collect + // +main_Collect_1_out_1 = + Collect( + main_ShowConnections_1_out_1, + main_AutoColor_1_out_1, + main_AmbientLight_1_out_1, + main_Collect_1_in_4 + ) [instance: 1, cache: 1]; + // + // node Image[2]: x = 192, y = 540, inputs = 49, label = Image + // input[1]: defaulting = 0, visible = 0, type = 67108863, value = "Image_2" + // input[4]: defaulting = 0, visible = 0, type = 1, value = 1 + // input[5]: defaulting = 0, visible = 0, type = 8, value = [0.025 0.025 0.0425] + // input[6]: defaulting = 0, visible = 0, type = 8, value = [0.0943607 -0.252846 0.0756326] + // input[7]: defaulting = 0, visible = 0, type = 5, value = 0.154491 + // input[8]: defaulting = 0, visible = 0, type = 1, value = 1261 + // input[9]: defaulting = 0, visible = 0, type = 5, value = 0.722839 + // input[10]: defaulting = 0, visible = 0, type = 8, value = [0.0387653 0.127856 0.991035] + // input[11]: defaulting = 1, visible = 0, type = 5, value = 30.0001 + // input[12]: defaulting = 0, visible = 0, type = 1, value = 0 + // input[14]: defaulting = 0, visible = 0, type = 1, value = 1 + // input[15]: defaulting = 0, visible = 0, type = 32, value = "none" + // input[16]: defaulting = 0, visible = 0, type = 32, value = "none" + // input[17]: defaulting = 0, visible = 0, type = 1, value = 1 + // input[18]: defaulting = 0, visible = 0, type = 1, value = 1 + // input[19]: defaulting = 0, visible = 0, type = 1, value = 1 + // input[22]: defaulting = 0, visible = 0, type = 32, value = "black" + // input[25]: defaulting = 0, visible = 0, type = 32, value = "/home/latychev/boo" + // input[26]: defaulting = 0, visible = 0, type = 32, value = "eps gray dpi=86 orient=portrait" + // input[29]: defaulting = 0, visible = 0, type = 3, value = 0 + // input[33]: defaulting = 0, visible = 0, type = 3, value = 1 + // input[36]: defaulting = 0, visible = 0, type = 3, value = 1 + // input[41]: defaulting = 0, visible = 0, type = 32, value = "rotate" + // depth: value = 24 + // window: position = (0.1562,0.0426), size = 0.6641x0.8815 + // internal caching: 1 + // +main_Image_2_out_1, +main_Image_2_out_2, +main_Image_2_out_3 = + Image( + main_Image_2_in_1, + main_Collect_1_out_1, + main_Image_2_in_3, + main_Image_2_in_4, + main_Image_2_in_5, + main_Image_2_in_6, + main_Image_2_in_7, + main_Image_2_in_8, + main_Image_2_in_9, + main_Image_2_in_10, + main_Image_2_in_11, + main_Image_2_in_12, + main_Image_2_in_13, + main_Image_2_in_14, + main_Image_2_in_15, + main_Image_2_in_16, + main_Image_2_in_17, + main_Image_2_in_18, + main_Image_2_in_19, + main_Image_2_in_20, + main_Image_2_in_21, + main_Image_2_in_22, + main_Image_2_in_23, + main_Image_2_in_24, + main_Image_2_in_25, + main_Image_2_in_26, + main_Image_2_in_27, + main_Image_2_in_28, + main_Image_2_in_29, + main_Image_2_in_30, + main_Image_2_in_31, + main_Image_2_in_32, + main_Image_2_in_33, + main_Image_2_in_34, + main_Image_2_in_35, + main_Image_2_in_36, + main_Image_2_in_37, + main_Image_2_in_38, + main_Image_2_in_39, + main_Image_2_in_40, + main_Image_2_in_41, + main_Image_2_in_42, + main_Image_2_in_43, + main_Image_2_in_44, + main_Image_2_in_45, + main_Image_2_in_46, + main_Image_2_in_47, + main_Image_2_in_48, + main_Image_2_in_49 + ) [instance: 2, cache: 1]; +// network: end of macro body +CacheScene(main_Image_2_in_1, main_Image_2_out_1, main_Image_2_out_2); +} +main_AmbientLight_1_in_1 = NULL; +main_AmbientLight_1_out_1 = NULL; +main_Import_2_in_1 = "DX_fullmesh.dx"; +main_Import_2_in_2 = NULL; +main_Import_2_in_3 = "dx"; +main_Import_2_in_4 = NULL; +main_Import_2_in_5 = NULL; +main_Import_2_in_6 = NULL; +main_Import_2_out_1 = NULL; +main_AutoColor_1_in_2 = NULL; +main_AutoColor_1_in_3 = NULL; +main_AutoColor_1_in_4 = NULL; +main_AutoColor_1_in_5 = NULL; +main_AutoColor_1_in_6 = NULL; +main_AutoColor_1_in_7 = NULL; +main_AutoColor_1_in_8 = NULL; +main_AutoColor_1_in_9 = NULL; +main_AutoColor_1_in_10 = NULL; +main_AutoColor_1_out_1 = NULL; +main_ShowConnections_1_out_1 = NULL; +main_Collect_1_in_4 = NULL; +main_Collect_1_out_1 = NULL; +macro Image( + id, + object, + where, + useVector, + to, + from, + width, + resolution, + aspect, + up, + viewAngle, + perspective, + options, + buttonState = 1, + buttonUpApprox = "none", + buttonDownApprox = "none", + buttonUpDensity = 1, + buttonDownDensity = 1, + renderMode = 0, + defaultCamera, + reset, + backgroundColor, + throttle, + RECenable = 0, + RECfile, + RECformat, + RECresolution, + RECaspect, + AAenable = 0, + AAlabels, + AAticks, + AAcorners, + AAframe, + AAadjust, + AAcursor, + AAgrid, + AAcolors, + AAannotation, + AAlabelscale, + AAfont, + interactionMode, + title, + AAxTickLocs, + AAyTickLocs, + AAzTickLocs, + AAxTickLabels, + AAyTickLabels, + AAzTickLabels, + webOptions) -> ( + object, + camera, + where) +{ + ImageMessage( + id, + backgroundColor, + throttle, + RECenable, + RECfile, + RECformat, + RECresolution, + RECaspect, + AAenable, + AAlabels, + AAticks, + AAcorners, + AAframe, + AAadjust, + AAcursor, + AAgrid, + AAcolors, + AAannotation, + AAlabelscale, + AAfont, + AAxTickLocs, + AAyTickLocs, + AAzTickLocs, + AAxTickLabels, + AAyTickLabels, + AAzTickLabels, + interactionMode, + title, + renderMode, + buttonUpApprox, + buttonDownApprox, + buttonUpDensity, + buttonDownDensity) [instance: 1, cache: 1]; + autoCamera = + AutoCamera( + object, + "front", + object, + resolution, + aspect, + [0,1,0], + perspective, + viewAngle, + backgroundColor) [instance: 1, cache: 1]; + realCamera = + Camera( + to, + from, + width, + resolution, + aspect, + up, + perspective, + viewAngle, + backgroundColor) [instance: 1, cache: 1]; + coloredDefaultCamera = + UpdateCamera(defaultCamera, + background=backgroundColor) [instance: 1, cache: 1]; + nullDefaultCamera = + Inquire(defaultCamera, + "is null + 1") [instance: 1, cache: 1]; + resetCamera = + Switch( + nullDefaultCamera, + coloredDefaultCamera, + autoCamera) [instance: 1, cache: 1]; + resetNull = + Inquire( + reset, + "is null + 1") [instance: 2, cache: 1]; + reset = + Switch( + resetNull, + reset, + 0) [instance: 2, cache: 1]; + whichCamera = + Compute( + "($0 != 0 || $1 == 0) ? 1 : 2", + reset, + useVector) [instance: 1, cache: 1]; + camera = Switch( + whichCamera, + resetCamera, + realCamera) [instance: 3, cache: 1]; + AAobject = + AutoAxes( + object, + camera, + AAlabels, + AAticks, + AAcorners, + AAframe, + AAadjust, + AAcursor, + AAgrid, + AAcolors, + AAannotation, + AAlabelscale, + AAfont, + AAxTickLocs, + AAyTickLocs, + AAzTickLocs, + AAxTickLabels, + AAyTickLabels, + AAzTickLabels) [instance: 1, cache: 1]; + switchAAenable = Compute("$0+1", + AAenable) [instance: 2, cache: 1]; + object = Switch( + switchAAenable, + object, + AAobject) [instance:4, cache: 1]; + SWapproximation_options = + Switch( + buttonState, + buttonUpApprox, + buttonDownApprox) [instance: 5, cache: 1]; + SWdensity_options = + Switch( + buttonState, + buttonUpDensity, + buttonDownDensity) [instance: 6, cache: 1]; + HWapproximation_options = + Format( + "%s,%s", + buttonDownApprox, + buttonUpApprox) [instance: 1, cache: 1]; + HWdensity_options = + Format( + "%d,%d", + buttonDownDensity, + buttonUpDensity) [instance: 2, cache: 1]; + switchRenderMode = Compute( + "$0+1", + renderMode) [instance: 3, cache: 1]; + approximation_options = Switch( + switchRenderMode, + SWapproximation_options, + HWapproximation_options) [instance: 7, cache: 1]; + density_options = Switch( + switchRenderMode, + SWdensity_options, + HWdensity_options) [instance: 8, cache: 1]; + renderModeString = Switch( + switchRenderMode, + "software", + "hardware")[instance: 9, cache: 1]; + object_tag = Inquire( + object, + "object tag")[instance: 3, cache: 1]; + annoted_object = + Options( + object, + "send boxes", + 0, + "cache", + 1, + "object tag", + object_tag, + "ddcamera", + whichCamera, + "rendering approximation", + approximation_options, + "render every", + density_options, + "button state", + buttonState, + "rendering mode", + renderModeString) [instance: 1, cache: 1]; + RECresNull = + Inquire( + RECresolution, + "is null + 1") [instance: 4, cache: 1]; + ImageResolution = + Inquire( + camera, + "camera resolution") [instance: 5, cache: 1]; + RECresolution = + Switch( + RECresNull, + RECresolution, + ImageResolution) [instance: 10, cache: 1]; + RECaspectNull = + Inquire( + RECaspect, + "is null + 1") [instance: 6, cache: 1]; + ImageAspect = + Inquire( + camera, + "camera aspect") [instance: 7, cache: 1]; + RECaspect = + Switch( + RECaspectNull, + RECaspect, + ImageAspect) [instance: 11, cache: 1]; + switchRECenable = Compute( + "$0 == 0 ? 1 : (($2 == $3) && ($4 == $5)) ? ($1 == 1 ? 2 : 3) : 4", + RECenable, + switchRenderMode, + RECresolution, + ImageResolution, + RECaspect, + ImageAspect) [instance: 4, cache: 1]; + NoRECobject, RECNoRerenderObject, RECNoRerHW, RECRerenderObject = Route(switchRECenable, annoted_object); + Display( + NoRECobject, + camera, + where, + throttle) [instance: 1, cache: 1]; + image = + Render( + RECNoRerenderObject, + camera) [instance: 1, cache: 1]; + Display( + image, + NULL, + where, + throttle) [instance: 2, cache: 1]; + WriteImage( + image, + RECfile, + RECformat) [instance: 1, cache: 1]; + rec_where = Display( + RECNoRerHW, + camera, + where, + throttle) [instance: 1, cache: 0]; + rec_image = ReadImageWindow( + rec_where) [instance: 1, cache: 1]; + WriteImage( + rec_image, + RECfile, + RECformat) [instance: 1, cache: 1]; + RECupdateCamera = + UpdateCamera( + camera, + resolution=RECresolution, + aspect=RECaspect) [instance: 2, cache: 1]; + Display( + RECRerenderObject, + camera, + where, + throttle) [instance: 1, cache: 1]; + RECRerenderObject = + ScaleScreen( + RECRerenderObject, + NULL, + RECresolution, + camera) [instance: 1, cache: 1]; + image = + Render( + RECRerenderObject, + RECupdateCamera) [instance: 2, cache: 1]; + WriteImage( + image, + RECfile, + RECformat) [instance: 2, cache: 1]; +} +main_Image_2_in_1 = "Image_2"; +main_Image_2_in_3 = "X24,,"; +main_Image_2_in_4 = 1; +main_Image_2_in_5 = [0.025 0.025 0.0425]; +main_Image_2_in_6 = [0.0943607 -0.252846 0.0756326]; +main_Image_2_in_7 = 0.154491; +main_Image_2_in_8 = 1261; +main_Image_2_in_9 = 0.722839; +main_Image_2_in_10 = [0.0387653 0.127856 0.991035]; +main_Image_2_in_11 = NULL; +main_Image_2_in_12 = 0; +main_Image_2_in_13 = NULL; +main_Image_2_in_14 = 1; +main_Image_2_in_15 = "none"; +main_Image_2_in_16 = "none"; +main_Image_2_in_17 = 1; +main_Image_2_in_18 = 1; +main_Image_2_in_19 = 1; +main_Image_2_in_20 = NULL; +main_Image_2_in_21 = NULL; +main_Image_2_in_22 = "black"; +main_Image_2_in_23 = NULL; +main_Image_2_in_25 = "/home/latychev/boo"; +main_Image_2_in_26 = "eps gray dpi=86 orient=portrait"; +main_Image_2_in_27 = NULL; +main_Image_2_in_28 = NULL; +main_Image_2_in_29 = 0; +main_Image_2_in_30 = NULL; +main_Image_2_in_31 = NULL; +main_Image_2_in_32 = NULL; +main_Image_2_in_33 = 1; +main_Image_2_in_34 = NULL; +main_Image_2_in_35 = NULL; +main_Image_2_in_36 = 1; +main_Image_2_in_37 = NULL; +main_Image_2_in_38 = NULL; +main_Image_2_in_39 = NULL; +main_Image_2_in_40 = NULL; +main_Image_2_in_41 = "rotate"; +main_Image_2_in_42 = NULL; +main_Image_2_in_43 = NULL; +main_Image_2_in_44 = NULL; +main_Image_2_in_45 = NULL; +main_Image_2_in_46 = NULL; +main_Image_2_in_47 = NULL; +main_Image_2_in_48 = NULL; +main_Image_2_in_49 = NULL; +Executive("product version 4 4 4"); +$sync +main();